git diff
間にある他のコミットを除いて、2つのコミットの違いのみをどのように表示しますか?
git diff
間にある他のコミットを除いて、2つのコミットの違いのみをどのように表示しますか?
回答:
あなたは単純に2つのコミットをgit diffに渡すことができます:
-> git diff 0da94be 59ff30c > my.patch
-> git apply my.patch
my.patch
他のブランチにどのように申請できますか?
間にコミットを含めずに/ between / 2つのコミットの違いを求めることはほとんど意味がありません。コミットは、リポジトリのコンテンツの単なるスナップショットです。2つの違いを求めるには必ずそれらが含まれます。それで問題は、あなたが本当に何を探しているのですか?
ウィリアムが示唆したように、チェリーピッキングは、単一のコミットのデルタを別のコミットの上にリベースすることができます。あれは:
$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached
これは、コミット 'abcdef'を取り、それをその直接の祖先と比較し、その違いを '012345'に適用します。次に、この新しい違いが表示されます-唯一の変更点は、コンテキストが「abcdef」の直接の祖先ではなく「012345」からのものであることです。もちろん、競合などが発生する可能性があるため、ほとんどの場合、これはあまり有用なプロセスではありません。
あなただけのabcdef自体に興味があるなら、あなたはすることができます:
$ git log -u -1 abcdef
これは、abcdefとその直接の祖先を単独で比較したものであり、通常はこれで十分です。
そしてもちろん
$ git diff 012345..abcdef
これら2つのコミットの間のすべての違いを提供します。
それはあなたが達成しようとしていることをよりよく理解するのに役立ちます-私が述べたように、間に何もないのに2つのコミットの違いを求めることは実際には意味がありません。
origin/featurebranch#HEAD
するlocal/featurebranch#HEAD
ことで、競合解決中に何も変更しなかったことを確認できます。
2つのgit commit 12345とabcdefをパッチとして比較するには、次のようにdiffコマンドを使用できます。
diff <(git show 123456) <(git show abcdef)
git diff <(git show 123456) <(git show abcdef)
は機能しません。diff <(...) <(...)
します。(私はそれを試しました)。
git diff 123456 abcdef
。
diff
2つdiff
のs からの出力を使用しています。これには、2つの入力ストリームの読み取りと比較が含まれます。 diff
(GNU、またはUnix、diff
)はそれを行うことができますが、git diff
できません。なぜそんなことをしたいのかと思う人もいるでしょう。私は今それを行っている最中です。うまくいかなかったマージをクリーンアップしています。
完全な変更を確認するには:
git diff <commit_Id_1> <commit_Id_2>
変更/追加/削除されたファイルのみをチェックするには:
git diff <commit_Id_1> <commit_Id_2> --name-only
注:コミットせずに差分を確認する場合は、コミットIDを入力する必要はありません。
コミット012345とabcdefの違いを見たいとしましょう。以下はあなたが望むことをするはずです:
$ gitチェックアウト012345 $ git cherry-pick -n abcdef $ git diff --cached
これはどうですか:
git diff abcdef 123456 | less
さまざまなdiffをその場で比較したい場合は、パイプでlessに送ると便利です。
Git 2.19以降、次のように簡単に使用できます。
git range-diff rev1...rev2
-共通の祖先から始めて、2つのコミットツリーを比較する
または
git range-diff rev1~..rev1 rev2~..rev2
-2つの特定のコミットによって導入された変更の比較
私は2つのコミットの差分を表示するスクリプトを書き、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 <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 = 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)