コミット間の差分を表示


236

Ubuntu 10.04(Lucid Lynx)でGitを使用しています。

私は私のマスターにいくつかのコミットをしました。

ただし、これらのコミットの違いを知りたいです。それらのすべては私のマスターブランチにあります。

例えば:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

k73udとdj374の違いを知りたい。ただし、次の操作を行ったとき、で行った変更を確認できませんでしたk73ud

git diff k73ud..dj374 > master.patch

回答:


275

試す

git diff k73ud^..dj374

のすべての変更を確実にk73ud結果の差分に含めます。

git diffコミット範囲の代わりに) 2つのエンドポイントを比較します。OPはによって導入された変更を確認するk73ud必要があるため、最初の親コミットのk73ud:(k73ud^またはk73ud^1ork73ud~)を区別する必要があります。

そうすることで、diff結果には(それまでの)からの変更の代わりに(それ自体からの変更を含む)親からの 変更が含まれます。k73udk73ud k73uddj374

また、あなたは試すことができます:

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

と(1スペース、それ以上):

git diff oldCommit newCommit
git diff k73ud dj374

ファイル名のみを取得する必要がある場合(たとえば、手動で修正プログラムをコピーする場合):

git diff k73ud dj374 --name-only

そして、別のブランチに変更を適用できます:

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

5
本気ですか?gitのdiffを275e8922ab4e995f47a753b88b75c3027444a54c..a8d9d944c32e945cbb9f60b3f724ecc580da86aeは動作しますが、gitの差分275e8922ab4e995f47a753b88b75c3027444a54cは^ .. a8d9d944c32e945cbb9f60b3f724ecc580da86ae GETエラーメッセージ- 「未知のリビジョンまたはパスではありません作業ツリーでは、」
DEMAS

@demas:私のマシンで動作します;)またgit diff 275e8^ a8d9d9、 ' ..' と同じなので、使用することもできます。
VonC、2010

4
@VonC私のマシンでは、^
xi.lin

5
@VonC Ubuntu 14.04。唯一の問題git diff k73ud..dj374はありません
xi.lin 2014

1
@BradyDowling同意する。そして、あなたがPRの差分を確認したい場合は、あなたが新しいと、コマンドラインで行うことができghCLI:stackoverflow.com/a/62031065/6309
VonC

126

違いを確認するには:

作業コピーとステージング領域:

% git diff

ステージング領域と最新のコミット:

% git diff --staged

作業コピーとコミット4ac0a6733:

% git diff 4ac0a6733

コミット4ac0a6733と最新のコミット:

% git diff 4ac0a6733 HEAD

4ac0a6733をコミットし、826793951をコミット

% git diff 4ac0a6733 826793951

詳細は公式ドキュメントをご覧ください。


7
また、あなたは本当にちょうどそれらのコミットでは、1つのファイルの差分を確認したい場合や与えられたこれらの例のいずれかです。重複しているため、も参照してください。git diff {x} {y} -- filename{x}{y}git log -p
マイケル

54

各コミットで導入された変更を確認したい場合は、「git log -p」を試してください。


13
  1. gitk --all
  2. 最初のコミットを選択
  3. もう一方を右クリックして、選択した差分を比較→これ

実際のgitkとは異なるコミッターAuthorを表示しているため、私はgitkを少し信用し始めています。
Ciasto piekarz 2018

10

gitkは違いを見るために使用します:

gitk k73ud..dj374

簡単にレビューできるようにGUIモードがあります。


7

二つの異なるコミットの間の違いを見るために(のは彼ら呼ぶことaとしb、使用)

git diff a..b
  • 差ことに注意してくださいaとはbとは反対であるba

最後のコミットとまだコミットされていない変更の違いを確認するには、次を使用します

git diff

後でその違いに戻りたい場合は、ファイルに保存できます。

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

5

プル後の最後の2つのコミットの変更をチェックするのに最も簡単です。

git diff HEAD~2 

3

2つのコミットの差分を表示するスクリプトを書きましたが、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
興味深いスクリプト。+1
VonC

2

受け入れられた答えは良いです。

ここにもう一度置くだけなので、後で簡単に理解して試すことができます

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

上記のすべてのコマンドで同じdiffを取得しました。

上記は、
1。commit c1と別のcommit c2の違いを確認するのに役立ちます
。2。差分を示し、変更を別のブランチに適用するために使用できるパッチファイルを作成する

違いが正しく表示されない場合
、c1とc2が間違っている可能性が
あるため、c1からc0のようにコミット前に、またはc2からc3のようにコミット後に調整します。

gitkコミットSHAを表示するために使用します。最初の8文字は、c0、c1、c2、またはc3として使用するのに十分です。Gitlab>リポジトリ>コミットなどからコミットIDを確認することもできます。

お役に立てば幸いです。


0

一番下(最も古い)にもう1つのコミットがあるとすると、これは非常に簡単になります。

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

これで、以下を使用すると目的を簡単に達成できます。

git diff k73ud oldestCommit

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.