Bagaimana cara menentukan kapan cabang Git dibuat?


327

Apakah ada cara untuk menentukan kapan cabang Git dibuat? Saya memiliki cabang di repo saya dan dan saya tidak ingat membuatnya dan berpikir mungkin melihat cap waktu pembuatan akan menyita ingatan saya.


3
menemukan ini yang sangat membantu commandlinefu.com/commands/view/2345/…
Brendon-Van-Heyzen

1
Ketika Anda mengajukan pertanyaan ini, apakah Anda benar-benar hanya tertarik untuk mendapatkan tanggal dan waktu pembuatan cabang, atau apakah Anda juga tertarik mengetahui di mana dalam riwayat komit Anda cabang pertama kali dibuat, yaitu komit yang cabang Anda pertama kali bercabang dari?

3
@Cupcake, pertanyaannya cukup jelas. Saya tertarik ketika saya membuat cabang. Yang mengatakan mengetahui komit akan menjadi informasi yang berguna dalam kasus umum.
paxos1977

Jawaban:


151

Menggunakan

git show --summary `git merge-base foo master`

Jika Anda lebih suka melihatnya dalam konteks menggunakan gitk, maka gunakan

gitk --all --select-commit = `git merge-base foo master`

(Di mana foo adalah nama cabang yang Anda cari.)

Tangkapan layar


24
Untuk memperjelas jawabannya, ada dua langkah untuk proses ini. (1) dapatkan treesh menggunakan "git merge-base <branch> master" di mana cabang adalah cabang yang diminati. (2) Gunakan treesh sebagai input ke dalam git show untuk mendapatkan tanggal: "git show --summary <treesh>"
paxos1977

11
Jawaban ini tampaknya kecuali bahwa cabang telah dibuat dari master. Tetapi bagaimana jika itu tidak terjadi? Apakah ada cara untuk menemukan komit pertama cabang yang memiliki lebih dari 1 anak?
Manitra Andriamitondra

20
Ini bukan tanggal di mana cabang dibuat - ini adalah komit "percabangan".
Marco

44
Solusinya hanya akan bekerja jika 'cabang' tidak pernah digabungkan kembali ke 'master'. Apakah ada cara untuk menemukan basis gabungan pertama untuk dua cabang secara universal?
Ilya Ivanov

22
Ini menunjukkan basis gabungan, bukan pembuatan cabang.
Hedley

139

Seperti yang ditunjukkan dalam komentar dan jawaban Jackub , selama cabang Anda lebih muda dari jumlah hari yang ditetapkan dalam pengaturan konfigurasi gc.reflogexpire(defaultnya adalah 90 hari), maka Anda dapat menggunakan reflog Anda untuk mengetahui kapan referensi cabang dibuat pertama kali dibuat.

Catatan yang git reflogdapat mengambil sebagian besar git logbendera. Perhatikan lebih lanjut bahwa HEAD@{0}penyeleksi gaya secara efektif adalah pengertian waktu dan, pada kenyataannya, ditangani (dengan cara diretas) sebagai string tanggal. Ini artinya Anda dapat menggunakan flag --date=localdan mendapatkan output seperti ini:

$ git reflog --date = lokal
763008c HEAD @ {Fri 20 Agustus 10:09:18 2010}: pull: Maju cepat
f6cec0a HEAD @ {Sel 10 Agustus 09:37:55 2010}: pull: Maju cepat
e9e70bc KEPALA @ {Kamis 4 Feb 02:51:10 2010}: pull: Maju cepat
836f48c KEPALA @ {Kamis 21 Jan 14:08:14 2010}: checkout: pindah dari master ke master
836f48c HEAD @ {Thu 21 Jan 14:08:10 2010}: pull: Maju cepat
24bc734 HEAD @ {Rab 20 Jan 12:05:45 2010}: checkout: pindah dari 74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a HEAD @ {Rab 20 Jan 11:55:43 2010}: checkout: pindah dari master ke v2.6.31
24bc734 HEAD @ {Rab 20 Jan 11:44:42 2010}: pull: Maju cepat
964fe08 HEAD @ {Sen 26 Okt 15:29:29 2009}: checkout: pindah dari 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 
4a6908a KEPALA @ {Senin 26 Okt 14:52:12 2009}: checkout: pindah dari master ke v2.6.28

