Aynı dosyayı aynı daldaki iki farklı işlem arasında nasıl dağıtabilirim?


Yanıtlar:


1475

Gönderen git-diffman:

git diff [--options] <commit> <commit> [--] [<path>...]

Örneğin, "main.c" dosyası ile şimdi ve iki işlem arasındaki farkı görmek için, üç eşdeğer komut aşağıda verilmiştir:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

43
..O (belki, oldukça eski sürümleri hariç) çalışma olacak olsa da, gerçekten gerekli değildir. İki taahhüt birbirinden çok uzaktaysa, SHA1'leri de kullanabilir git logveya gitkbulabilirsin. gitkayrıca içerik menüsünde "fark seçili -> bu" ve "fark bu -> seçili" vardır.
Cascabel

17
Dosya adı 2 işlem arasında değiştirilse bile bu işe yarar mı?
reubenjohn

26
"-" Öyleyse amacı nedir
user64141

29
@ user64141 Bu --, örneğin adlı bir dosyanız olduğunda kullanışlıdır -p. Senaryolarda kullanımı iyidir, sadece pratikte gerekli nadir durumlarda.
Palec

13
Not: Repo köküne göre yollar kullanmanız gerekir. Geçerli çalışma dizinine göre yollar çalışmaz.
Kevin Wheeler

280

İki farklı dosyayı iki farklı revizyonda da karşılaştırabilirsiniz, örneğin:

git diff <revision_1>:<file_1> <revision_2>:<file_2>


25
eğer böyle bir not görünüyor olduğunu <file_1>ve <file_2>değil üst düzey git yönetilen dizin, geçerli dizinde bulunan bir sona ekleme zorundadır ./Unix tarih:<revision_1>:./filename_1
Andre Holzner

7
<revision>: ommitted olabilir, böylece henüz işlenmemiş bir dosya ile fark edebilirsiniz.
Yaroslav Nikitenko

2
Windows'da dosya yolları için '/' değil, '/' kullanmak gerektiğini unutmayın.
np8

87

"Difftool" u yapılandırdıysanız,

git difftool revision_1:file_1 revision_2:file_2

Örnek: Bir dosyayı son taahhüdünden aynı şubedeki önceki taahhüdüyle karşılaştırma: Proje kök klasörünüzdeyseniz

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

~ / .Gitconfig veya project / .git / config dosyanızda aşağıdaki girişlerin olması gerekir. P4merge yükleyin [Bu benim tercih edilen fark ve birleştirme aracıdır]

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

50

İki farklı işlemin SHA-1 kimliğini kontrol edin $ git log, kopyalayın ve komutu bu kimliklerle çalıştırın . Örneğin:git diff

$ git diff (sha-id-one) (sha-id-two)

18
Belirli bir dosya için fark istiyorsanız, komutun sonuna dosyanın yolunu ekleyin.
hBrent

Ayrıca, iki işlem farklı dallar arasındaysa tüm ağaç bilgilerini indirmek için bir "git pull" yapın. Aksi takdirde "ölümcül: kötü nesne" hatası alırsınız.
user238607

4
git diff (sha-id-one) (sha-id-two) -- filename.ext dosya adı olmadan bu iki işlemdeki tüm dosyaların farklarını listeler .
SherylHohman

40

İki taahhüt arasındaki dosyada yapılan değişiklikleri taahhüt etme temelinde görmek istiyorsanız, ayrıca şunları yapabilirsiniz:

git log -u $start_commit..$end_commit -- path/to/file


"$ Start_commit" ve "$ end_commit" nedir? Bunlar gerçek mi, yoksa değilse bir örnek verebilir misiniz?
Peter Mortensen

Bunlar, başlangıç ​​ve bitiş revizyonunu içeren kabuk değişkenleridir, bunun yerine sha1 değişmez değerleri veya refs olabilir
cxreg

21

Burada, Git günlük komutunda bulunan belirli bir dosya için Git diff komutlarını yazdıran bir Perl betiği.

Örneğin

git log pom.xml | perl gldiff.pl 3 pom.xml

Verim:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

daha sonra kesilebilir ve bir kabuk penceresi oturumunda yapıştırılabilir veya borulara geçirilebilir /bin/sh.

Notlar:

  1. sayı (bu durumda 3) yazdırılacak satır sayısını belirtir
  2. dosya (bu durumda pom.xml) her iki yerde de anlaşmalıdır (her iki yerde de aynı dosyayı sağlamak için bir kabuk işlevine sarılabilir) veya kabuk komut dosyası olarak ikili bir dizine koyabilirsiniz

Kod:

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while (<>) {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}

14

Mipadi tarafından belirtilen yöntemle birden fazla dosyayla fark oluşturmak istiyorsanız:

Örneğin , tüm dosyaları bulmak HEADiçin diff arasında ve sizin master,.coffee

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

Bu, your_search_folder/tüm .coffeedosyalarınızı özyinelemeli olarak arayacak ve dosyalar ve mastersürümleri arasında bir fark yaratacaktır .


13

Birden fazla dosya veya dizininiz varsa ve sürekli olmayan taahhütleri karşılaştırmak istiyorsanız, bunu yapabilirsiniz:

Geçici bir dal oluşturun ( bu örnekte "revizyon" )

git checkout -b revision

İlk taahhüt hedefine geri sarma

git reset --hard <commit_target>

İlgililer bu kiraz toplama

git cherry-pick <commit_interested> ...

Fark uygula

git diff <commit-target>^

Bittiğinde

git branch -D revision

2
Bu çözüm için teşekkürler. Kullanım durumum için iyi çalıştı. Güncelleme yapacağım tek şey, işiniz bittiğinde, siz kapatana kadar dalı silemezsiniz.
Steven Dix

9

Git'in harikalığını kullanmanın başka bir yolu ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext

Bu cevaptan bash ile çalışan bir takma ad tanımladım:difftool-file = "!git difftool HEAD@{\"$2\"} HEAD \"$1\" #"
blueogive

2

Windows'ta Visual SourceSafe veya Team Foundation Server (TFS) gibi basit bir görsel karşılaştırma yapmak istiyorsanız , şunu deneyin:

  • Dosya Gezgini'nde dosyayı sağ tıklayın
  • 'Git Geçmişi'ni seçin

Not: Windows 10'a yükselttikten sonra Git içerik menüsü seçeneklerini kaybettim. Ancak, komut penceresinde 'gitk' veya 'gitk dosyaadı' kullanarak da aynı şeyi yapabilirsiniz.

'Git Geçmişi'ni çağırdığınızda, Git GUI aracı, sol üst bölmedeki dosyanın geçmişiyle başlayacaktır. Karşılaştırmak istediğiniz sürümlerden birini seçin. Ardından ikinci sürüme sağ tıklayın ve birini seçin

Bunu farket -> seçildi

veya

Fark seçildi -> bu

Sol alt bölmede renk kodlu farklılıklar görünecektir.


Downvoters için not: Bu basit bir çözümdür, uygulanması kolaydır ve OP sorununu giderir. OP'nin açıkça kullandığı Windows üzerinde çalışır (söz konusu TFS ve VSS referanslarına bakın).
Kaynak
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.