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
    ,可能不是)
您可以通过首先获得merge-base-commit散列来获得这两个差异。比方说,为了简化操作,您运行了
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
    ,可能不是)
您可以通过首先获得merge-base-commit散列来获得这两个差异。比方说,为了简化操作,您运行了
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
如果要直接比较这三个文件,可以将它们提取到临时文件中。