Mungkin juga berguna pada waktu untuk menggunakan --date=relative:

$ git reflog --date = relatif
763008c HEAD @ {4 minggu lalu}: pull: Maju cepat
f6cec0a HEAD @ {6 minggu lalu}: pull: Maju-cepat
e9e70bc HEAD @ {8 bulan lalu}: pull: Maju cepat
836f48c HEAD @ {8 bulan lalu}: checkout: pindah dari master ke master
836f48c HEAD @ {8 bulan lalu}: pull: Maju cepat
24bc734 HEAD @ {8 bulan lalu}: checkout: pindah dari 74fca6a42863ffacaf7ba6f1936a9f228950f657 untuk dikuasai
74fca6a HEAD @ {8 bulan lalu}: checkout: pindah dari master ke v2.6.31
24bc734 HEAD @ {8 bulan lalu}: pull: Maju cepat
964fe08 HEAD @ {11 bulan lalu}: checkout: pindah dari 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 untuk dikuasai
4a6908a HEAD @ {11 bulan lalu}: checkout: pindah dari master ke v2.6.28

Satu catatan terakhir: --allbendera (yang benar-benar merupakan bendera git-log yang dipahami oleh git-reflog) akan menunjukkan reflog untuk semua referensi yang dikenal di refs/(bukan hanya, HEAD) yang akan menunjukkan kepada Anda acara cabang dengan jelas:

git reflog --date = local --all
860e4e4 ref / kepala / master @ {Sun 19 Sep 23:00:30 2010}: commit: Kedua.
17695bc ref / kepala / example_branch @ {Senin 20 Sep 00:31:06 2010}: cabang: Dibuat dari HEAD

3
Sangat menarik. +1. Asalkan, tentu saja, ini terjadi dalam gc.reflogexpirebeberapa hari.
VonC

2
@VonC - benar Anda. Nilai default untuk gc.reflogexpire adalah 90 hari.
Aaron

1
Akhirnya! satu-satunya jawaban di mana git sendiri mengatakan: "branch: Created from HEAD". Sehingga "cabang" yang sulit dipahami dari git BISA dilacak hingga tanggal dan waktu pembuatannya ... Terima kasih, +1 penghargaan. Tapi bagaimana dengan hal gc.reflogexpire, dan bagaimana melakukan ini di cabang terpencil?
Motti Shneor

60

Pro Git § 3.1 Git Branching - Apa Cabang Apakah memiliki penjelasan yang baik tentang apa sebenarnya cabang git

Cabang di Git hanyalah sebuah pointer ringan yang dapat dipindahkan ke [a] commit.

Karena sebuah cabang hanyalah sebuah penunjuk yang ringan, git tidak memiliki gagasan eksplisit tentang sejarah atau tanggal pembuatannya. "Tapi tunggu dulu," Aku mendengar kamu berkata, "tentu saja git tahu sejarah cabang saya!" Yah, semacam itu.

Jika Anda menjalankan salah satu dari berikut ini:

git log <branch> --not master
gitk <branch> --not master

Anda akan melihat apa yang tampak seperti "sejarah cabang Anda", tetapi sebenarnya adalah daftar komitmen yang dapat dicapai dari 'cabang' yang tidak dapat dijangkau dari master. Ini memberi Anda informasi yang Anda inginkan, tetapi jika dan hanya jika Anda tidak pernah menggabungkan 'cabang' kembali ke master, dan tidak pernah menggabungkan master menjadi 'cabang' sejak Anda membuatnya. Jika Anda telah bergabung, maka riwayat perbedaan ini akan runtuh.

Untungnya reflog sering berisi informasi yang Anda inginkan, seperti dijelaskan dalam berbagai jawaban lain di sini. Gunakan ini:

