copy pekerjaan saat ini berbeda dari file dengan salinan berkomitmen cabang lain


158

Saya punya repo dengan file foodi cabang master. Saya beralih ke cabang bar dan membuat beberapa perubahan foo. Bagaimana saya bisa menjalankan git diffantara salinan ini (yang belum dilakukan) dan salinan cabang master?

Jawaban:


151

Berikut ini berfungsi untuk saya:

git diff master:foo foo

Di masa lalu, itu mungkin:

git diff foo master:foo


9
Setiap kali saya melihat jawaban Anda git diff, saya selalu memikirkan stackoverflow.com/questions/5256249/git-diff-doesnt-show-enough/…
VonC

@VonC: terima kasih, senang mengetahui bahwa itu layak untuk digambar :) :) Kebetulan, apakah Anda memahami keanehan yang saya perbarui dengan jawaban saya?
Mark Longair

2
Apakah Anda mencoba dengan --untuk memisahkan parameter dari argumen jalur? git diff -- master:foo foo
VonC

1
Pada 1.8, git diff -- master:foo footidak berfungsi - sepertinya memperlakukan arg master:foosebagai nama file yang tidak ada (dan mengabaikannya) alih-alih file-in-a-branch. Coba alihkan 2 argumen terakhir - jika berhasil, perbandingan diff harus dibalik, tetapi hasilnya tidak berubah.
Kelvin

9
Bagi saya itu sebaliknya - saya bisa lakukan git diff master:foo footetapi tidak sebaliknya. Saya juga tidak mengerti. Dengan git 1.7.9.5 / Ubuntu 12.04 setidaknya saya dapat melakukan git diff -R master:foo foountuk mendapatkan diff yang sebenarnya saya inginkan. Ketika saya mencobanya dengan msysgit 1.9.4 / Windows 7 x64 saya dapatkan fatal: unable to read 0000000000000000000000000000000000000000. Tanpa -Rsaya mendapatkan pesan kesalahan yang sama seperti Anda dengan git 1.7.9.5, tetapi dengan 1.9.4 saya dapatkan fatal: master:foo: no such path in the working tree.
JMM

100

Anda mencoba membandingkan pohon kerja Anda dengan nama cabang tertentu, jadi Anda menginginkan ini:

git diff master -- foo

Yang dari bentuk git-diff ini (lihat manual git-diff)

   git diff [--options] <commit> [--] [<path>...]
       This form is to view the changes you have in your working tree
       relative to the named <commit>. You can use HEAD to compare it with
       the latest commit, or a branch name to compare with the tip of a
       different branch.

FYI, ada juga opsi --cached(alias --staged) untuk melihat perbedaan dari apa yang telah Anda buat, daripada semua yang ada di pohon kerja Anda:

   git diff [--options] --cached [<commit>] [--] [<path>...]
       This form is to view the changes you staged for the next commit
       relative to the named <commit>.
       ...
       --staged is a synonym of --cached.

2
Terima kasih. Tidak tahu mengapa, tetapi hanya jawaban ini yang bekerja untuk saya dengan git 1.8.1 di Linux.
srking

Luar biasa terima kasih. Saya menutup telepon karena ingin memasukkan nama cabang saya saat ini di perintah diff, tetapi saya melihat itu tidak diperlukan.
yoyo

Ini bekerja untuk saya beberapa bulan yang lalu, tetapi sepertinya tidak sekarang. Saat ini saya di git versi 2.7.4 (Apple Git-66); Saya tidak tahu apa yang saya miliki sebelumnya.
hBrent

@ hBrent ini masih berfungsi untuk saya di OSX 10.11 dengan git 2.7.3. Berikut ini contoh repo cepat dengan instruksi jika itu membantu: github.com/jordan-brough/git-diff-test
Jordan Brough

Terima kasih @JordanBrough.
hBrent

14

Juga: git diff master..feature foo

Karena git diff foo master:footidak berfungsi pada direktori untuk saya.


Aku juga tidak. Apakah ini Windows?
Scott Stafford

@ScottStafford Saya di Ubuntu, jadi tidak, sepertinya tidak hanya Windows.
ArtBIT

Bekerja untuk saya selama saya secara eksplisit memberikan kedua nama cabang (windows) git diff branch1:foo master:foo
Meep

12
git difftool tag/branch filename

Ini adalah satu-satunya jawaban yang berfungsi bagi saya untuk perbandingan antara copy pekerjaan lokal file, dan versi file dalam repo jarak jauh (bukan "asal"). Terima kasih, Adir dan Baz
Mouse

git difftooltidak memiliki -vopsi menurut docs git-scm.com/docs/git-difftool . Apakah maksud Anda -y?
ks1322

10
git diff mybranch master -- file

juga harus bekerja


4
Ini hanya berfungsi untuk file yang dikomit ke mybranch, bukan salinan file yang aktif saat ini.
yoyo

apa arti "-" di atas
Pushparaj

Ini memungkinkan perbandingan di kedua arah: git diff deployment master -- filedan git diff master deployment -- fileberfungsi seperti yang diharapkan dengan 2 cabang .
viktorkho

0

Untuk melihat perubahan lokal dibandingkan dengan cabang Anda saat ini

git diff .

Untuk melihat perubahan lokal dibandingkan dengan cabang lain yang ada

git diff <branch-name> .

Untuk melihat perubahan file tertentu

git diff <branch-name> -- <file-path>

Pastikan Anda berlari git fetchdi awal.

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.