Pertanyaan Bagaimana saya membedakan file yang sama antara dua komit yang berbeda pada cabang yang sama?


Di Git, bagaimana saya bisa membandingkan file yang sama antara dua komit yang berbeda (tidak bersebelahan) pada cabang yang sama (master misalnya)?

Saya mencari a membandingkan fitur seperti yang ada di dalamnya Visual SourceSafe (VSS) atau Team Foundation Server (TFS). Apakah mungkin di Git?


881
2017-07-26 19:10


asal


Jawaban:


Dari git-diff manpage:

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

Misalnya, untuk melihat perbedaan untuk file "main.c" antara sekarang dan dua commit kembali, berikut tiga perintah yang setara:

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

1171
2017-07-26 19:13



Anda juga dapat membandingkan dua file berbeda dalam dua revisi berbeda, seperti ini:

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


212
2017-07-27 12:18



Jika Anda telah mengkonfigurasi "difftool" yang dapat Anda gunakan

git difftool revision_1:file_1 revision_2:file_2

Contoh: Membandingkan file dari commit terakhirnya ke commit sebelumnya di cabang yang sama: Dengan asumsi bahwa jika Anda berada di folder root proyek Anda

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

Anda harus memiliki entri-entri berikut di file ~ / .gitconfig atau di proyek / .git / config Anda. Instal p4merge [Ini adalah alat diff dan penggabungan pilihan saya]

[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\"

68
2018-01-03 11:45



Jika Anda ingin melihat semua perubahan pada file antara dua commit berdasarkan komit-by-commit, Anda juga dapat melakukannya

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


36
2017-07-26 20:50



Memeriksa $ git log, lalu salin SHA id dari 2 commit yang berbeda dan kemudian jalankan git diff perintah dengan ID tersebut, misalnya:

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

35
2018-04-19 00:14



Berikut ini skrip perl yang mencetak perintah git diff untuk file yang diberikan seperti yang ditemukan dalam perintah git log.

misalnya

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

Hasil:

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

yang kemudian dapat dipotong N ditempelkan di sesi jendela shell atau disalurkan ke / bin / sh.

Catatan:

  1. nomor (3 dalam kasus ini) menentukan berapa banyak baris yang akan dicetak
  2. file (pom.xml dalam hal ini) harus setuju di kedua tempat (Anda bisa membungkusnya dalam fungsi shell untuk menyediakan file yang sama di kedua tempat) atau meletakkannya di direktori bin sebagai skrip shell

Kode:

# 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;
}

21
2017-07-11 22:24



Jika Anda memiliki beberapa file atau direktori dan ingin membandingkan komit non berkelanjutan, Anda dapat melakukan ini:

Buat cabang sementara

git checkout -b revision

Putar ulang ke target commit pertama

git reset --hard <commit_target>

Cherry memilih mereka yang tertarik

git cherry-pick <commit_interested> ...

Terapkan diff

git diff <commit-target>^

Ketika Anda selesai

git branch -D revision

12
2017-08-25 14:08



Jika Anda ingin membuat diff dengan lebih dari satu file, dengan metode yang ditentukan oleh @mipadi:

Misalnya. diff antara HEAD dan Anda master, untuk menemukan semua .coffee file:

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

Ini akan mencari Anda secara rekursif your_search_folder/ untuk semua .coffee file dan membuat diff antara mereka dan mereka master versi.


11
2017-11-30 15:04



Hanya cara lain untuk menggunakan kedahsyatan git ...

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

8
2017-08-02 20:13



Jika Anda ingin perbandingan visual sederhana di Windows seperti yang bisa Anda dapatkan di VSS atau TFS, coba ini:

  • klik kanan pada file di File Explorer
  • pilih 'Git History'

Catatan: Setelah memutakhirkan ke Windows 10, saya kehilangan opsi menu konteks git. Namun, Anda dapat mencapai hal yang sama menggunakan 'gitk' atau 'gitk filename' di jendela perintah.

Jika Anda telah dan mengklik 'Git History', alat Git GUI akan mulai, dengan sejarah file di panel kiri atas. Pilih salah satu versi yang ingin Anda bandingkan. Kemudian klik kanan pada versi kedua dan pilih salah satu

Diff ini -> dipilih

atau

Diff yang dipilih -> ini

Perbedaan warna-kode akan muncul di panel kiri bawah.


0
2018-01-08 14:35