git reflog --date=local <branch>

untuk menunjukkan sejarah cabang. Entri terakhir dalam daftar ini adalah (mungkin) titik di mana Anda membuat cabang.

Jika cabang telah dihapus maka 'cabang' bukan lagi pengenal git yang valid, tetapi Anda dapat menggunakan ini sebagai gantinya, yang mungkin menemukan apa yang Anda inginkan:

git reflog --date=local | grep <branch>

Atau di shell Windows cmd:

git reflog --date=local | find "<branch>"

Perhatikan bahwa reflog tidak akan bekerja secara efektif pada cabang-cabang jarak jauh, hanya yang Anda kerjakan secara lokal.


Hmm, saya belum yakin seberapa bermanfaat jawaban ini, saya harus mempelajarinya lebih lanjut. Namun, untuk apa nilainya, Anda pasti telah melakukan pekerjaan yang baik dalam upaya untuk menulis sesuatu yang komprehensif , dan bukan hanya jawaban parsial pendek dan malas, jadi itu pasti bagus. Juga, penting untuk dicatat bahwa Anda hanya dapat menggunakan reflog untuk ini selama cabang Anda tidak lebih dari gc.reflogexpirehari, sebagaimana ditunjukkan dalam jawaban dan jawaban ini .

4
Saya tidak ingin menduplikasi semua informasi bagus tentang reflog dari jawaban lain, tetapi dengan senang hati menambahkan gc.reflogexpire jika menurut Anda itu berguna. Jawaban saya dimaksudkan untuk (1) memberikan kejelasan lebih lanjut tentang apa itu cabang git dan mengapa "sejarah" -nya agak samar, (2) menempatkan perintah yang berguna di depan dan tengah, termasuk (3) menunjukkan komit pada cabang dan tidak menguasai dan (4) ambil reflog untuk cabang yang dihapus. Umpan balik.
yoyo

Terima kasih @Cupcake. Lucunya, awalnya saya memiliki kurung sudut di sekitar 'cabang' tapi itu menghilangkan seluruh kata dari pratinjau jawaban saya, jadi saya menganggap itu salah diperlakukan sebagai html inline (tidak valid).
yoyo

Metode ini bekerja dengan baik melalui intellij dan BitBucket git reflog --date=local <branch>
isaac weathers

41

Pertama, jika cabang Anda dibuat dalam gc.reflogexpirebeberapa hari (default 90 hari, yaitu sekitar 3 bulan), Anda dapat menggunakan git log -g <branch>atau git reflog show <branch>untuk menemukan entri pertama di reflog, yang akan menjadi acara pembuatan, dan terlihat seperti di bawah ini (untuk git log -g):

Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>

Anda akan mendapatkan siapa yang membuat cabang, berapa operasi yang lalu, dan dari cabang mana (yah, itu mungkin hanya "Created from HEAD", yang tidak banyak membantu).

Itulah yang dikatakan MikeSep dalam jawabannya .


Kedua, jika Anda memiliki cabang lebih lama dari gc.reflogexpiredan Anda telah menjalankan git gc(atau dijalankan secara otomatis), Anda harus menemukan leluhur bersama dengan cabang tempat cabang itu dibuat. Lihatlah file config, mungkin ada branch.<branchname>.mergeentri, yang akan memberi tahu Anda berdasarkan cabang apa ini.

Jika Anda tahu bahwa cabang yang dimaksud dibuat dari cabang master (bercabang dari cabang master), misalnya, Anda dapat menggunakan perintah berikut untuk melihat leluhur yang sama:

git show $(git merge-base <branch> master)

Anda juga bisa mencoba git show-branch <branch> master, sebagai alternatif.

Inilah yang dikatakan gbacon dalam jawabannya .


3
"git reflog show <branch>" berfungsi dengan baik, secara eksplisit menunjukkan kapan cabang dibuat. Treesh memberi makan ke "git show --summary <treesh>"
paxos1977

