Menampilkan file mana yang telah berubah di antara dua revisi

2105

Saya ingin menggabungkan dua cabang yang telah dipisahkan untuk sementara waktu dan ingin tahu file mana yang telah dimodifikasi.

Datang di tautan ini: http://linux.yyz.us/git-howto.html yang sangat berguna.

Alat untuk membandingkan cabang yang saya temui adalah:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Bertanya-tanya apakah ada sesuatu seperti "git status master..branch" untuk hanya melihat file-file yang berbeda antara dua cabang.

Tanpa membuat alat baru, saya pikir ini adalah yang terdekat yang bisa Anda lakukan sekarang (yang tentu saja akan menunjukkan pengulangan jika file diubah lebih dari sekali):

  • git diff master..branch | grep "^diff"

Bertanya-tanya apakah ada sesuatu yang saya lewatkan ...

Johannix
sumber
12
Berapa banyak orang yang menganggap bahwa judul pertanyaan ini menyesatkan? Ini sebenarnya tentang menemukan perbedaan file antara dua cabang. Apa yang saya datang ke sini mencari adalah bagaimana melihat perbedaan file antara dua revisi pada cabang yang sama. Atau hanya aku satu-satunya?
Sandeepan Nath
4
@SandeepanNath: dengan git tidak ada perbedaan. Anda SELALU mengacu pada komitmen individu.
Samuel O'Malley
@ SamuelO'Malley Saya baru mengenal git dan mempertimbangkan strategi percabangan yang tampaknya umum di mana semua cabang akhirnya digabungkan ke cabang master dan akhirnya master diluncurkan. Sekarang, mengingat peristiwa peluncuran, di mana produksi sudah di master, tetapi di belakang ujung (oleh satu revisi jika peluncuran terakhir terjadi setelah penggabungan master terakhir), saya ingin melihat perbedaan antara dua revisi ini, untuk cari tahu apa yang akan diluncurkan. Saya tidak ingin melihat cabang yang terakhir digabungkan. Koreksi saya jika saya salah.
Sandeepan Nath
2
@SandeepanNath: alih-alih menggunakan nama cabang maka Anda dapat mengambil jawaban di bawah ini dan cukup tentukan ID komit sebagai gantinya. Atau bahkan merujuk komit dengan nama tag mereka jika Anda membuat tag saat meluncurkan.
Samuel O'Malley
1
@SandeepanNath Anda tidak dapat membandingkan 2 cabang, Anda harus menentukan revisi. Jadi membandingkan 2 cabang berarti membandingkan 2 revisi.
Bastien Vandamme

Jawaban:

2575

Untuk membandingkan cabang saat ini dengan mastercabang:

$ git diff --name-status master

Untuk membandingkan dua cabang:

$ git diff --name-status firstbranch..yourBranchName

Baca terus git diffdi dokumentasi resmi .

JasonSmith
sumber
2
Apa arti dari masing-masing indeks di sisi kiri (saya melihat banyak M dan D)?
gogogadgetinternet
15
@ user446936 - Anda dapat melihat apa arti huruf-huruf itu di halaman manual status git @ kernel.org/pub/software/scm/git/docs/git-status.html - khususnya, M == dimodifikasi, D == dihapus
James Manning
12
git diff --name-status your_branch...mastermenampilkan perubahan yang terjadi pada master sejak your_branch dibuat darinya
Radu
1
Operator titik ganda berlebihan, di sini, karena diffs berpasangan.
jub0bs
2
Saya mendapatkan revisi atau jalur yang tidak dikenal di pohon yang berfungsi.
SuperUberDuper
408

Mencoba

$ git diff --stat --color master..branchName

Ini akan memberi Anda lebih banyak info tentang setiap perubahan, sementara masih menggunakan jumlah baris yang sama.

Anda juga dapat membalik cabang untuk mendapatkan gambar perbedaan yang lebih jelas jika Anda menggabungkannya dengan cara lain:

$ git diff --stat --color branchName..master
Gerry
sumber
77
Jika Anda telah (sangat disarankan, imho) warna git dihidupkan ( config --global color.ui true), Anda dapat melewati --color. (Saya memiliki lks - lazy keyboard syndrome.)
Seni Swri
25
Saya dengan Anda pada warna! BTW saya bermaksud mengatakan git config --global color.ui true- untuk menjadi lengkap.
Seni Swri
2
Tidak berfungsi, melempar kesalahan:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Reinstate Monica
7
@ TomášZato maaf, tetapi Anda harus menukar "branchName" dengan nama cabang Anda.
Gerry
161

