Hazırlanan değişiklikleri nasıl gösterebilirim?


2139

Taahhüt için birkaç değişiklik yaptım; bir sonraki işlem için hazırlanan tüm dosyaların farkını nasıl görebilirim? Git durumunun farkındayım , ancak gerçek diffs'leri görmek istiyorum - yalnızca aşamalı dosyaların adlarını değil.

Bunu gördüm git-diff (1) man sayfası diyor

git diff [- seçenekler] [-] […]

Bu form, dizine göre yaptığınız değişiklikleri görüntülemek içindir (sonraki işlem için hazırlama alanı). Başka bir deyişle, farklılıklar nelerdir olabilir endeksine ilave eklenti için git söyle ama hala yok. Git-add (1) öğesini kullanarak bu değişiklikleri sahne alabilirsiniz.

Ne yazık ki, bunu tam olarak anlamıyorum. Bir takma ad oluşturabileceğim kullanışlı tek satırlık olmalı, değil mi?


76
git status -vçalışır. Aşağıdaki cevabımı
VonC

3
@VonC Bunu her zaman kullanıyorum, ancak şu şekilde borulara bağlandım less: git status -v | less- yönetilebilir parçalar :)
Bay Office

Yanıtlar:


2612

Sadece şöyle olmalıdır:

git diff --cached

--cachedanlamına gelir önbellek / dizin değişiklikleri (yani aşamalı değişiklikler) akım karşı HEAD. --stagedile eşanlamlıdır --cached.

--stagedve --cachedişaret etmiyor HEAD, sadece farklılık HEAD. Kiraz git add --patch(veya git add -p) kullanarak ne taahhüt edeceğinizi seçerseniz --staged, aşamalı olanı döndürür.


35
Yalnızca dosya adlarını istiyorsanız, stackoverflow.com/a/4525025/255187git diff --name-only --cached
Michel Hébert

4
Her dosyada varsayılan görsel fark aracını başlatmak git difftool --stagedyerine bunu kullanın git diff --staged. difftoolyerine diffbaşka argümanlar da konulabilir .
LightCC

Ayrıca git difftool --staged -d, iki dizini tek seferde bir dosya yerine görsel bir araçla ayırmak için kullanabilirsiniz.
Robert Bernstein

Bu yanıt olarak işaretlendiğinden ve ilk önce üstte git diff, sonra git [[diğerleri]], sadece 2
sentim içermelidir

Ve tek aşamalı bir dosyadaki değişiklikleri görüntülemek için aşağıdakiler işe yarayacaktır:git diff --cached -- <stagedfile>
ObviousChild

1604

Basit bir grafik bunu daha net hale getirir:

Basit Git farkları

git fark

Çalışma dizini ile dizin arasındaki değişiklikleri gösterir. Bu, neyin değiştiğini gösterir, ancak bir taahhüt için hazırlanmamıştır.

git diff - önbellek

Dizin ve HEAD (bu daldaki son taahhüt olan) arasındaki değişiklikleri gösterir. Bu, indekse neler eklendiğini ve bir taahhüt için hazırlandığını gösterir.

git diff KAFA

Çalışma dizini ile HEAD (dizindeki değişiklikleri de içerir) arasındaki tüm değişiklikleri gösterir. Bu, son taahhütten bu yana, taahhüt için hazırlanmış olsun veya olmasın, tüm değişiklikleri gösterir.

Ayrıca :

365Git'te biraz daha ayrıntı var .


8
Bu naif, korkuyorum (genellikle herhangi bir git açıklamasında olduğu gibi). Eğer yerel değişiklikler varsa foo.cve yapmazlar git add foo.c, daha sonra foo.cise endekste değil ; taahhüt için sahnelenmez. Eğer git diff foo.csafça çalışma ile karşılaştırıldığında foo.cendekse, o zaman boş / varolmayan dosya ve tüm içeriğini arasındaki dev diff göstermek zorunda kalacak foo.c. Aslında, dizinde bir dosya yoksa git diff, o dosya için HEADkopyayı kullanmaya geri döner .
Kaz