1
'Git log -g <branch>' adalah yang bekerja untuk saya - banyak detail. Perlu berada di cabang untuk menggunakan semua ini.
Lidia

18

Saya belum yakin dengan perintah git untuk itu, tapi saya pikir Anda dapat menemukannya di reflog.

.git/logs/refs/heads/<yourbranch>

File saya tampaknya memiliki cap waktu unix di dalamnya.

Pembaruan: Tampaknya ada opsi untuk menggunakan riwayat reflog alih-alih riwayat komit saat mencetak log:

git log -g

Anda dapat mengikuti log ini juga, kembali ke saat Anda membuat cabang. git logmenunjukkan tanggal komit, bukan tanggal ketika Anda membuat tindakan yang membuat entri di reflog. Saya belum menemukan itu kecuali dengan melihat reflog yang sebenarnya di jalan di atas.


12

Coba ini

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'

3
Anda mungkin perlu %sebelumnya(refname)
Vor

1
@Karena saya membuat perubahan
biniam

Saya menyalurkan ini melalui | cut -c 5- | sort -r |dan kemudian menyalurkan melalui grep untuk bulan itu, memberi saya urutan kronologis terbalik daftar, kurang lebih.
Noumenon

2
@Noumenon: untuk-masing-masing-ref dapat mengurutkan untuk Anda, dengan menambahkan misalnya --sort='-committerdate'(perhatikan '-' sebelum committerdate untuk urutan kronologis terbalik).
Pete

9

Menggunakan:

git reflog

untuk menampilkan semua siklus hidup repositori Anda di folder saat ini. Nama cabang yang pertama kali muncul (dari bawah ke atas) adalah sumber yang telah dibuat.

855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development

Itu berarti:

  • Pengembangan cabang dibuat (checkout -b) dari master

  • Fitur cabang-jira35 dibuat (checkout -b) dari pengembangan

  • Cabang fitur-jira-sut-46 dibuat (checkout -b) dari pengembangan


2
tapi dimana tanggalnya? dan Anda melihat check-out ke setiap cabang berkali-kali. Apakah ini berarti hanya kejadian PERTAMA setiap cabang adalah penciptaannya?
Motti Shneor

4

Ini adalah sesuatu yang saya buat sebelum saya menemukan utas ini.

git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'

3

Perintah ini menunjukkan tanggal dibuat cabang devdarimain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main

"tanggal cabang yang dibuat" ... jika kurang dari 90 hari. Jika itu dibuat lebih dari 90 hari, informasi itu akan dihapus. Seperti disebutkan di atas dalam stackoverflow.com/a/3748722/6309 .
VonC

@Sazzad Hissain Khan Yang ini bekerja untuk kami karena kami ingin memberikan 'tip-tip ramah-tipuan' kepada beberapa orang non-teknis yang sedikit tersesat dengan beberapa seluk beluk Git.
Chris22

2

Jika Anda ingin mendapatkan detail untuk semua cabang

for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done

2

Saya menemukan cara terbaik: Saya selalu memeriksa cabang terbaru yang dibuat dengan cara ini

git for-each-ref --sort=-committerdate refs/heads/

1

Dikombinasikan dengan jawaban dari Andrew Sohn ( https://stackoverflow.com/a/14265207/1929406 )

branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
echo $branchcreated

1

Ini berhasil untuk saya: (10 tahun kemudian)

git log [--remotes] --no-walk --decorate

Karena tidak ada informasi yang tersimpan pada waktu pembuatan cabang, yang dilakukan adalah menampilkan komit pertama dari masing-masing cabang ( --no-walk), yang mencakup tanggal komit. Menggunakan--remotes untuk cabang jarak jauh, atau hilangkan untuk cabang lokal.

Karena saya melakukan setidaknya satu komit di cabang sebelum membuat yang lain, ini memungkinkan saya melacak beberapa bulan kreasi cabang (dan mulai fitur dev) untuk keperluan dokumentasi.

sumber: AnoE di stackexchange


0

sintaksis: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

contoh: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

hasil: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.