说我从存储库的url做了一个git clone。我对文件做了一些更改,做了一个git commit。
当我做一个git pull时,我看到它说“已经是最新的”
它不应该表明我不是最新的东西吗?
我的问题是:
说我做了上面的更改到我的本地仓库,但是没有提交2天,但是在2天之前,其他人已经对远程仓库进行了更改。我必须采取哪些措施来确保我不会覆盖远程仓库中的更改,或者至少能够在提交之前提取最新的更改?
有没有办法在我的本地仓库和远程仓库之间进行区分,以检查它们之间存在哪些差异? (如果我只是想回忆一下以前的情况?)
答案 0 :(得分:11)
我的第一个建议是不git pull
。执行git fetch
后跟git merge
。
回答你的第零个问题:事实上,你 是最新的。您拥有远程存储库具有的所有提交。因此,没有任何东西可以获取或合并 1 。
回答你的第一个问题:
git commit
:在您自己的分支上提交您的更改,与远程存储库中发生的事情完全无关。git fetch origin
:获取远程存储库(origin
)的内容,但将它们保存在origin/branch
分支下。此时您自己的代码不受影响。git merge origin/master
:合并origin/master
,它是您当前分支的远程存储库master
的{{1}}分支(您刚才提取的)。origin
:将提交和合并推回到远程存储库回答你的第二个问题:
git push origin
:更新git fetch origin
分支。origin/branch
:获取当前分支与分支git diff origin/master
之间的差异。 1 假设这是您的存储库中的提交最初的样子,在分支origin/master
上:
master
在克隆存储库之后,这是正确的。现在您说您已在本地分支A -> B -> C -> D -> E
|
|\- master
|
\- origin/master
上进行了新的提交:
master
所以这里有两件事需要注意。
假设远程A -> B -> C -> D -> E -> F
| |
| \- master
|
\- origin/master
中的其他人没有活动,则没有什么新东西可以获取。所以origin
告诉你没有什么新东西。
如果再次执行git fetch origin master
,则无需合并。 git merge origin/master
是origin/master
的前缀。换句话说,master
已经包含了master
所拥有的所有提交,因此合并没有新内容。
如果您使用origin/master
和fetch
代替merge
,则可以轻松了解双命令(pull
)的哪一部分是导致意外(在您看来)行为。
当然,在pull
之后,你会得到:
git push origin master
答案 1 :(得分:4)
当您拉动时,它会从服务器中提取历史记录,并自动尝试将您已更改的内容与其他人更改的内容合并。如果它可以自动执行,那么它将成功,您将看不到任何内容,如果它失败,那么您将被要求修复任何冲突。您永远无法以静默方式覆盖其他人所做的更改。
如果您确实想要查看是否有人更改了某些内容,您可以运行此git fetch
,然后git status
。状态将打印出本地更改了哪些文件,但它也会说“您的分支是在原始/主服务器之前提交2个提交”,这意味着您有2个未提交到服务器的提交。如果其他人也推送到服务器,那么它会说“你的本地分支和原点/主人有分歧。这意味着你和其他人已经承诺掌握,当你拉它时会尝试合并它们,如上所述。