Показать различия между коммитами
Я использую Git на Ubuntu 10.04 (Lucid Lynx).
Я сделал некоторые поручения своему хозяину.
Тем не менее, я хочу получить разницу между этими коммитами. Все они в моей основной ветке.
Например:
commit dj374
made changes
commit y4746
made changes
commit k73ud
made changes
Я хочу получить разницу между k73ud и dj374. Однако, когда я сделал следующее, я не смог увидеть изменения, которые я сделал в k73ud
.
git diff k73ud..dj374 > master.patch
Ответы
Ответ 1
Пытаться
git diff k73ud^..dj374
чтобы убедиться, что все изменения k73ud
в результирующий дифференциал.
git diff
сравнивает две конечные точки (вместо диапазона фиксации). Так как ОП хочет видеть изменения, внесенные k73ud
, ему/ей необходимо отличать первый родительский коммит k73ud
: k73ud^
(или k73ud^1
или k73ud~
).
Таким образом, результаты diff
будут включать изменения, начиная с k73ud
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
Ответ 2
Чтобы увидеть разницу между:
Ваша рабочая копия и область подготовки:
% git diff
Стадион и последний коммит:
% git diff --staged
Ваш рабочий экземпляр и передайте 4ac0a6733:
% git diff 4ac0a6733
Фиксация 4ac0a6733 и последняя фиксация:
% git diff 4ac0a6733 HEAD
Зафиксируйте 4ac0a6733 и закажите 826793951
% git diff 4ac0a6733 826793951
Для получения дополнительной информации см. Официальную документацию.
Ответ 3
Если вы хотите увидеть изменения, внесенные с каждым фиксацией, попробуйте "git log -p"
Ответ 4
Я использую gitk
чтобы увидеть разницу:
gitk k73ud..dj374
Он имеет режим графического интерфейса, так что обзор проще.
Ответ 5
-
gitk --all
- Выберите первый коммит
- Щелкните правой кнопкой мыши на другой, затем выберите diff → этот
Ответ 6
Чтобы увидеть разницу между двумя разными коммитами (пусть они называются a
и b
), используйте
git diff a..b
- Обратите внимание, что разница между
a
и b
противоположна b
и a
.
Чтобы увидеть разницу между вашим последним коммитом и еще не зафиксированными изменениями, используйте
git diff
Если вы хотите иметь возможность вернуться к разнице позже, вы можете сохранить ее в файле.
git diff a..b > ../project.diff
Ответ 7
Я написал скрипт, который отображает diff между двумя коммитами, хорошо работает на 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)
Ответ 8
Простейшая проверка изменений в 2 последних коммитах после pull:
git diff HEAD~2
Ответ 9
Для проверки полных изменений:
git diff <commit_Id_1> <commit_Id_2>
Для проверки только измененных/добавленных/удаленных файлов:
git diff <commit_Id_1> <commit_Id_2> --name-only
ПРИМЕЧАНИЕ. Для проверки diff без фиксации между ними вам не нужно указывать идентификаторы коммитов.
Ответ 10
Допустим, у вас есть еще один коммит внизу (самый старый), тогда это становится довольно просто:
commit dj374
made changes
commit y4746
made changes
commit k73ud
made changes
commit oldestCommit
made changes
Теперь, использование ниже будет легко серверной цели.
git diff k73ud oldestCommit
Ответ 11
Используйте эту команду для различия между commit и unstaged:
git difftool --dir-diff