Bagaimana cara menunjukkan perubahan yang telah dipentaskan?

2141

Saya melakukan beberapa perubahan untuk dilakukan; bagaimana saya bisa melihat perbedaan semua file yang dipentaskan untuk komit berikutnya? Saya mengetahui status git , tetapi saya ingin melihat perbedaan yang sebenarnya - bukan hanya nama file yang dipentaskan.

Saya melihat bahwa halaman manual git-diff (1) mengatakan

git beda [--Opsi] [-] […]

Formulir ini untuk melihat perubahan yang Anda buat relatif terhadap indeks (area pementasan untuk komit berikutnya). Dengan kata lain, perbedaannya adalah apa yang bisa Anda katakan pada git untuk menambahkan indeks lebih lanjut tetapi Anda masih belum. Anda dapat mengatur perubahan ini dengan menggunakan git-add (1).

Sayangnya, saya tidak bisa memahami ini. Pasti ada satu liner berguna yang bisa saya buat alias, kan?

Frerich Raabe
sumber
76
git status -vbekerja juga. Lihat jawaban saya di bawah ini
VonC
3
@VonC Saya selalu menggunakan ini, tetapi disalurkan ke less, seperti pada: git status -v | less- potongan yang dapat diatur :)
Mr Office

Jawaban:

2613

Seharusnya:

git diff --cached

--cachedberarti menunjukkan perubahan dalam cache / indeks (yaitu perubahan bertahap) terhadap arus HEAD. --stagedadalah sinonim untuk --cached.

--stageddan --cachedtidak menunjuk ke HEAD, hanya perbedaan sehubungan dengan HEAD. Jika Anda memilih apa yang ingin dilakukan menggunakan git add --patch(atau git add -p), --stagedakan mengembalikan apa yang dipentaskan.

CB Bailey
sumber
35
Jika Anda hanya menginginkan nama file, lakukan hal berikut git diff --name-only --cachedper posting di stackoverflow.com/a/4525025/255187
Michel Hébert
4
Gunakan ini dengan git difftool --stageddaripada git diff --stagedmeluncurkan alat visual diff standar pada setiap file. difftooldapat diganti diffdengan argumen lain juga.
LightCC
Dan Anda dapat menggunakan git difftool --staged -duntuk membedakan dua direktori dalam alat visual daripada satu file pada satu waktu.
Robert Bernstein
karena yang ini ditandai sebagai jawaban dan ditampilkan pertama-tama itu harus menyertakan git diff di atas, kemudian git [[yang lain]], hanya 2 sen saya
Vitaliy Terziev
Dan untuk melihat perubahan dalam satu file bertahap, berikut ini akan berfungsi:git diff --cached -- <stagedfile>
ObviousChild
1605

Grafik sederhana membuat ini lebih jelas:

Perbedaan Git sederhana

git diff

Menunjukkan perubahan antara direktori kerja dan indeks. Ini menunjukkan apa yang telah diubah, tetapi tidak dipentaskan untuk komit.

git berbeda --cached

Memperlihatkan perubahan antara indeks dan HEAD (yang merupakan komit terakhir di cabang ini). Ini menunjukkan apa yang telah ditambahkan ke indeks dan dipentaskan untuk komit.

git KEPALA berbeda

Menampilkan semua perubahan antara direktori kerja dan HEAD (yang mencakup perubahan dalam indeks). Ini menunjukkan semua perubahan sejak komit terakhir, apakah mereka telah dipentaskan untuk komit atau tidak.

Juga :

Ada sedikit lebih detail di 365Git.

