在提交之间显示差异

我在10.04 Ubuntu  (Lucid Lynx)上使用Git。

我已经向我的主人许下了一些承诺。

但是,我想知道这些提交之间的区别。它们都在我的主分支上。

例如:

commit dj374
made changes


commit y4746
made changes


commit k73ud
made changes

我想知道k73ud和dj374的区别。然而,当我执行以下操作时,我无法看到我在k73ud中所做的更改。

git diff k73ud..dj374 > master.patch
530074 次浏览

试一试

git diff k73ud^..dj374

确保在结果diff中包含k73ud的所有更改。

git diff比较两个端点(而不是提交范围)。 由于OP想要看到k73ud引入的变化,他/她需要在__ABC0的第一个父提交:k73ud^(或__ABC3或k73ud~)之间进行区别

这样,diff结果将包括 k73ud父项的更改(意味着包括来自k73ud本身的更改),而不是引入 k73ud的更改(直到dj374)。

你也可以试试:

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

And(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 log -p"

我使用gitk来查看区别:

gitk k73ud..dj374

它有一个图形用户界面模式,因此审查更容易。

看看两者之间的区别:

您的工作副本和暂存区域:

% git diff

暂存区和最新提交:

% git diff --staged

你的工作副本并提交4ac0a6733:

% git diff 4ac0a6733

提交4ac0a6733和最新的提交:

% git diff 4ac0a6733 HEAD

提交4ac0a6733和提交826793951

% git diff 4ac0a6733 826793951

更多解释见官方文件

要查看两个不同的提交(让我们称它们为ab)之间的区别,使用

git diff a..b
  • 注意,ab之间的差异与ba相反。

要查看上次提交的更改和尚未提交的更改之间的差异,请使用

git diff

如果您希望以后能够查看差异,可以将其保存在文件中。

git diff a..b > ../project.diff
  1. gitk --all
  2. 选择第一次提交
  3. 另一个是右击,然后是Diff selected →这

使用这个命令来区分commit和unstaging:

git difftool --dir-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)

检查pull后最后2次提交的更改最简单:

git diff HEAD~2

假设你在底部(最老的)还有一个提交,那么这就变得很简单了:

commit dj374
made changes


commit y4746
made changes


commit k73ud
made changes


commit oldestCommit
made changes

现在,使用下面的方法将很容易达到目的。

git diff k73ud oldestCommit

接受的答案很好。

只是把它放在这里,所以它很容易理解&以后再试

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

对于上述所有命令,我都得到了相同的差异。

以上有助于
1. 查看commit c1和amp之间的差异;另一个提交c2
2. 还可以制作一个显示diff的补丁文件,并可用于将更改应用到另一个分支

如果没有正确显示差异
然后是c1 &C2可能被误解
所以在提交前将它们调整为a,比如c1到c0,或者在提交后将它们调整为c到c3

使用gitk来查看提交的sha,前8个字符足以将它们用作c0, c1, c2或c3。你还可以看到Gitlab > Repository > commit的提交id,等等。

希望这能有所帮助。

我总是喜欢使用命令行和用户友好的工具(GUI)在我的手中。两全其美。下面是我如何比较Git中的两次提交。

您可以显示两次提交之间的差异,如下所示。

在文本编辑器中编辑git配置文件:

git config --global -e

在Git配置文件中设置一个合适的diff工具(用户友好),就像Windows中的Meld一样:

[difftool "meld"]
cmd = "C:/Program Files (x86)/Meld/Meld.exe" "LOCAL\" \"REMOTE" --label "DIFF (ORIGINAL MY)"
prompt = false
path = C:\Program Files (x86)\Meld\Meld.exe

可以使用Chocolatey从命令行安装Meld:

choco install meld

让我们定义一个shell函数来帮助我们比较TEXT EDITOR中[alias]下的两个sha-s(提交):

[alias]
showchangesbetween = "!w() { git difftool \"$1\" \"$2\" --dir-diff --ignore-all-space; }; w"

要在Meld(或其他你喜欢的diff工具)的帮助下比较提交,只需在命令行输入:

git showchangesbetween somesha123 somesha456

提交sha-s是很容易看到的输入

 git log

为例。

下面的命令在Ubuntu 20.04和git v2.25.1上完美地工作:

git diff <base-commit-id> <target-commit-id>
 1. git diff <commit-id> <commit-id>
2. git diff HEAD^ HEAD     -(HEAD = current branch’s tip),( HEAD^ = version before the last commit)
3. git diff HEAD^ HEAD — ./file     (comparison to specified file)
4. git diff HEAD~5 HEAD           - (HEAD~5 refers to the last 5 commits.)