Git - bagaimana menemukan komit pertama dari cabang tertentu

93

Dalam pohon contoh berikut:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

Saya mencari F - komit pertama di cabang xxx. Saya pikir itu mungkin dengan:

git log xxx --not master

dan komit terakhir yang terdaftar harus F. Apakah itu solusi yang benar atau mungkin ada beberapa kelemahannya?

Saya tahu bahwa ada pertanyaan serupa tentang stackoverflow, tetapi tidak ada yang mengusulkan solusi seperti itu, dan saya tidak yakin apakah saya melakukannya dengan benar.

pengguna2699113
sumber
Kemungkinan duplikat stackoverflow.com/questions/6058308/…
nyzm

Jawaban:

111
git log master..branch --oneline | tail -1

Di mana "cabang" adalah nama cabang spesifik Anda. Titik-titik memberi Anda semua komit yang tidak dimiliki oleh cabang itu. tail -1mengembalikan baris terakhir dari keluaran sebelumnya.

konyak
sumber
3
ini hanya bekerja jika `branch`ʻ ada. Bagaimana Anda melakukannya jika cabang dihapus?
Oz123
2
Cabang @ Oz123 dapat diganti dengan referensi apa pun, seperti HEAD atau sha1 atau tag. Tapi jelas Anda membutuhkan semacam referensi.
Zitrax
3
Tidak memberi saya apa yang saya harapkan. Cabang saya (yang lama) sudah digabungkan kembali ke master, yang berarti semua commit di xxx sudah ada di master. Tetap saja - saya perlu tahu komit mana yang ADALAH yang pertama di cabang itu - atau sebenarnya - saya perlu memeriksa riwayat komit dari cabang itu saja - saya tidak peduli apakah komit itu ada di master atau tidak.
Motti Shneor
1
@MottiShneor bergantung pada cara Anda menggabungkan, itu bisa jadi rumit. Jika Anda melakukan percepatan maju, seolah-olah cabang tersebut tidak pernah ada. Jika tidak, Anda mungkin tertarik dengan jawaban ini , yang mencantumkan sejumlah cara untuk menemukan titik cabang. Setelah Anda memiliki titik cabang, SHA dapat menggantikannya master, dan selama cabang Anda belum dihapus, git log <sha>..branch --oneline | tail -1tetap akan memberikan hasil yang Anda cari.
ND Geek
1
Anda dapat menggunakan --reverseuntuk membaca log mundur dengan warna, dll.
Dominik
8

Anda harus menggunakan merge-basefungsionalitas yang dirancang untuk menyelesaikan persis seperti ini:

git merge-base remotes/origin/<branch> develop 
Fabrizio Stellato
sumber
Saya tidak berpikir ini akan berhasil jika Anda ingin kembali ke titik percabangan semula. Jika Anda menggabungkan develop menjadi <branch>, basis gabungan akan lebih baru dari titik percabangan asli.
Alexander Mills
5
Juga, ini tidak akan menunjuk ke F, tetapi ke komit di cabang master (meskipun sulit untuk dilihat dalam gambar OP, tampaknya B atau C).
RomainValeri
5
git cherry master -v | head -n 1
Nelu
sumber
1

Jika cabang Anda (yang lama) sekali lagi digabungkan kembali ke master tidak memberikan hasil yang diharapkan, saya telah menggunakan skrip python untuk menemukan ID komit cabang awal.

git rev-list --first-parent changeset

--first-parent hanya mengikuti perintah orang tua pertama setelah melihat komit gabungan.

Iterasi perubahan dari perintah di atas hingga cabang induk ditemukan.

def status_check(exec_command, exec_dir=None, background=False):
    if exec_dir:
        os.chdir(exec_dir)
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if not background:
        result = res.communicate()
    return result



def findNewBranchCommits(changeset=None):
    cmd = "git rev-list --first-parent "+ changeset
    rev_list = status_check(cmd,self.module_dir)
    rev_list = str(rev_list[0]).split('\n')
    rev_list = list(filter(None, rev_list))
    for x in rev_list:                      # Iterate until branch base point
        rev_cmd = "git branch --contains " + x
        rev_cmd = status_check(rev_cmd,self.module_dir)
        rev_cmd = str(rev_cmd[0]).split('\n')
        if(len(rev_cmd) > 2): 
            print "First Commit in xxx branch",x
            break

findNewBranchCommits(changeset)
Nayagam
sumber
0
git cherry master -v | tail -1   

namun ini hanya akan memberi Anda komit pertama pada cabang xxx yang tidak ada di master, bukan komit pertama pada cabang xxx yang pernah. yang terakhir akan sulit jika cabang xxx telah dihapus dan / atau dibuat ulang satu kali atau lebih. jika demikian, Anda dapat mencoba yang berikut:

git reflog | grep checkout | grep xxx | tail -1   
Doc Unid
sumber
3
Apakah Anda bermaksud menulis, head -n 1bukan tail -1? tail -1mengembalikan komit terbaru, bukan yang pertama.
Nelu
0

Saya mencoba perintah ini dan berhasil:

git log <source_branch> <feature_branch> --oneline | tail -1
Abderrahmen
sumber
-1

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1

wedens
sumber
Dalam repo saya ini menunjukkan komit pertama sejak penggabungan terakhir dari master ke cabang xxx, bukan komit pertama dari cabang xxx.
jk7