Як зробити так, щоб git diff
відображатись лише різниця між двома комітами, за винятком інших комітетів між ними?
Як зробити так, щоб git diff
відображатись лише різниця між двома комітами, за винятком інших комітетів між ними?
Відповіді:
ви можете просто передати 2 коміти на git diff, як:
-> git diff 0da94be 59ff30c > my.patch
-> git apply my.patch
my.patch
в іншу галузь?
Просити різницю / між / двома елементами без включення комітетів між ними має мало сенсу. Коміти - це лише знімки вмісту сховища; прохання про різницю між двома обов'язково включає їх. Тож питання полягає в тому, що ви насправді шукаєте?
Як запропонував Вільям, збирання вишні може надати вам дельту одного комітету, переобладнаного на інший. Це є:
$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached
Це приймає "abcdef", порівнює його з його безпосереднім предком, а потім застосовує цю різницю поверх '012345'. Потім з'являється ця нова різниця - єдиною зміною є контекст, що походить від "012345", а не від безпосереднього предка abcdef. Звичайно, у вас можуть виникнути конфлікти тощо, тому в більшості випадків це не дуже корисний процес.
Якщо вас просто цікавить сам abcdef, ви можете зробити:
$ git log -u -1 abcdef
Це порівнює abcdef з його безпосереднім предком, один, і, як правило, те, що ви хочете.
І звичайно
$ git diff 012345..abcdef
дає всі відмінності між цими двома комітами.
Це допомогло б краще зрозуміти, що ви намагаєтесь досягти - як я вже згадував, прохання про різницю між двома комітами без того, що між ними, насправді не має сенсу.
origin/featurebranch#HEAD
з local/featurebranch#HEAD
може допомогти вам переконатися , що ви не зробили нічого гидоту під час врегулювання конфліктів.
Для порівняння двох git виконує 12345 та abcdef як патчі, можна використовувати команду diff як
diff <(git show 123456) <(git show abcdef)
git diff <(git show 123456) <(git show abcdef)
не працює; diff <(...) <(...)
робить. (Я просто спробував).
git diff 123456 abcdef
.
diff
з результатами двох diff
с. Це включає читання та порівняння двох вхідних потоків. diff
(GNU або Unix diff
) може це зробити, хоча git diff
не може. Деякі можуть задатися питанням, чому хтось хотів би це зробити. Я зараз в середині займаюся цим, прибираючи злиття, яке пішло погано.
Для перевірки повних змін:
git diff <commit_Id_1> <commit_Id_2>
Для перевірки лише змінених / доданих / видалених файлів:
git diff <commit_Id_1> <commit_Id_2> --name-only
ПРИМІТКА . Для перевірки відмінності між комісіями між ними, вам не потрібно ставити ідентифікатори комісій.
Скажімо, у вас це є
A
|
B A0
| |
C D
\ /
|
...
І ви хочете переконатися, що A
це те саме, що A0
.
Це зробить трюк:
$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff
Припустимо, ви хочете побачити різницю між комісіями 012345 та abcdef. Виконайте наступні дії:
$ git замовлення 012345 $ git cherry-pick -n abcdef $ git diff - кешована
Як що до цього:
git diff abcdef 123456 | less
Зручно просто передавати його менше, якщо ви хочете порівнювати багато різних відмінностей.
Оскільки Git 2.19, ви можете просто використовувати:
git range-diff rev1...rev2
- порівняйте два дерева фіксації, починаючи з їх спільного предка
або
git range-diff rev1~..rev1 rev2~..rev2
- порівняти зміни, внесені двома даними комітами
Мої alias
налаштування у ~/.bashrc
файлі для git diff
:
alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits
Я написав сценарій, який відображає різницю між двома комітами, добре працює на 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)