Abizern
sumber
8
Ini naif, aku takut (seperti biasanya halnya dengan penjelasan git). Jika Anda memiliki modifikasi lokal untuk foo.cdan tidak melakukan git add foo.c, maka foo.cini tidak di indeks ; itu tidak dipentaskan untuk komit. Jika git diff foo.cnaif dibandingkan dengan bekerja foo.cdengan indeks, maka itu harus menunjukkan perbedaan besar antara file kosong / tidak ada dan seluruh konten foo.c. Jadi pada kenyataannya, ketika file tidak ada dalam indeks, git diffjatuh kembali, untuk file itu, menggunakan HEADsalinan.
Kaz
9
@Kaz secara tegas, indeksnya bukan sebuah papan tulis kosong. Ini adalah salinan virtual dari HEADmana perubahan bertahap diterapkan. Ingat bahwa Git bekerja dengan menyimpan perubahan, bukan dengan menyimpan seluruh file. Saat Anda mem-stage file, itu hanya menyimpan perubahan yang dilakukan. Jika indeks kosong seperti yang Anda maksudkan, itu tidak akan tahu bagaimana cara menyimpan perubahan dalam indeks, dan harus menyimpan seluruh file sebagai "baru ditambahkan" - yang salah.
ADTC
8
@Kaz Baik indeks dan HEADakan memiliki versi foo.cfile tidak berubah (mereka bukan salinan fisik, tetapi hanya salinan logis untuk Anda dan saya. Untuk Git mereka hanya aliran data yang sama bahwa setiap komit yang pernah terlibat file yang merujuk ke ). Jadi, ketika Anda melakukannya git diffpada unstaged sepenuhnyafoo.c itu tidak benar-benar jatuh kembali ke HEADitu sebenarnya melakukan diff dengan Indeks (yang kebetulan mengandung versi file yang sama persis seperti HEADhalnya). Jadi gambarnya benar.
ADTC
2
Halo, saya ingin tahu apa artinya " indeks " dalam konteks ini? Terima kasih!
Gab 是 好人
2
@ TomRussell git status -vsetara dengan git diff --cached(plus git statustentu saja)
wisbucky
54

Jika Anda tertarik pada tampilan visual berdampingan, alat difus visual diff dapat melakukannya. Ia bahkan akan menampilkan tiga panel jika beberapa tetapi tidak semua perubahan dilakukan. Dalam kasus konflik, bahkan akan ada empat panel.

Cuplikan layar difus dengan pengeditan bertahap dan tidak bertahap

Meminta dengan

diffuse -m

di copy pekerjaan Git Anda.

Jika Anda bertanya kepada saya, perbedaan visual terbaik yang pernah saya lihat selama satu dekade. Juga, ini tidak spesifik untuk Git: Ini beroperasi dengan kebanyakan VCS lainnya, termasuk SVN, Mercurial, Bazaar, ...

Lihat juga: Perlihatkan pohon yang dipentaskan & bekerja di git diff?

krlmlr
sumber
1
Terima kasih, ini terlihat seperti alat yang bagus. Saya telah menemukan Meld sebagai alat visual diff terbaik untuk Linux sejauh ini, tetapi saya tidak dapat membedakan teks dari clipboard - Meld membutuhkan file untuk input. Diffuse memungkinkan ini, serta penataan kembali manual. Akan mencobanya sebentar.
Drew Noakes
Tautan rusak ke diffuse.sourceforge.net, gunakan sourceforge.net/projects/diffuse untuk saat ini.
user1133275
1
brew install diffuse berfungsi pada OS X. Tidak menampilkan 3 panel jika perubahan yang tidak dipentaskan dan yang dipentaskan - apakah maksud Anda perubahan yang belum ada dalam indeks?
Brent Faust
Versi difus mana yang Anda miliki? Ya - jika Anda menambahkan file dan kemudian memodifikasinya secara lokal, itu akan menampilkan tiga panel.
krlmlr
Anda juga dapat mengatur difus sebagai diftool default Anda dan menggunakan mekanisme / alat / alias untuk meluncurkannya. Lihat jawaban saya di sini: < stackoverflow.com/a/45684512/6501141 >
LightCC
50

Catatan yang git status -v juga menunjukkan perubahan bertahap! (Berarti Anda harus melakukan stage - git add- beberapa perubahan. Tidak ada perubahan bertahap, tidak berbeda dengan git status -v.
Ia melakukan itu sejak Git 1.2.0, Februari 2006 )

Dalam bentuknya yang panjang (default), git statusmemiliki opsi "verbose" tanpa dokumen yang benar-benar menampilkan perbedaan antara HEAD dan indeks.

Dan itu akan menjadi lebih lengkap: lihat " Tampilkan pohon yang dipentaskan & bekerja di git diff? " (Git 2.3.4+, Q2 2015):

