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

时间:2012-11-13 16:50:08

标签: git

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

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

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

我的问题是:

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

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

2 个答案:

答案 0 :(得分:11)

我的第一个建议是不git pull。执行git fetch后跟git merge

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

回答你的第一个问题:

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

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

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

      master

      在克隆存储库之后,这是正确的。现在您说您已在本地分支A -> B -> C -> D -> E | |\- master | \- origin/master 上进行了新的提交:

      master

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

      1. 假设远程A -> B -> C -> D -> E -> F | | | \- master | \- origin/master 中的其他人没有活动,则没有什么新东西可以获取。所以origin告诉你没有什么新东西。

      2. 如果再次执行git fetch origin master,则无需合并。 git merge origin/masterorigin/master前缀。换句话说,master已经包含了master所拥有的所有提交,因此合并没有新内容。

      3. 如果您使用origin/masterfetch代替merge,则可以轻松了解双命令(pull)的哪一部分是导致意外(在您看来)行为。

        当然,在pull之后,你会得到:

        git push origin master

答案 1 :(得分:4)

当您拉动时,它会从服务器中提取历史记录,并自动尝试将您已更改的内容与其他人更改的内容合并。如果它可以自动执行,那么它将成功,您将看不到任何内容,如果它失败,那么您将被要求修复任何冲突。您永远无法以静默方式覆盖其他人所做的更改。

如果您确实想要查看是否有人更改了某些内容,您可以运行此git fetch,然后git status。状态将打印出本地更改了哪些文件,但它也会说“您的分支是在原始/主服务器之前提交2个提交”,这意味着您有2个未提交到服务器的提交。如果其他人也推送到服务器,那么它会说“你的本地分支和原点/主人有分歧。这意味着你和其他人已经承诺掌握,当你拉它时会尝试合并它们,如上所述。