Tampilkan perbedaan antar komit


236

Saya menggunakan Git di Ubuntu 10.04 (Lucid Lynx).

Saya telah membuat beberapa komitmen kepada tuan saya.

Namun, saya ingin mendapatkan perbedaan antara komitmen ini. Semuanya ada di cabang utama saya.

Sebagai contoh:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

Saya ingin mendapatkan perbedaan antara k73ud dan dj374. Namun, ketika saya melakukan yang berikut ini saya tidak bisa melihat perubahan yang saya buat k73ud.

git diff k73ud..dj374 > master.patch

Jawaban:


275

Mencoba

git diff k73ud^..dj374

untuk memastikan untuk memasukkan semua perubahan k73uddi dalam diff yang dihasilkan.

git diffmembandingkan dua titik akhir ( bukan rentang komit ). Karena OP ingin melihat perubahan yang diperkenalkan oleh k73ud, ia perlu membedakan antara komitmen induk pertama dari k73ud:k73ud^ (atau k73ud^1atauk73ud~ ).

Dengan begitu, diffhasilnya akan mencakup perubahan sejak k73ud induk (artinya termasuk perubahan dari k73uddirinya sendiri), bukan perubahan yang diperkenalkan sejak k73ud (hingga dj374).

Anda juga dapat mencoba:

git diff oldCommit..newCommit
git diff k73ud..dj374 

dan (1 spasi, tidak lebih):

git diff oldCommit newCommit
git diff k73ud dj374

Dan jika Anda hanya perlu mendapatkan nama file (mis. Untuk menyalin perbaikan terbaru secara manual):

git diff k73ud dj374 --name-only

Dan Anda bisa mendapatkan perubahan yang diterapkan ke cabang lain:

git diff k73ud dj374 > my.patch
git apply my.patch

5
Apakah kamu yakin git diff 275e8922ab4e995f47a753b88b75c3027444a54c..a8d9d944c32e945cbb9f60b3f724ecc580da86ae bekerja, tapi git diff 275e8922ab4e995f47a753b88b75c3027444a54c ^ .. a8d9d944c32e945cbb9f60b3f724ecc580da86ae mendapatkan pesan kesalahan - "revisi diketahui atau jalan tidak di pohon bekerja"
Demas

@demas: berfungsi pada mesin saya;) Anda juga dapat menggunakan git diff 275e8^ a8d9d9karena itu sama maka ' ..'.
VonC

4
@VonC Di mesin saya, tidak perlu menggunakan ^
xi.lin

5
@VonC Ubuntu 14.04. Hanya git diff k73ud..dj374OK
xi.lin

1
@ BradyDowling Setuju. Dan jika Anda ingin melihat perbedaan PR, Anda dapat melakukannya di baris perintah dengan ghCLI baru : stackoverflow.com/a/62031065/6309
VonC

126

Untuk melihat perbedaan antara:

Copy pekerjaan Anda dan area pementasan:

% git diff

Area pementasan dan komit terbaru:

% git diff --staged

Salinan kerja Anda dan komit 4ac0a6733:

% git diff 4ac0a6733

Komit 4ac0a6733 dan komit terbaru:

% git diff 4ac0a6733 HEAD

Komit 4ac0a6733 dan komit 826793951

% git diff 4ac0a6733 826793951

Untuk penjelasan lebih lanjut lihat dokumentasi resmi .


7
juga, jika Anda benar-benar hanya ingin melihat perbedaan satu file dalam komit tersebut, di git diff {x} {y} -- filenamemana {x}dan {y}adalah salah satu contoh yang diberikan. Lihat juga,, git log -pkarena ada beberapa tumpang tindih.
michael

54

Jika Anda ingin melihat perubahan diperkenalkan dengan setiap komit, coba "git log -p"


13
  1. gitk --all
  2. Pilih komit pertama
  3. Klik kanan yang lain, lalu pilih yang berbeda → ini

Saya mulai sedikit mempercayai gitk karena ini menunjukkan pengarang komiter yang berbeda dari yang sebenarnya.
Ciasto piekarz

10

Saya gunakan gitkuntuk melihat perbedaannya:

gitk k73ud..dj374

Ini memiliki mode GUI sehingga peninjauan lebih mudah.


7

Untuk melihat perbedaan antara dua komit yang berbeda (sebut saja adan b), gunakan

git diff a..b
  • Perhatikan bahwa perbedaan antara adan bbertolak belakang dengan bdan a.

Untuk melihat perbedaan antara komit terakhir Anda dan belum komit perubahan, gunakan

git diff

Jika Anda ingin dapat kembali ke perbedaan nanti, Anda dapat menyimpannya dalam file.

git diff a..b > ../project.diff

6

