Cara Diff antara perubahan dan asal tidak dikomit lokal

141

Katakanlah saya mengkloning repositori dan mulai memodifikasi file. Saya tahu bahwa jika saya memiliki perubahan lokal yang tidak dikomit, saya dapat melakukan diff sebagai berikut git diff test.txtdan itu akan menunjukkan kepada saya perbedaan antara KEPALA lokal saat ini dan perubahan yang dimodifikasi, tidak dikomit dalam file. Jika saya mengkomit perubahan itu, saya bisa memperbaikinya terhadap repositori asli dengan menggunakangit diff master origin/master

Tetapi apakah ada cara untuk membedakan perubahan lokal dengan repositori asli di server sebelum melakukan secara lokal? Saya mencoba berbagai permutasi git diff --cached master origin/masterdengan tidak berhasil.

Chaitanya
sumber
Saya ingin tahu berapa banyak file saya telah berubah dari versi terakhir yang dilakukan di lokal saya. Jawaban atas pertanyaan saya adalah pertanyaan ini. Terima kasih!
Souvik Ghosh

Jawaban:

133

Mengingat repositori jarak jauh telah di-cache via git fetchitu harus memungkinkan untuk membandingkan terhadap komit ini. Coba yang berikut ini:

$ git fetch origin
$ git diff origin/master
JJD
sumber
5
Ah, bagus sekali. Kuncinya adalah meninggalkan master. Saya telah mencoba kombinasi di mana saya melakukan pengambilan sebelumnya, tetapi ketika saya melakukannya git diff master origin/mastermasih membandingkan dengan versi yang dilakukan (jelas dalam retrospeksi). Tetapi meninggalkan master sekarang membandingkan perubahan lokal terhadap versi yang diambil.
Chaitanya
@ Chaitanya Bagus aku bisa membantu. Sebenarnya saya menemukan gaya yang berbeda yang digunakan Git agak menjengkelkan: begitu Anda harus menulis origin masterdan di tempat lain origin/master. Masih ada pekerjaan yang harus dilakukan, IMHO.
JJD
Ini sepertinya tidak berfungsi: git diff origin/masterpengembalian fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.master ada pada asal, misalnya, git fetch origin masterberfungsi dengan baik,
mikemaccana
42

Saya tahu ini bukan jawaban untuk pertanyaan yang diajukan, tetapi saya menemukan pertanyaan ini mencari perbedaan file di cabang dan file tidak berkomitmen lokal dan saya pikir saya akan berbagi

Sintaksis:

git diff <commit-ish>:./ -- <path>

Contoh:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Terima kasih Eric Boehs untuk cara tidak harus mengetikkan nama file dua kali)

Nate
sumber
Saya suka solusi umum lebih baik daripada yang sempit, spesifik di atas. Berbagi pikiran di mana Anda menemukan itu?
fbicknel
Sepertinya saya tidak dapat menemukan dokumentasi tentang detail commit-ishdan pemisah usus besar. Dokumen pada git-diff sepertinya tidak menyebutkannya. Saya sudah menggunakannya begitu lama sehingga saya tidak ingat di mana saya pertama kali menemukannya. Mungkin contoh orang lain pada perintah lain dan saya baru saja bereksperimen git-diff. Saya takut jawaban laincommit-ish adalah yang terbaik yang bisa saya dapatkan saat ini.
Nate
3
Tambahan yang bagus untuk ini adalah git diff master:./ -- README.md. Dengan begitu Anda tidak perlu mengetik README.mddua kali dan Anda dapat menambahkannya ke alias lebih mudah.
Eric Boehs
Terima kasih @EricBoehs, Itu saran yang bagus.
Nate
1
Sintaks yang tidak bekerja untuk saya ... bukan git diff master: -- README.mdyang ./menciptakan /dev/nullsumber daripada cabang terpencil. Menggunakan git versi 2.19.0
rustyDev
21

Untuk melihat perubahan yang tidak bertahap (tidak ditambahkan) ke file yang ada

git diff

Perhatikan bahwa ini tidak melacak file baru. Untuk melihat perubahan bertahap, tidak berkomitmen

git diff --cached

pepestar
sumber
9

Jika Anda ingin membandingkan file secara visual, Anda dapat menggunakan:

git difftool

Ini akan memulai aplikasi diff Anda secara otomatis untuk setiap file yang diubah.

PS: Jika Anda tidak mengatur aplikasi diff, Anda dapat melakukannya seperti pada contoh di bawah ini (saya menggunakan Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false
Caner
sumber
apakah perubahan ini berlaku segera?
Dilip Raghunathan
Saya hanya ingin tahu, bagaimana ini terkait dengan pertanyaan yang diajukan? Bukankah git difftool hanya membandingkan perubahan lokal dengan master? Namun, OP menginginkannya antara perubahan lokal dan master jarak jauh.
infoclogged
Sejauh ini solusi termudah
Chris Johnson