Bagaimana saya melihat perbedaan komit antara cabang di git?

341

Saya menggunakan X-branch dan telah menambahkan beberapa commit di atasnya. Saya ingin melihat semua perbedaan antara MASTER dan cabang yang saya ikuti dalam hal komitmen. Saya hanya bisa melakukan

git checkout master
git log

dan kemudian a

git checkout branch-X
git log

dan berbeda secara visual ini, tapi saya berharap untuk metode yang lebih mudah, kurang rawan kesalahan.

Avery
sumber

Jawaban:

324

Anda bisa mendapatkan hasil visual yang benar-benar bagus tentang perbedaan cabang Anda dengan ini

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X
tom
sumber
13
Itu tidak akan menunjukkan kepada Anda perbedaan antara cabang meskipun itulah yang diminta.
Pablo Fernandez heelhook
47
git log --oneline --graph --all --decorate --abbrev-commitakan memberi Anda hasil yang serupa dalam perintah yang lebih pendek / lebih mudah dibaca
Pablo Fernandez heelhook
4
Saya suka ini:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
Avery
6
Sangat rumit.
Shawn Erquhart
12
git log --oneline --graph --all --decoratesudah cukup, --abbrev-committidak diharuskan, --onelinekependekan dari--pretty=oneline --abbrev-commit
avmohan
720

Anda dapat melakukannya dengan mudah

git log master..branch-X

Itu akan menunjukkan Anda melakukan bahwa cabang-X memiliki tetapi master tidak.

Pablo Fernandez heelhook
sumber
9
Apakah ada opsi jika kedua cabang berisi komit sedangkan yang lain tidak? Saat ini, Anda harus membalik argumen dan menjalankannya dengan dua cara untuk melihat commit yang tidak dimiliki cabang lain.
Elliott Slaughter
38
Jika Anda sudah beralih ke branch-XAnda dapat menggunakangit log master..
Dave
8
@ElliottSlaughter: Jika Anda ingin menemukan komit yang berada di master atau branch-X tetapi tidak keduanya, Anda bisa menggunakan git log master...branch-X(tiga titik alih-alih dua). Lihat man gitrevisionsuntuk info lebih lanjut.
Xavier T.
3
Benar-benar hanya setengah jawabannya. Setiap komit master yang menyebabkan cabang-cabang menyimpang tidak akan muncul
jterm
9
Jika komit telah dipilih dari cabang-X untuk dikuasai ini tidak akan menyaringnya. Mereka masih akan berada dalam daftar komit "Di cabang-X tetapi tidak pada master" meskipun mereka sebenarnya di keduanya ..
Tuffwer
87

Saya pikir ini masalah pilihan dan konteks. Saya lebih suka menggunakan

git log origin/master..origin/develop --oneline --no-merges

Ini akan menampilkan komit dalam pengembangan yang tidak di cabang master.

Jika Anda ingin melihat file mana yang sebenarnya dimodifikasi gunakan

git diff --stat origin/master..origin/develop --no-merges

Jika Anda tidak menentukan argumen, itu akan menampilkan perbedaan penuh. Jika Anda ingin melihat perbedaan visual, instal melddi linux, atau WinMergedi windows. Pastikan mereka adalah difftools default. Kemudian gunakan sesuatu seperti

git difftool -y origin/master..origin/develop --no-merges

Jika Anda ingin membandingkannya dengan cabang saat ini. Lebih nyaman menggunakan HEAD daripada menggunakan nama cabang seperti use:

git fetch
git log origin/master..HEAD --oneline --no-merges

Ini akan menunjukkan kepada Anda semua komitmen, yang akan digabung

zainengineer
sumber
1
Jika Anda membandingkan cabang rilis yang mungkin memiliki gabungan. Anda dapat menghapus komit gabungan (yang tidak menambahkan nilai apa pun) dengan bantuan param --no-mergesseperti:git log origin/master..HEAD --oneline --no-merges
claudiu.f.marginean
15

Jika Anda menggunakan Linux, gitg harus melakukannya dengan sangat cepat dan grafis.

Jika Anda bersikeras pada baris perintah Anda dapat menggunakan:

git log --oneline --decorate

Agar git loglebih bagus secara default, saya biasanya mengatur preferensi global ini:

git config --global log.decorate true
git config --global log.abbrevCommit true
mvp
sumber
14

Saya sarankan yang berikut untuk melihat perbedaan "dalam komit". Untuk perbedaan simetris, ulangi perintah dengan argumen terbalik:

git cherry -v master [your branch, or HEAD as default]
mmaruska
sumber
Apakah ini berbeda dari git master..branch-X?
ilmirons
2
Tentu, "git cherry" cerdas: ia menerjemahkan dari "commit" ke "patches / diffs" dan dapat menghindari melaporkan "patch" yang ada di kedua cabang tetapi diterapkan dalam urutan yang berbeda.
mmaruska
8

jika Anda ingin menggunakan gitk:

gitk master..branch-X

ini memiliki GUi sekolah tua yang bagus

snowcamel
sumber
4

Bukan jawaban yang sempurna tetapi bekerja lebih baik untuk orang yang menggunakan Github:

masukkan deskripsi gambar di sini

Buka repo Anda: Insights -> Network

Langsung
sumber
Selain itu, membuat Permintaan Tarik juga akan menunjukkan perbedaan cabang.
pkamb
Ya Tuhan, aku ingin memelukmu.
esseara
@esseara Saya seorang pelukan besar juga :)) Anda dipersilakan: D
AI
2

Jika Anda ingin membandingkan berdasarkan pesan yang dikomit, Anda dapat melakukan hal berikut:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)
Maroun
sumber
1
Alih-alih menggunakan --onelinedan cutgit log --format='%s'
memipis
0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

Menyumbang ini karena memungkinkan a dan b log untuk dibedakan secara visual, berdampingan, jika Anda memiliki alat visual diff. Ganti perintah diff di akhir dengan perintah untuk memulai alat diff visual.

Kim Briggs
sumber
0

Saya menggunakan beberapa jawaban dan menemukan satu yang cocok dengan kasus saya (pastikan semua tugas ada di cabang rilis).

Metode lain juga berfungsi tetapi saya menemukan bahwa mereka mungkin menambahkan baris yang tidak saya butuhkan, seperti menggabungkan komit yang tidak menambah nilai.

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

atau Anda dapat membandingkan arus Anda dengan master

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch ada untuk memastikan Anda menggunakan info terbaru.

Dengan cara ini, setiap komit akan berada pada satu baris dan Anda dapat menyalin / menempelkannya ke dalam editor teks dan mulai membandingkan tugas-tugas dengan komit yang akan digabung.

claudiu.f.marginean
sumber