Juga perlu diingat bahwa git memiliki percabangan yang murah dan mudah. Jika saya pikir penggabungan bisa bermasalah saya membuat cabang untuk penggabungan. Jadi jika masterada perubahan yang ingin saya gabungkan dan baadalah cabang saya yang membutuhkan kode dari master saya dapat melakukan hal berikut:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Hasil akhirnya adalah saya harus mencoba penggabungan pada cabang yang dibuang sebelum mengacaukan cabang saya. Jika saya membuat diri saya kusut, saya bisa menghapus ba-mergecabang dan memulai kembali.

Eric Anderson
sumber
4
Luar biasa. Saya tidak pernah berpikir untuk bercabang seperti itu. Saya pikir ini harus dianggap sebagai bagian dari "praktik terbaik" ketika bergabung.
egelev
Ketika Anda menggabungkan ba-marge kembali ke ba, tidak adakah potensi untuk memperbaiki konflik lagi?
Josef.B
2
@EricAnderson Benar, ini grafik. SVN menempel seperti permen karet di bawah meja sekolah. Terima kasih.
Josef.B
1
Mengapa Anda perlu melakukan langkah terakhir 'git merge master' jika ba-merge sudah memiliki master
qwebek
Anda bisa membiarkannya. Satu-satunya alasan itu akan berguna adalah jika barang baru masuk mastersaat Anda sedang bekerja meninjau kode dan memperbaiki konflik.
Eric Anderson
58

Jika ada yang mencoba membuat file diff dari dua cabang:

git diff master..otherbranch > myDiffFile.diff
Paulino III
sumber
2
Ini sangat berguna terutama dengan cabang-cabang besar yang mengandung banyak perbedaan.
vandsh
Ini berguna ketika perbedaannya sangat besar. Secara default itu tidak akan menampilkan semua diff di konsol (saya bertanya-tanya mengapa), melewati diff ke file adalah cara untuk pergi dalam kasus seperti itu.
rotimi-best
42

Ada juga metode berbasis GUI.

Anda bisa menggunakan gitk .

  1. Lari:

    $ gitk --all
    
  2. Klik kanan pada komit cabang dan pilih Tandai komit ini di menu pop-up.

  3. Klik kanan pada komit dari cabang lain dan pilih Diff ini -> komit ditandai atau Diff komit ditandai -> ini .

Kemudian akan ada daftar file yang diubah di panel kanan bawah dan detail diff di panel kiri bawah.

Yantao Xie
sumber
3
@Orwellophile Saya mengunggah video untuk menunjukkan bagaimana melakukannya. Saya harap ini akan membantu Anda.
Yantao Xie
Wow, hanya untukku, aku merasa istimewa. Saya telah menandai di delicious.com untuk referensi di masa mendatang dan tambahan google-foo.
Orwellophile
Jawaban yang sangat diremehkan. Terima kasih!
Koshinae
36

Satu lagi opsi, menggunakan berbaur dalam hal ini:

git difftool -d master otherbranch

Ini memungkinkan tidak hanya untuk melihat perbedaan antara file, tetapi juga menyediakan cara mudah untuk mengarahkan dan mengklik ke file tertentu.