git status -v -v
VONC
sumber
Baris terakhir adalahgit diff HEAD
artur
2
@artur mengapa? Inti dari jawabannya adalah menyebutkan yang git status -vvjuga mencakup apa yang git diff HEADdilakukan.
VonC
Tidak bekerja pada git version 1.8.3.1. Saya tahu ini sudah tua, tetapi jika mungkin, perhatikan kapan bendera ini diperkenalkan.
onebree
2
@onebree 1.8.3.1 adalah Juni 2013, memang lama. Tetapi git status -vlebih tua ( github.com/git/git/commit/… , git 1.2.0, Februari 2006!). Perhatikan bahwa ini menampilkan perbedaan antara indeks dan HEAD: jika Anda telah menambahkan sesuatu ke indeks (tidak git add), maka git status -vtidak akan menampilkan perbedaan apa pun. git status -v -vlebih baru (Git 2.3.4, Maret 2015)
VonC
@VonC itu kesalahan saya ... saya lakukan git diff -v.
onebree
25

Anda dapat menggunakan perintah ini.

git diff --cached --name-only

The --cachedpilihan git diffcara untuk mendapatkan file dipentaskan, dan --name-onlysarana pilihan untuk mendapatkan hanya nama-nama file.

Yash Patadia
sumber
2
Harap edit dengan informasi lebih lanjut. Jawaban khusus kode dan "coba ini" tidak disarankan, karena tidak mengandung konten yang dapat ditelusuri, dan jangan jelaskan mengapa seseorang harus "coba ini".
abarisone
2
Tidak yakin mengapa saya menginginkan ini, dengan --name-onlyopsi yang saya bisa gunakan yang biasagit status
Simon Forsberg
16

Dari versi 1.7 dan yang lebih baru seharusnya:

git diff --staged
ML13
sumber
15

MENGGUNAKAN ALAT VISUAL DIFF

Jawaban Default (pada baris perintah)

Jawaban teratas di sini dengan benar menunjukkan cara melihat perubahan yang di-cache / dipentaskan di Index:

$ git diff --cached

atau $ git diff --stagedyang merupakan alias.


Meluncurkan Alat Visual Diff

Jawaban default akan memuntahkan perubahan diff pada bash git (yaitu pada baris perintah atau di konsol). Bagi mereka yang lebih suka representasi visual dari perbedaan file bertahap, ada skrip yang tersedia di dalam git yang meluncurkan alat diff visual untuk setiap file yang dilihat alih-alih menunjukkannya pada baris perintah, yang disebut difftool:

$ git difftool --staged

Ini akan melakukan hal yang sama seperti ini git diff --staged, kecuali setiap kali alat diff dijalankan (yaitu setiap kali file diproses oleh diff), ia akan meluncurkan alat visual diff standar (di lingkungan saya, ini kdiff3 ).

Setelah alat diluncurkan, skrip git diff akan berhenti hingga alat visual diff Anda ditutup. Oleh karena itu, Anda harus menutup setiap file untuk melihat yang berikutnya.


Anda Selalu Dapat Menggunakan difftooldi tempatdiff dalam perintah git

Untuk semua kebutuhan visual Anda yang berbeda, git difftoolakan bekerja di tempat apa pungit diff perintah , termasuk semua opsi.

Misalnya, agar peluncuran alat visual berbeda tanpa menanyakan apakah akan melakukannya untuk setiap file, tambahkan -yopsi (saya pikir biasanya Anda menginginkan ini !!):

$ git difftool -y --staged

Dalam hal ini ia akan menarik setiap file dalam alat visual diff, satu per satu, membuka yang berikutnya setelah alat ditutup.

Atau untuk melihat perbedaan dari file tertentu yang dipentaskan di Index:

$ git difftool -y --staged <<relative path/filename>>

Untuk semua opsi, lihat halaman manual:

$ git difftool --help


Menyiapkan Alat Visual Git

Untuk menggunakan alat visual git selain dari yang standar, gunakan -t <tool>opsi:

$ git difftool -t <tool> <<other args>>

Atau, lihat halaman manual difftool untuk cara mengkonfigurasi git untuk menggunakan alat visual diff standar yang berbeda.


