buntu 10.04 (Lucid Lynx)でGitを使用しています。
マスターにいくつかコミットしました。
ただし、これらのコミットの違いを取得したいと思います。それらはすべて私のmasterブランチにあります。
例えば:
commit dj374
made changes
commit y4746
made changes
commit k73ud
made changes
K73udとdj374の違いを知りたい。ただし、次の操作を行ったときに、k73ud
で行った変更が表示されませんでした。
git diff k73ud..dj374 > master.patch
試して
git diff k73ud^..dj374
結果の差分にk73ud
のすべての変更を含めるようにします。
git diff
は、2つのエンドポイントを比較します( コミット範囲の代わりに )。 OPはk73ud
によって導入された変更を確認するため、 k73ud
の最初の親コミット:k73ud^
(または k73ud^1
またはk73ud~
)を区別する必要があります。
そのようにすると、diff
の結果には、導入された変更sinceの代わりに、変更sincek73ud
parent(k73ud
自体からの変更を含むこと)が含まれますk73ud
(最大dj374
)。
また、試すことができます:
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
次の違いを確認するには:
作業コピーとステージング領域:
% git diff
ステージング領域と最新のコミット:
% git diff --staged
作業コピーとコミット4ac0a6733:
% git diff 4ac0a6733
コミット4ac0a6733と最新のコミット:
% git diff 4ac0a6733 HEAD
コミット4ac0a6733およびコミット826793951
% git diff 4ac0a6733 826793951
詳細については、 公式ドキュメント を参照してください。
各コミットで導入された変更を確認するには、「git log -p」を試してください
gitk --all
gitk
を使用して違いを確認します。
gitk k73ud..dj374
レビューが簡単になるように、GUIモードがあります。
2つの異なるコミットの違いを確認するには(それらをa
とb
と呼びましょう)、使用します
git diff a..b
a
とb
の違いは、b
とa
の反対です。最後のコミットとまだコミットされていない変更の違いを確認するには、使用します
git diff
後で違いに戻れるようにする場合は、ファイルに保存できます。
git diff a..b > ../project.diff
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)
プル後の最後の2つのコミットの変更をチェックする最も簡単な方法:
git diff HEAD~2
最下部(最も古い)にもう1つのコミットがあるとしましょう。そうすると、これは非常に簡単になります。
commit dj374
made changes
commit y4746
made changes
commit k73ud
made changes
commit oldestCommit
made changes
さて、以下を使用すると簡単に目的を達成できます。
git diff k73ud oldestCommit