9
@Kaz kesinlikle, dizin boş bir sayfa değil . HEADAşamalı değişikliklerin uygulandığı sanal bir kopyasıdır . Git'in tüm dosyaları kaydetmeden değil değişiklikleri kaydederek çalıştığını unutmayın. Bir dosyayı hazırladığınızda, yalnızca yapılan değişiklikleri saklar. Dizin ima ettiğiniz gibi boşsa, dizindeki değişikliklerin nasıl kaydedileceğini bilemez ve tüm dosyayı "yeni eklenen" olarak kaydetmek zorunda kalır - bu yanlıştır.
ADTC

8
@Kaz Hem dizin hem de dosyanın HEADdeğişmemiş versiyonuna sahip olacaklar foo.c(fiziksel kopyalar değil, sadece size ve bana mantıksal kopyalar. Git için, bu dosyada yer alan her bir taahhüdün atıfta bulunduğu aynı veri akışıdır. ). Yani tamamen tatsız git diffüzerinde yaptığınızda gerçekten geri düşmüyor aslında aslında Dizin ile fark yapıyor (ki dosyanın tam olarak aynı sürümünü içerir ). Grafik doğru. foo.cHEADHEAD
ADTC

2
Merhaba, bu bağlamda " dizin " ne anlama geldiğini bilmek ister misiniz ? Teşekkürler!
Gab 是 好人

2
@TomRussell ( tabii ki artı ) git status -vile eşdeğerdirgit diff --cachedgit status
wisbucky

54

Görsel bir yan yana görünümle ilgileniyorsanız, yaygın görsel fark aracı bunu yapabilir. Tüm değişiklikler olmasa da bazı aşamalar hazırlanmışsa üç bölme bile gösterecektir. Çatışma durumunda, dört bölme bile olacaktır.

Aşamalı ve düzenlenmemiş düzenlemelerle dağınık ekran görüntüsü

İle çağır

diffuse -m

Git çalışma kopyanızda.

Bana sorarsan, on yıldır gördüğüm en iyi görsel fark. Ayrıca, Git'e özgü değildir: SVN, Mercurial, Bazaar, ...

Ayrıca bakınız: git diff'te hem aşamalı hem de çalışan ağacı göster?


1
Teşekkürler, güzel bir araç gibi görünüyor. Meld şimdiye kadar Linux için en iyi görsel fark aracı olarak buldum, ancak panodan metin fark edebilmek için özledim - Meld giriş dosyaları gerektirir. Diffüz buna ve manuel yeniden hizalamaya izin verir. Bir süre deneyecek.
Drew Noakes

Diffuse.sourceforge.net için bozuk bağlantı, şimdilik sourceforge.net/projects/diffuse kullanın .
user1133275

1
brew install diffuseHem işaretlenmemiş hem de aşamalı değişiklikler varsa 3 bölme göstermez - henüz dizinde olmayan değişiklikler mi demek istediniz?
Brent Faust

Hangi diffüz versiyonunuz var? Evet - bir dosya ekleyip yerel olarak değiştirirseniz, üç bölme göstermesi gerekir.
krlmlr

Sen kurulum da olabilir yaygın varsayılan olarak difftool ve yerleşik olduğu mekanizma / aracı / takma başlatmak için kullanılmak. Cevabımı burada görebilirsiniz: < stackoverflow.com/a/45684512/6501141 >
LightCC

50

