如何在Git中检测本地仓库和远程仓库之间的差异

7
假设我从一个仓库的URL进行了Git clone。我在文件中进行了一些更改,进行了Git commit。
当我执行 git pull 时,我看到它显示“已经是最新的”。
它不应该显示出我没有更新吗?
我的问题是:
1. 假设我对本地仓库进行了上述更改,但两天内没有提交,但在两天之内,其他人对远程仓库进行了更改。 我必须采取哪些步骤才能确保我不会覆盖远程仓库中的更改或至少能够在提交之前拉取最新的更改?
2. 是否有一种方法可以在本地仓库和远程仓库之间进行差异比较,以检查有哪些差异?(以防我只想回忆起我之前做过什么?)
2个回答

13
我的第一个建议是不要使用git pull命令。先执行git fetch,然后再执行git merge
回答你的第0个问题:实际上,你已经是最新的了。你拥有与远程仓库相同的所有提交记录。因此,没有需要获取或合并的内容。
回答你的第一个问题:
  1. git commit: 在自己的分支上提交更改,与远程仓库无关。
  2. git fetch origin: 获取远程仓库(origin)的内容,但将其保留在origin/branch分支下。此时,你自己的代码不受影响。
  3. git merge origin/master: 将刚刚获取的远程仓库originmaster分支与你当前的分支合并。
  4. git push origin: 推送提交和合并到远程仓库。
回答你的第二个问题:
  1. git fetch origin: 更新origin/branch分支。
  2. git diff origin/master: 获取当前分支与origin/master分支之间的差异。
A -> B -> C -> D -> E
                    |
                    |\- master
                    |
                     \- origin/master

你克隆仓库后立即进行此操作。现在你说你已经在本地分支master上做了新的提交:

A -> B -> C -> D -> E -> F
                    |    |
                    |     \- master
                    |
                     \- origin/master

这里有两件事情需要注意。

  1. 假设远程的 origin 没有被其他人改动过,那么就没有新的内容需要获取。所以执行 git fetch origin master 会告诉你没有新的内容。

  2. 如果你执行 git merge origin/master,同样地,没有任何内容需要合并。因为 origin/mastermaster 的一个前缀。换句话说,master 已经包含了所有 origin/master 的提交,所以没有新的内容需要合并。

如果你使用 fetchmerge 而不是 pull,你就可以轻松理解这个双命令 (pull) 中哪一部分导致了意外行为(在你的看法中)。

当然,在执行 git push origin master 之后,你会得到:

A -> B -> C -> D -> E -> F
                         |
                         |\- master
                         |
                          \- origin/master

4
当你进行pull操作时,它会从服务器中拉取历史记录,并尝试自动合并你所做的更改和其他人做的更改。如果可以自动完成,则不会有任何提示;如果无法自动完成,则需要解决冲突。你不能悄悄地覆盖其他人所做的更改。
如果想要查看其他人是否更改了某些内容,可以运行以下命令:git fetch和git status。status会打印出本地更改的文件列表,同时也会显示类似“你的分支比origin/master多2个提交”这样的信息,意思是你有2个提交还没有推送到服务器上。如果其他人也在服务器上推送修改,那么它会显示“你的本地分支和origin/master已经分开。这意味着你和其他人都在master上提交了修改,在你进行pull操作时,它会尝试合并它们,就像上面所描述的一样。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接