Bagaimana untuk melihat perubahan antara dua berbuat tanpa melakukan di antara?

Bagaimana anda membuat git diff hanya menunjukkan perbedaan antara dua komit, tidak termasuk yang lain melakukan di antara?

Mengomentari pertanyaan (3)

anda hanya dapat melewatkan 2 berkomitmen untuk git diff seperti :

-> git diff 0da94be  59ff30c > my.patch
-> git apply my.patch
Komentar (14)

Meminta perbedaan /antara/ dua berbuat tanpa termasuk melakukan in-antara agak tidak masuk akal. Melakukan hanya snapshot dari isi repositori; meminta perbedaan antara dua tentu termasuk mereka. Jadi pertanyaannya kemudian adalah, apa yang sebenarnya kau cari?

Sebagai William menyarankan, cherry-picking dapat memberikan delta tunggal melakukan rebased di atas yang lain. Yaitu:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached

Ini membutuhkan komitmen 'abcdef', membandingkan terdekatnya nenek moyang, maka berlaku that difference di atas '012345'. Ini baru perbedaan ini kemudian ditampilkan - satu-satunya perubahan adalah konteks berasal dari '012345' bukan 'abcdef's langsung nenek moyang. Tentu saja, anda mungkin mendapatkan konflik dan lain-lain, sehingga's bukan merupakan proses yang sangat berguna dalam banyak kasus.

Jika anda're hanya tertarik pada abcdef itu sendiri, yang dapat anda lakukan:

$ git log -u -1 abcdef

Hal ini sebanding abcdef untuk segera leluhur, sendirian, dan biasanya apa yang anda inginkan.

Dan tentu saja

$ git diff 012345..abcdef

memberikan anda semua perbedaan antara dua orang melakukan.

Itu akan membantu untuk mendapatkan ide yang lebih baik dari apa yang anda're berusaha untuk mencapai - seperti yang saya sebutkan, meminta perbedaan antara dua melakukan tanpa apa's di antara doesn't benar-benar masuk akal.

Komentar (6)

Untuk membandingkan dua git commit 12345 dan abcdef sebagai patch satu dapat menggunakan perintah diff sebagai


diff 
Komentar (6)
git diff   path

Contoh:

git diff commit1 commit2 config/routes.rb

Hal itu menunjukkan perbedaan pada file itu di antara mereka yang melakukan.

Komentar (0)

Let's mengatakan anda memiliki ini

A
|
B    A0
|    |
C    D
\   /
  |
 ...

Dan anda ingin memastikan bahwa A adalah sama dengan A0.

Ini akan melakukan trik:

$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff
Komentar (1)

Untuk memeriksa menyelesaikan perubahan:

  git diff  

Untuk memeriksa hanya berubah/ditambahkan/dihapus file:

  git diff   --name-only

CATATAN: Untuk memeriksa diff tanpa melakukan di antara, anda don't perlu untuk menempatkan komit id.

Komentar (0)

Misalkan anda ingin melihat perbedaan antara melakukan 012345 dan abcdef. Berikut harus melakukan apa yang anda inginkan:

$ git checkout 012345
$ git cherry-pick-n abcdef
$ git diff --cached
Komentar (1)

Bagaimana dengan ini:

git diff abcdef 123456 | less

It's berguna untuk hanya pipa itu kurang jika anda ingin membandingkan berbagai diffs on the fly.

Komentar (0)

Saya alias pengaturan ~/.bashrc file git diff:

alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your recent tow commits

Bahasa inggris bukan bahasa ibu saya, mohon maaf kesalahan pengetikan

Komentar (0)

Sejak Git 2.19, anda hanya dapat menggunakan:

`git kisaran-diff rev1...rev2``

  • membandingkan dua komit pohon, dimulai oleh nenek moyang mereka

atau `git kisaran-diff rev1~..rev1 rev2~..rev2``

  • membandingkan perubahan yang diperkenalkan oleh 2 diberikan melakukan
Komentar (0)

Saya menulis sebuah script yang menampilkan perbedaan di antara dua berbuat, bekerja dengan baik di Ubuntu.

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

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

TOOLS = ['bcompare', 'meld']

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

def printUsageAndExit():
    print 'Usage: python bdiff.py   '
    print 'Example: python bdiff.py  0 1'
    print 'Example: python bdiff.py  fhejk7fe d78ewg9we'
    print 'Example: python bdiff.py  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 = subprocess.check_output(['git', '-C', name, 'log', '--oneline', '--reverse']).split('\n')
        if first_index >= 0:
            commit1 = logs[first_index].split(' ')[0]
        if second_index >= 0:
            commit2 = logs[second_index].split(' ')[0]
    except ValueError:
        if first != '0':
            commit1 = first
        if second != '0':
            commit2 = second
    return commit1, commit2

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

def cleanup(commit1, commit2):
        subprocess.check_output(['rm', '-rf', '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])

def checkoutCommit(name, commit):
    if commit != None:
        subprocess.check_output(['git', 'clone', name, '/tmp/'+commit])
        subprocess.check_output(['git', '-C', '/tmp/'+commit, 'checkout', commit])
    else:
        subprocess.check_output(['mkdir', '/tmp/0'])

def compare(tool, commit1, commit2):
        subprocess.check_output([tool, '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])

if __name__=='__main__':
    tool = getTool()
    if tool == None:
        print "No GUI diff tools"
        sys.exit(0)
    if len(sys.argv) != 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 not validateCommitIds(name, commit1, commit2):
        sys.exit(0)

    cleanup(commit1, commit2)
    checkoutCommit(name, commit1)
    checkoutCommit(name, commit2)

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

Saya alias pengaturan ~/.zshrc file git diff:

alias gdf='git diff HEAD{'^',}' # diff between your recent tow commits

Terima kasih @Jinmiao Luo

Komentar (0)