Bunun git status -v aynı zamanda aşamalı değişiklikleri de gösterdiğini unutmayın ! (aşamalı olmanız gerekir git add- bazı değişiklikler. Kademeli değişiklik yok, fark yok git status -v.
Bunu Git 1.2.0, Şubat 2006'dan beri yapıyor )

Uzun biçiminde (varsayılan), git statusaslında HEAD ve dizin arasındaki farkı görüntüleyen belgesiz bir "ayrıntılı" seçeneğe sahiptir.

Ve daha da eksiksiz hale gelmek üzere: "Git diff'de hem aşamalı hem de çalışan ağacı göster? " (Git 2.3.4+, 2. Çeyrek 2015):

git status -v -v

Son satırgit diff HEAD
artur

2
@artur neden? Cevabın amacı git status -vv, neleri de içerdiğini belirtmektir git diff HEAD.
VonC

Üzerinde çalışmaz git version 1.8.3.1. Eski olduğunu biliyorum, ancak mümkünse, bu bayrağın ne zaman tanıtıldığını not edin.
onebree

2
@onebree 1.8.3.1 gerçekten eski Haziran 2013. Ancak git status -veskidir ( github.com/git/git/commit/… , git 1.2.0, Şubat 2006!). Dizin ve HEAD: arasındaki farkı görüntülediğini unutmayın : Eğer dizine (no git add) bir şey eklediyseniz , git status -vfark göstermez. git status -v -vdaha yeni (Git 2.3.4, Mart 2015)
VonC

@VonC benim hatamdı ... Yaptım git diff -v.
onebree

25

Bu komutu kullanabilirsiniz.

git diff --cached --name-only

--cachedSeçeneği git diffaracı dosyaları sahnelenen almak ve --name-onlyopsiyon aracı dosyaların sadece isimlerini alır.


2
Lütfen daha fazla bilgi ile düzenleyin. Yalnızca kod ve "bunu dene" yanıtları önerilmez, çünkü bunlar aranabilir içerik içermez ve birisinin neden "bunu denemesi" gerektiğini açıklamaz.
abarisone

2
Bunu neden istediğimden emin değilim, --name-onlyaynı zamanda normal git status
Simon Forsberg

16

1.7 ve daha sonraki sürümlerden itibaren:

git diff --staged

15

GÖRSEL FARKLI ARAÇ KULLANMA

Varsayılan Yanıt (komut satırında)

Buradaki en iyi yanıtlar, aşağıdakilerdeki önbelleğe alınmış / aşamalı değişikliklerin nasıl görüntüleneceğini doğru bir şekilde gösterir Index:

$ git diff --cached

veya $ git diff --stagedbir takma addır.


Bunun yerine Visual Diff Aracını Başlatma

Varsayılan yanıt git bash'taki (yani komut satırında veya konsolda) fark değişikliklerini verir. Aşamalı dosya farklılıklarının görsel temsilini tercih edenler için git içinde, komut satırında görüntülenen her dosya için görsel bir fark aracı başlatan bir komut dosyası bulunur.difftool :

$ git difftool --staged

Bu, aynı şeyi yapacaktır. git diff --staged , diff aracının çalıştırıldığı her zaman dışında (yani bir dosya diff tarafından her işlendiğinde), varsayılan görsel fark aracını ( ortamımda bu kdiff3'tür ) başlatır .

Araç başlatıldıktan sonra, görsel diff aracınız kapanana kadar git diff komut dosyası duraklatılır. Bu nedenle, bir sonrakini görmek için her dosyayı kapatmanız gerekir.


Her Zaman Kullanabilirsiniz difftooldiffİn git komutlarının yerine

Tüm görsel fark ihtiyaçlarınız için, git difftoolgit diff tüm seçenekler de dahil olmak üzere herhangi bir komutun yerine çalışacaktır .

Örneğin, görsel fark aracının her dosya için yapılıp yapılmayacağını sormadan başlatılmasını sağlamak için -y seçeneği (genellikle bunu isteyeceğinizi düşünüyorum !!):

$ git difftool -y --staged

Bu durumda görsel fark aracındaki her bir dosyayı birer birer çeker ve araç kapatıldıktan sonra bir sonraki dosyayı getirir.

Veya şu aşamada hazırlanmış olan belirli bir dosyanın farkına bakmak için Index:

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

Tüm seçenekler için kılavuz sayfasına bakın:

$ git difftool --help


Visual Git Aracını Ayarlama

Varsayılandan farklı bir görsel git aracı kullanmak için şu -t <tool>seçeneği kullanın:

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

Veya git'i farklı bir varsayılan görsel fark aracını kullanacak şekilde nasıl yapılandıracağınız için difftool man sayfasına bakın.


.gitconfigFark / birleştirme aracı olarak vscode için örnek girişler

Bir difftool kurmanın bir parçası, .gitconfigdosyayı sahne arkasında değiştiren git komutlarıyla değiştirmeyi veya doğrudan düzenlemeyi içerir.

Kendi .gitconfiggiriş dizininizde bulabilirsiniz , örneğin ~Unix veya normalde c:\users\<username>Windows).

Veya kullanıcıyı .gitconfigvarsayılan Git düzenleyicinizdegit config -e --global .

.gitconfigHem diff aracı hem de birleştirme aracı olarak VS Code için global kullanıcımdaki örnek girişler şunlardır :

[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

14

Evreleme Alanı ve Depo (son taahhüt) karşılaştırma kullanımı için

 $git diff --staged

Komut, hazırlamanızı karşılaştırır ($ git add fileName ) değişikliklerinizi son işleminizle . Bir sonraki taahhüdünüze girecek olan ne yaptığınızı görmek istiyorsanız git diff --staged komutunu kullanabilirsiniz. Bu komut aşamalı değişikliklerinizi son işleminizle karşılaştırır.

Çalışma ve Evreleme karşılaştırması kullanımı için

$ git diff 

Komut, çalışma dizininizde bulunanları hazırlama alanınızdakilerle karşılaştırır. Git farkının kendi başına son taahhüdünüzden bu yana yapılan tüm değişiklikleri göstermediğine dikkat etmek önemlidir - yalnızca hala değişmemiş olan değişiklikler. Tüm değişikliklerinizi sahnelediyseniz ($ git add fileName ) , git diff size çıktı vermez.

Ayrıca, bir dosyayı ( $ git add fileName) yerleştirir ve düzenlerseniz, aşamalı dosyadaki değişiklikleri ve değiştirilmemiş değişiklikleri görmek için git diff komutunu kullanabilirsiniz.


Msgstr "Çalışma ve Depo karşılaştırması kullanımı için $ git diff" . Eminim git diffWorking vs Staging karşılaştırır. Bkz. Stackoverflow.com/a/1587952
wisbucky

8

Niyetleriniz uzak bir repo şubesini hedeflemekse ve bir taahhüt değişikliği günlüğüne ilk geçişiniz eksikse, böyle itmeden önce taahhüt ifadesini düzeltebilirsiniz.

lokal olarak

... bazı değişiklikler yapın ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... taahhütte belirtilen daha fazla değişikliği hatırlayın ...

git diff origin / master # aşamalı ancak itilmemiş değişikliklere bakma

... aşamalı taahhüt beyanını değiştir ...

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

git push

7

Aşamalı değişikliklere sahip birden fazla dosyanız varsa, kullanmak git add -i, daha sonra seçmek 6: diffve son olarak ilgilendiğiniz dosyaları seçmek daha pratik olabilir .


6

Varsayılan olarak git diff , git güncellenmiş dosyalar listesine eklenmeyen değişiklikleri göstermek için kullanılır. Ama sen stagged veya eklenen dosyalar ilgilenen olduğunu git bildireceğiz ekstra seçenekler sunmak gerekir sonra eklenen veya stagged edilir değişiklikleri göstermek istiyorsanız fark .

$ 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 

Misal

$ 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
$

Dosyaları ekledikten sonra, 'git diff' varsayılanını kullanamazsınız.

$ 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;


0

gitkGit ile sağlanan ve değişiklikleri görmek için çok yararlı olan aracı da düşünün

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.