Git 为什么本地存储库和远程存储库之间的差异与提交的不同?
我有一个合并冲突,我想看到的第一件事是文件的本地版本和远程版本之间的区别。为此,我已执行以下命令:Git 为什么本地存储库和远程存储库之间的差异与提交的不同?,git,git-diff,Git,Git Diff,我有一个合并冲突,我想看到的第一件事是文件的本地版本和远程版本之间的区别。为此,我已执行以下命令: git diff origin:path/to/my/file.py path/to/my/file.py 这样,我看到我的本地版本有一些额外的块 然后我想看看我到底犯了什么。所以我执行了: git diff --staged path/to/my/file.py 令我惊讶的是,我看到了另一个与前一个命令返回的块不同的更改块 我在文本编辑器中打开了我的文件,看到了这两个块。现在我不知道如何解释
git diff origin:path/to/my/file.py path/to/my/file.py
这样,我看到我的本地版本有一些额外的块
然后我想看看我到底犯了什么。所以我执行了:
git diff --staged path/to/my/file.py
令我惊讶的是,我看到了另一个与前一个命令返回的块不同的更改块
我在文本编辑器中打开了我的文件,看到了这两个块。现在我不知道如何解释它
看起来本地版本和远程版本之间存在差异,而这一差异不是我所承诺的差异。您的一些更改已暂存,其他更改未暂存。这两个命令都由第一个命令显示。第二个只显示那些已暂存的更改 请执行:
git add path/to/my/file.py
然后,
git diff--staged
将显示与第一个命令相同的输出 您的一些更改是阶段性的,其他更改不是。这两个命令都由第一个命令显示。第二个只显示那些已暂存的更改
请执行:
git add path/to/my/file.py
然后,
git diff--staged
将显示与第一个命令相同的输出 我不知道为什么你一开始就认为这些差别是一样的
请记住,origin:path/to/my/file.py
是指从origin
解析的提交中提取的path/to/my/file.py
版本,通常是origin/HEAD
,通常是origin/master
。然后,git diff
命令将把从提交中提取的文件与当前工作树中的任何文件进行比较,如果您正在解决合并冲突,则该文件通常是在冲突周围有冲突标记的版本
旁白:git diff
请注意,在合并冲突期间运行git diff
会试图显示组合的diff。但是运行git diff:
可以避免这种情况。同时,运行git diff--staged
只是说:
$ git diff --staged path/to/file
* Unmerged path path/to/file
(除非您已从工作树中git add
ed了path/to/file
的一个版本,以告诉git您已经正确合并了该文件,在这种情况下,它会将HEAD
版本与您通过git add
ing复制到索引中的版本进行比较)
git merge正在做什么
这不是git merge
所关注和合并的内容。git merge
关注的是两个差异:
- 一个差异是从合并基础(以提交为准)到
头
- 第二个差异是从合并基础到另一个头部,无论是哪个提交(可能
,可能不是)origin/master
git merge origin/master
,现在正在查看路径/to/my/file.py上的合并冲突。您的Git已首次运行:
git merge-base --all HEAD origin/master
如果运气好,这只会生成一个提交哈希ID。1您可以将其保存在变量中:
base=$(git merge-base --all HEAD origin/master)
然后在两个特定的差异中使用它:
git diff $base HEAD -- path/to/my/file.py # what git thinks I changed
git diff $base origin/master -- path/to/my/file.py # what git thinks they changed
如果要直接比较这三个文件,可以将它们提取到临时文件中。例如,git mergetool
就是这样做的:它从这三个提交中提取基本路径/to/my/file.py
、本地(头)文件和另一个(“远程头”)文件,然后在所有三个文件上运行您选择的合并工具
如果
git merge base--all
生成多个散列ID,那么您的git merge-s recursive
对所有这些提交进行了内部合并,将结果提交为临时提交,并将该提交的散列用作合并基。我不确定为什么您首先希望这些差异相同
请记住,origin:path/to/my/file.py
是指从origin
解析的提交中提取的path/to/my/file.py
版本,通常是origin/HEAD
,通常是origin/master
。然后,git diff
命令将把从提交中提取的文件与当前工作树中的任何文件进行比较,如果您正在解决合并冲突,则该文件通常是在冲突周围有冲突标记的版本
旁白:git diff
请注意,在合并冲突期间运行git diff
会试图显示组合的diff。但是运行git diff:
可以避免这种情况。同时,运行git diff--staged
只是说:
$ git diff --staged path/to/file
* Unmerged path path/to/file
(除非您已从工作树中git add
ed了path/to/file
的一个版本,以告诉git您已经正确合并了该文件,在这种情况下,它会将HEAD
版本与您通过git add
ing复制到索引中的版本进行比较)
git merge正在做什么
这不是git merge
所关注和合并的内容。git merge
关注的是两个差异:
- 一个差异是从合并基础(以提交为准)到
头
- 第二个差异是从合并基础到另一个头部,无论是哪个提交(可能
,可能不是)origin/master
git merge origin/master
,现在正在查看路径/to/my/file.py上的合并冲突。您的Git已首次运行:
git merge-base --all HEAD origin/master
如果运气好,这只会生成一个提交哈希ID。1您可以将其保存在变量中:
base=$(git merge-base --all HEAD origin/master)
然后在两个特定的差异中使用它:
git diff $base HEAD -- path/to/my/file.py # what git thinks I changed
git diff $base origin/master -- path/to/my/file.py # what git thinks they changed
如果要直接比较这三个文件,可以将它们提取到临时文件中。