Cara mendapatkan perubahan di cabang di Git

265

Apa cara terbaik untuk mendapatkan log komit pada cabang sejak saat itu bercabang dari cabang saat ini? Solusi saya sejauh ini adalah:

git log $(git merge-base HEAD branch)..branch

Dokumentasi untuk git-diff menunjukkan bahwa git diff A...Bitu setara dengan git diff $(git-merge-base A B) B. Di sisi lain, dokumentasi untuk git-rev-parse menunjukkan bahwa r1...r2didefinisikan sebagai r1 r2 --not $(git merge-base --all r1 r2).

Mengapa ini berbeda? Catatan yang git diff HEAD...branchmemberi saya diff yang saya inginkan, tetapi perintah git log yang sesuai memberi saya lebih dari yang saya inginkan.

Dalam gambar, anggap ini:

         x --- y --- z --- cabang
        /
--- a --- b --- c --- d --- e --- KEPALA

Saya ingin mendapatkan log yang berisi komit x, y, z.

  • git diff HEAD...branch berikan komitmen ini
  • Namun, git log HEAD...branchberi x, y, z, c, d, e.
Greg Hewgill
sumber
Anda menggunakan "git log" secara tidak benar untuk tujuan Anda dari apa yang dapat saya lihat. Saya telah menambahkan jawaban saya di bawah ini.
PlagueHammer

Jawaban:

186

Dalam konteks daftar revisi, A...Badalah bagaimana git-rev-parsemendefinisikannya. git-log mengambil daftar revisi. git-difftidak mengambil daftar revisi - dibutuhkan satu atau dua revisi, dan telah menetapkan A...Bsintaks untuk mengartikan bagaimana definisi itu didefinisikan dalam halaman git-diffmanual. Jika git-difftidak secara eksplisit mendefinisikan A...B, maka sintaks itu akan tidak valid. Perhatikan bahwa halaman git-rev-parsemanual dijelaskan A...Bdi bagian "Menentukan Rentang", dan segala sesuatu di bagian itu hanya valid dalam situasi di mana rentang revisi valid (yaitu ketika daftar revisi diinginkan).

Untuk mendapatkan log yang berisi hanya x, y, dan z, coba git log HEAD..branch(dua titik, bukan tiga). Ini identik dengan git log branch --not HEAD, dan berarti semua komit pada cabang yang tidak ada di HEAD.

Lily Ballard
sumber
31
Wow, itu membingungkan. Ternyata menggunakan "git diff HEAD..branch" menunjukkan semua commit (x, y, z, c, d, e), tetapi "git log HEAD..branch" melakukan apa yang saya inginkan dan hanya menampilkan x, y , z! Ini adalah kebalikan dari menggunakan "...".
Greg Hewgill
22
git diff HEAD..branchidentik dengan git diff HEAD branch. Hal utama yang perlu diingat di sini adalah bahwa log mengambil daftar / rentang revisi, sementara diff tidak. Itu sebabnya mereka memperlakukan argumen mereka secara berbeda.
Lily Ballard
4
Tampaknya git diff HEAD...branch(tiga titik) sesuai dengan outputgit log HEAD..branch
jchook
72
git cherry branch [newbranch]

melakukan persis apa yang Anda minta, ketika Anda berada di mastercabang.

Saya juga sangat suka:

git diff --name-status branch [newbranch]

Yang tidak persis apa yang Anda tanyakan, tetapi masih sangat berguna dalam konteks yang sama.

skiphoppy
sumber
8
'git cherry' menampilkan daftar ID komit. Dapatkah saya mengonversinya menjadi satu perbedaan yang menggabungkan semua perubahan di setiap komit?
Jonathan Hartley
1
git cherrymemang sangat berguna. Terima kasih :)
jkp
2
@JonathanHartley Ambil pertama dan terakhir seperti dari ID komit dan dilemparkan mereka ke gif-diff: git diff x..z, atau misalnya saya sendiri itu git diff 13bc4d..8eda3a.
towi
3
Sulit untuk memahami kode mana yang harus diganti dalam perintah Anda karena di mana salah satu cabang atau cabang baru adalah kata kunci dan yang harus diganti dengan nama cabang kustom
pal4life
37

Yang ingin Anda lihat adalah daftar komitmen keluar. Anda dapat melakukan ini menggunakan

git log master..branchName 

atau

git log master..branchName --oneline

Di mana saya berasumsi bahwa "branchName" telah dibuat sebagai cabang pelacakan "master".

Demikian pula, untuk melihat perubahan yang masuk Anda dapat menggunakan:

git log branchName..master
PlagueHammer
sumber
1
@ ABB, jika branchName dihilangkan, defaultnya adalah "head", yang secara efektif branchName dalam contoh di atas.
PlagueHammer
25

Ini mirip dengan jawaban yang saya posting di: Pratinjau dorongan Git

Masukkan fungsi-fungsi ini ke profil Bash Anda:

  • gbout - cabang git keluar
  • gbin - git cabang masuk

Anda bisa menggunakan ini seperti:

  • Jika di master: gbin branch1 <- ini akan menunjukkan kepada Anda apa yang ada di branch1 dan bukan di master
  • Jika di master: gbout branch1 <- ini akan menunjukkan kepada Anda apa yang ada di master yang tidak ada di cabang 1

Ini akan bekerja dengan cabang apa pun.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
Clintm
sumber
16

Mirip dengan beberapa jawaban seperti Alex V dan NDavis, tetapi tidak satupun dari mereka yang sama.

Saat sudah di cabang yang dimaksud

Menggunakan:

git diff master...

Yang menggabungkan beberapa fitur:

  • ini sangat pendek
  • menunjukkan perubahan yang sebenarnya

Memperbarui:

Ini mungkin seharusnya git diff master, tetapi juga ini menunjukkan diff, bukan komitmen seperti pertanyaan yang ditentukan.

Michael Durrant
sumber
2
Jika Anda git co master; git pullsejak Anda membuat cabang, git diff mastertidak akan banyak gunanya untuk membuat perbedaan HANYA diperkenalkan oleh komit di cabang yang ditentukan.
Persaingan
1
Atau untuk menentukan cabang secara eksplisit: git diff <branch1>...<branch2>akan menampilkan perubahan yang diperkenalkan oleh branch2.
Alex
10

Lempar a -p di sana untuk melihat beberapa PERUBAHAN FILE

git log -p master..branch

Buat beberapa alias:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

Lihat komitmen unik cabang:

gbl
Alex V
sumber
6

Untuk melihat log cabang saat ini sejak bercabang master:

git log master...

Jika saat ini Anda berada di master, untuk melihat log cabang lain karena bercabang master:

git log ...other-branch

NDavis
sumber
4
git log --cherry-mark --oneline from_branch...to_branch

(3dots) tetapi terkadang ini menunjukkan '+' bukannya '='

nopsoft
sumber
3 titik menunjukkan komit pertama di cabang dua kali sementara dua komit tidak.
TJ Biddle
2

saya menemukan

git diff <branch_with_changes> <branch_to_compare_to>

lebih berguna, karena Anda tidak hanya mendapatkan pesan komit tetapi juga seluruh perbedaan. Jika Anda sudah berada di cabang yang ingin Anda lihat perubahannya dan (misalnya) ingin melihat apa yang telah berubah menjadi master, Anda dapat menggunakan:

git diff HEAD master
Dominik Ehrenberg
sumber