如何在git中检测本地repo和远程repo之间的差异?

Rol*_*ndo 8 git

说我从存储库的url做了一个git clone.我对文件做了一些更改,做了一个git提交.

当我做一个git pull,我看到它说"已经是最新的"

它不应该表明我不是最新的东西吗?

我的问题是:

  1. 说我做了上面的改变到我的本地回购,但是没有提交2天,但是在2天之前,其他人已经改变了远程回购.我必须采取哪些措施来确保我不会覆盖远程仓库中的更改,或者至少能够在提交之前提取最新的更改?

  2. 有没有办法在我的本地仓库和远程仓库之间进行区分,以检查它们之间存在哪些差异?(如果我只是想回忆一下之前的情况?)

Sha*_*baz 12

我的第一个建议是不git pull.做一个git fetch跟着一个git merge.

回答你的第零个问题:事实上,你最新的.您拥有远程存储库具有的所有提交.因此,没有什么可以获取或合并1.

回答你的第一个问题:

  1. git commit:在您自己的分支上提交您的更改,与远程存储库中发生的事情完全无关.
  2. git fetch origin:获取远程存储库(origin)的内容,但将它们保存在origin/branch分支下.此时您自己的代码不受影响.
  3. git merge origin/master:merge origin/master是您当前分支master的远程存储库origin(您刚刚获取)的分支.
  4. git push origin:将提交和合并推回到远程存储库

回答你的第二个问题:

  1. git fetch origin:更新origin/branch分支.
  2. git diff origin/master:获取当前分支和分支之间的差异origin/master.

1假设这是您的存储库中的提交最初在分支上的样子master:

A -> B -> C -> D -> E
                    |
                    |\- master
                    |
                     \- origin/master
Run Code Online (Sandbox Code Playgroud)

克隆存储库后就是这样.现在你说你在本地分支上做了一个新的提交master:

A -> B -> C -> D -> E -> F
                    |    |
                    |     \- master
                    |
                     \- origin/master
Run Code Online (Sandbox Code Playgroud)

所以这里有两件事需要注意.

  1. 假设遥控器中的其他人没有活动origin,则没有什么新东西可以获取.所以git fetch origin master告诉你没有什么新东西.

  2. 如果你这样做git merge origin/master,再没有什么可以合并的.origin/master是一种前缀master.换句话说,master已经包含了所有提交origin/master,因此没有什么新东西可以合并.

如果你使用过fetchmerge不是代替pull,你可以很容易地理解double-command(pull)的哪一部分是导致意外(在你看来)行为的部分.

当然,经过一段时间后git push origin master,你会得到:

A -> B -> C -> D -> E -> F
                         |
                         |\- master
                         |
                          \- origin/master
Run Code Online (Sandbox Code Playgroud)