7

假设我从存储库的 URL 进行了 Git 克隆。我对文件做了一些更改,做了一个 Git 提交。

当我执行 agit pull时,我看到它显示“Already up-to-date”。

它不应该显示一些说我不是最新的东西吗?

我的问题是:

  1. 假设我对本地存储库进行了上述更改,但两天内没有提交,但是在两天结束之前,其他人对远程存储库进行了更改。我必须采取哪些步骤来确保我不会覆盖远程存储库中的更改,或者至少能够在提交之前提取最新的更改?

  2. 有什么方法可以区分我的本地存储库和远程存储库以检查有什么区别?(如果我只是想回忆一下我以前有什么?)

4

2 回答 2

12

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

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

要回答您的第一个问题:

  1. git commit:在您自己的分支上提交您的更改,与远程存储库中发生的事情完全无关。
  2. git fetch origin: 获取远程存储库 ( origin) 的内容,但将它们保存在origin/branch分支下。此时您自己的代码不受影响。
  3. git merge origin/master: 将远程存储库(您刚才获取的)的分支与当前分支合并origin/mastermasterorigin
  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

这是在您克隆存储库之后。现在你说你在本地分支上做了一个新的提交master

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

所以这里有两点需要注意。

  1. 假设 remote 中的其他人没有任何活动origin,则没有什么新东西要获取。所以git fetch origin master告诉你没有什么新鲜事。

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

如果您使用fetchandmerge而不是pull,您可以很容易地理解双命令 ( pull) 的哪一部分是导致意外(在您看来)行为的部分。

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

A -> B -> C -> D -> E -> F
                         |
                         |\- master
                         |
                          \- origin/master
于 2012-11-13T17:05:48.757 回答
4

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

如果您确实想查看是否有人更改了某些内容,您可以运行此git fetch然后git status. Status 将打印出哪些文件在本地发生了更改,但它也会显示类似“您的分支在 origin/master 之前 2 个提交”之类的内容,这意味着您有 2 个提交尚未推送到服务器。如果其他人也推送到服务器,那么它会说“您的本地分支和源/主服务器已经分歧。这意味着您和其他人都已承诺主服务器,当您拉动时它会尝试合并它们, 如上所述。

于 2012-11-13T16:55:38.933 回答