rsilva4
sumber
6
Mungkin ingin menyetel meld sebagai diftool default: git config --global diff.tool meld
bwv549
1
Ini adalah favorit saya karena akan menggunakan difftool apa pun yang Anda konfigurasikan.
Josiah
Tidak didukung di OSX. :-(
Mike S.
@ Mike. silakan cek jawaban ini stackoverflow.com/a/12815806/151918 ini berisi instruksi untuk OSX. Setidaknya itu berfungsi untuk saya, semoga membantu.
rsilva4
Bagus. Tapi untuk apa -dpilihannya?
Scotty.NET
29

Perhatikan bahwa git membuatnya mudah untuk mencoba penggabungan dan mundur dari masalah jika Anda tidak menyukai hasilnya. Mungkin lebih mudah daripada mencari masalah potensial sebelumnya.

David Plumpton
sumber
10
David, itu adalah titik yang baik, meskipun itu akan baik untuk hanya tahu apa yang terjadi sebelum tangan ...
johannix
18

Dan jika Anda mencari perubahan hanya di antara file-file tertentu, maka:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 adalah opsional dan cabang Anda saat ini (cabang tempat Anda berada) akan dianggap default jika branch1 tidak disediakan. misalnya:

git diff master -- controller/index.js
Mannu
sumber
15

Ketika bekerja secara kolaboratif, atau pada beberapa fitur sekaligus, sudah umum bahwa upstream atau bahkan master Anda berisi pekerjaan yang tidak termasuk dalam cabang Anda, dan akan muncul secara tidak benar di diff dasar.

Jika Hulu Anda mungkin telah pindah, Anda harus melakukan ini:

git fetch
git diff origin/master...

Hanya menggunakan git diff master dapat memasukkan, atau gagal memasukkan, perubahan yang relevan.

Alex Brown
sumber
8

Ada dua cabang katakanlah

  • A (Cabang tempat Anda bekerja)
  • B (Cabang lain yang ingin Anda bandingkan)

Berada di cabang A Anda bisa mengetik

git diff --color B

maka ini akan memberi Anda output

masukkan deskripsi gambar di sini

Poin penting tentang ini adalah

  1. Teks berwarna hijau ada di dalam hadir di Cabang A

  2. Teks berwarna merah ada di Cabang B

selftaught91
sumber
8

Ada banyak jawaban di sini, tetapi saya ingin menambahkan sesuatu yang biasa saya gunakan. JIKA Anda berada di salah satu cabang yang ingin Anda bandingkan, saya biasanya melakukan salah satu dari yang berikut ini. Demi jawaban ini kami akan mengatakan bahwa kami berada di cabang sekunder kami. Tergantung pada tampilan apa yang Anda butuhkan pada saat itu akan tergantung pada yang Anda pilih, tetapi sebagian besar waktu saya menggunakan opsi kedua dari keduanya. Opsi pertama mungkin berguna jika Anda mencoba untuk kembali ke salinan asli - baik, keduanya menyelesaikan pekerjaan!

Ini akan membandingkan master dengan cabang tempat kita berada (yang sekunder) dan kode asli akan menjadi baris yang ditambahkan dan kode baru akan dianggap sebagai baris yang dihapus

git diff ..master

ATAU

Ini juga akan membandingkan master dengan cabang tempat kita berada (yang sekunder) dan kode asli akan menjadi baris lama dan kode baru akan menjadi baris baru

git diff master..
Sang Codator
sumber
1

Jika Anda menggunakan Github / Github Enterprise, Anda dapat menggunakan UI Web dengan menekan url /comparejalur repositori Anda, misalnya, https://github.com/http4s/http4s/compare . Anda dapat memilih cabang / komit / tag yang ingin Anda bandingkan: Github Membandingkan Tangkapan Layar

Dan diff akan ditampilkan dalam antarmuka github di url di /compare/{x1}...{x2}mana x2dan x1merupakan cabang / komit / tag yang ingin Anda bandingkan, misalnya: https://github.com/http4s/http4s/hompp4s/compare/release-0.18.x ...menguasai

Anda dapat melihat lebih banyak di Github Doc .

Valy Dia
sumber
0

Bagi orang yang mencari solusi GUI, Git Cola memiliki "Branch Diff Viewer" yang sangat bagus ( Diff -> Branches .. ).

kerner1000
sumber
-1
git diff revision_n revision_m

jika revision_ndan revision_mberturut-turut komit maka hasilnya sama dengan git show revision_m

Jovo Skorupan
sumber
-1

Anda juga dapat menggunakan diff visual .

Misalnya, jika Anda menggunakan Sourcetree , Anda cukup memilih dua komit dalam tampilan log .

(Saya pribadi lebih suka menggunakan GUI dalam banyak kasus untuk ini, dan saya memposting ini untuk mereka yang mungkin tidak terbiasa dengan opsi GUI.)

nak
sumber
-2

Jika Anda menyukai GUI dan menggunakan Windows, berikut adalah cara mudah.

  1. Unduh WinMerge
  2. Periksa dua cabang ke folder yang berbeda
  3. Lakukan perbandingan folder dengan folder menggunakan WinMerge. Anda juga dapat dengan mudah melakukan modifikasi jika salah satu cabang adalah yang sedang Anda kerjakan.
Marius Matioc
sumber
Ini bukan cara yang paling sederhana, sebenarnya tidak perlu mengunduh repo untuk melakukan perbedaaan antar cabang.
stefgosselin
Ini memang bukan cara paling sederhana, tetapi ini adalah cara GUI, yang seringkali jauh lebih mudah terutama untuk melihat perbedaan dalam semua file
Marius Matioc
-3

Anda juga dapat dengan mudah membandingkan cabang untuk file yang diubah menggunakan misalnya TortoiseGit . Cukup klik Browse Referensi dan pilih cabang yang ingin Anda bandingkan.

Sebagai contoh jika Anda membandingkan cabang Anda dengan master, Anda akan mendapatkan daftar file yang akan diubah di master jika Anda memutuskan untuk menggabungkan cabang Anda menjadi master .

Ingat bahwa Anda akan memiliki hasil yang berbeda jika Anda membandingkan master dengan cabang Anda dan cabang Anda dengan master .

Piotr
sumber
1
pertanyaannya tampaknya tentang utilitas asli git
Vladimir Hraban