Contoh .gitconfig entri untuk vscode sebagai alat diff / merge

Bagian dari menyiapkan difftool melibatkan mengubah .gitconfig file, baik melalui perintah git yang mengubahnya di belakang layar, atau mengeditnya secara langsung.

Anda dapat menemukannya .gitconfigdi direktori home Anda, seperti ~di Unix atau normalc:\users\<username> di Windows).

Atau, Anda dapat membuka pengguna .gitconfigdengan editor Git default Andagit config -e --global .

Berikut adalah contoh entri dalam pengguna global saya .gitconfiguntuk Kode VS baik sebagai alat berbeda dan alat gabungan:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe
LightCC
sumber
14

Untuk penggunaan perbandingan Staging Area vs Repository (commit terakhir)

 $git diff --staged

Perintah membandingkan stage Anda ($ git add fileName perubahan ) Anda dengan komit terakhir Anda. Jika Anda ingin melihat apa yang telah dipentaskan yang akan masuk ke komit Anda berikutnya, Anda dapat menggunakan git diff --staged. Perintah ini membandingkan perubahan bertahap Anda dengan komit terakhir Anda.

Untuk Bekerja, perbandingan penggunaan Staging

$ git diff 

Perintah membandingkan apa yang ada di direktori kerja Anda dengan apa yang ada di area pementasan Anda. Penting untuk dicatat bahwa git diff dengan sendirinya tidak menunjukkan semua perubahan yang dibuat sejak komit terakhir Anda - hanya perubahan yang masih belum dipentaskan. Jika Anda telah melakukan semua perubahan Anda ($ git add fileName ), git diff tidak akan memberi Anda hasil.

Juga, jika Anda membuat file ( $ git add fileName) dan kemudian mengeditnya, Anda dapat menggunakan git diff untuk melihat perubahan pada file yang dipentaskan dan perubahan yang tidak dipentaskan.

Vicky yang loyal
sumber
"Untuk Bekerja menggunakan perbandingan perbandingan Repositori $ git diff" . Saya cukup yakin git diffmembandingkan antara Bekerja vs Pementasan. Lihat stackoverflow.com/a/1587952
wisbucky
8

Jika niat Anda adalah untuk mendorong target cabang repo jarak jauh dan pass pertama Anda pada log perubahan komit tidak lengkap, Anda dapat memperbaiki pernyataan komit sebelum mendorong seperti ini.

Secara lokal

... buat beberapa perubahan ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... ingat lebih banyak perubahan yang tidak disebutkan dalam komit ...

git diff asal / master # lihat dipentaskan tetapi tidak mendorong perubahan

... ubah pernyataan komitmen yang dilakukan ...

git commit --amend -m"i missed mentioning these changes ...."

git push
Marc Condon
sumber
7

Jika Anda memiliki lebih dari satu file dengan perubahan bertahap, mungkin lebih praktis untuk digunakan git add -i, lalu pilih 6: diff, dan akhirnya pilih file yang Anda minati.

Fred Schoen
sumber
6

Secara default git diff digunakan untuk menampilkan perubahan yang tidak ditambahkan ke daftar file git yang diperbarui. Tetapi jika Anda ingin menunjukkan perubahan yang ditambahkan atau stag, maka Anda perlu memberikan opsi tambahan yang akan membuat git tahu bahwa Anda tertarik pada stagged atau menambahkan file diff .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

Contoh

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

Setelah Anda menambahkan file, Anda tidak dapat menggunakan default 'git diff'. Anda harus melakukan ini: -

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;
Deepak Dixit
sumber
2

git guidan git-colamerupakan utilitas grafis yang memungkinkan Anda melihat dan memanipulasi indeks. Keduanya termasuk diff visual sederhana untuk file yang dipentaskan, dan git-colajuga dapat meluncurkan alat diff visual yang berdampingan yang lebih canggih.

Lihat jawaban saya yang terkait erat di Cara menghapus file dari indeks di git? , dan juga katalog resmi Klien Git - GUI ini .

bangsawan
sumber
0

Pikirkan tentang gitkalat ini juga, dilengkapi dengan git dan sangat berguna untuk melihat perubahannya

sam
sumber