Paling sederhana untuk memeriksa perubahan dalam 2 komit terakhir setelah penarikan:

git diff HEAD~2 

3

Saya menulis sebuah skrip yang menampilkan perbedaan antara dua commit, bekerja dengan baik di Ubuntu.

https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc

#!/usr/bin/env python
import sys, subprocess, os

TOOLS = ['bcompare', 'meld']

def execute(command):
    return subprocess.check_output(command)

def getTool():
    for tool in TOOLS:
        try:
            out = execute(['which', tool]).strip()
            if tool in out:
                return tool
        except subprocess.CalledProcessError:
            pass
    return None

def printUsageAndExit():
    print 'Usage: python bdiff.py <project> <commit_one> <commit_two>'
    print 'Example: python bdiff.py <project> 0 1'
    print 'Example: python bdiff.py <project> fhejk7fe d78ewg9we'
    print 'Example: python bdiff.py <project> 0 d78ewg9we'
    sys.exit(0)

def getCommitIds(name, first, second):
    commit1 = None
    commit2 = None
    try:
        first_index = int(first) - 1
        second_index = int(second) - 1
        if int(first) < 0 or int(second) < 0:
            print "Cannot handle negative values: "
            sys.exit(0)
        logs = execute(['git', '-C', name, 'log', '--oneline', '--reverse']).splitlines()
        if first_index >= 0:
            commit1 = logs[first_index].split(' ')[0]
        if second_index >= 0:
            commit2 = logs[second_index].split(' ')[0]
    except ValueError:
        if first is not '0':
            commit1 = first
        if second is not '0':
            commit2 = second
    return commit1, commit2

def validateCommitIds(name, commit1, commit2):
    if not commit1 and not commit2:
        print "Nothing to do, exit!"
        return False
    try:
        if commit1:
            execute(['git', '-C', name, 'cat-file', '-t', commit1])
        if commit2:
            execute(['git', '-C', name, 'cat-file', '-t', commit2])
    except subprocess.CalledProcessError:
        return False
    return True

def cleanup(commit1, commit2):
        execute(['rm', '-rf', '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

def checkoutCommit(name, commit):
    if commit:
        execute(['git', 'clone', name, '/tmp/'+commit])
        execute(['git', '-C', '/tmp/'+commit, 'checkout', commit])
    else:
        execute(['mkdir', '/tmp/0'])

def compare(tool, commit1, commit2):
        execute([tool, '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

if __name__=='__main__':
    tool = getTool()
    if not tool:
        print "No GUI diff tools, install bcompare or meld"
        sys.exit(0)
    if len(sys.argv) is not 4:
        printUsageAndExit()

    name, first, second = None, 0, 0
    try:
        name, first, second = sys.argv[1], sys.argv[2], sys.argv[3]
    except IndexError:
        printUsageAndExit()

    commit1, commit2 = getCommitIds(name, first, second)

    if validateCommitIds(name, commit1, commit2) is False:
        sys.exit(0)

    cleanup(commit1, commit2)

    try:
        checkoutCommit(name, commit1)
        checkoutCommit(name, commit2)
        compare(tool, commit1, commit2)
    except KeyboardInterrupt:
        pass
    finally:
        cleanup(commit1, commit2)
    sys.exit(0)

1
Naskah yang menarik. +1
VonC

2

Jawaban yang diterima bagus.

Cukup letakkan lagi di sini, jadi mudah dimengerti & coba di masa depan

git diff c1...c2 > mypatch_1.patch  
git diff c1..c2  > mypatch_2.patch  
git diff c1^..c2 > mypatch_3.patch  

Saya mendapat diff yang sama untuk semua perintah di atas.

Di atas membantu dalam
1. melihat perbedaan antara komit c1 & komit lain c2
2. juga membuat file patch yang menunjukkan perbedaan dan dapat digunakan untuk menerapkan perubahan ke cabang lain

Jika tidak menunjukkan perbedaan dengan benar
maka c1 & c2 dapat diambil salah
maka sesuaikan mereka dengan sebelum komit seperti c1 ke c0, atau ke satu setelah seperti c2 ke c3

Gunakan gitkuntuk melihat komit SHA, 1 8 karakter cukup untuk menggunakannya sebagai c0, c1, c2 atau c3. Anda juga dapat melihat id komit dari Gitlab> Repositori> Komit, dll.

Semoga itu bisa membantu.


0

Katakanlah Anda memiliki satu komitmen lagi di bagian bawah (tertua), maka ini menjadi sangat mudah:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

Sekarang, menggunakan di bawah ini akan memudahkan tujuan server.

git diff k73ud oldestCommit

-2

Gunakan perintah ini untuk perbedaan antara komit dan tidak dipentaskan:

git difftool --dir-diff
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.