我的代码运行良好并创建了一个分支,以便在git checkout -b messaging
的工作计算机上进行一些重大更改。我提交了部分完成的工作并将其推送到我的远程存储库git push origin messaging
。现在我回家了,我做了一个git pull origin messaging
并且在那个分支上,但我想切换回主人,但是git checkout master
给了我以下信息:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
我修改messaging
分支的所有文件都在那里。 git status
通知我我在分支master
上,但是我的分支在origin/master
之前提交了1次。我已经发现我可以通过两种方式访问真正的主人:
git checkout origin/master
git checkout master~1
但是我对为什么会发生这种情况感到困惑,并且我想确保我对master
的更改不会影响messaging
分支,反之亦然。我想要做的是将origin/master
设置为我的本地master
并将messaging
保留在其单独的分支中。我是否做错了让master
指向家用计算机上的messaging
提交?在这一点上,我希望有两个完全孤立的分支。
考虑更多,当我git pull origin messaging
我在master
分支上时,是否确实将messaging
分支合并到了我的本地master
?如果是这样,我应该做什么(创建本地messaging
分支并进入该分支?)如何在没有master
更改的情况下将本地messaging
指回提交?
答案 0 :(得分:5)
我想你已回答了自己的问题。来自git pull
的手册:
将来自远程存储库的更改合并到当前分支中。在默认模式下,git pull是git fetch的简写,后跟git merge FETCH_HEAD。
换句话说,你拉了远程消息'分支到您当地的主分支。
如果不真正理解它所做的事情,这是git pull
的一般危险。从本质上讲,它是git fetch
后跟git merge
,在这种情况下显然不是你想要的。您可能想要做的是git fetch
后跟git checkout --track origin/messaging
。这将创建一个跟踪远程的本地messaging
分支 - 这可能是您期望的行为。
This blog entry很好地解释了git pull
以及为什么你最好明确地获取和合并。
答案 1 :(得分:5)
哦,git pull
...我不喜欢git pull
;所有这一切都让人困惑。那发生了什么?
直到你回家的所有事情git pull origin messaging
都很好。如果您运行git branch -av
,则会看到origin/master
和origin/messaging
指向您想要的提交。
那么,拉动做了什么?
git pull
实际上只是git fetch
后跟git merge
的包装器。 git fetch
很容易;它只是收集了有关您在本地没有的遥控器(由origin
指定)的任何快照的信息。在这种情况下,一个名为origin/messaging
的提交和分支。然后,pull git merge origin/messaging
将origin/messaging
分支合并到您当前签出的任何分支(master
)。因此,您无意中将更改从origin/messaging
提取到master
。
让我们解决问题。首先,把主人放回原处:
git checkout master
git reset --hard origin/master
现在,根据远程分支检查名为messaging
的本地分支:
git checkout -b --track messaging origin/messaging
您现在可以继续使用messaging
分支。
将来,我建议避免使用git pull
。我发现它的语义令人困惑。相反,运行git fetch
,然后更新每个分支,因为您有兴趣使用合并或rebase处理它们。
答案 2 :(得分:0)
是的,你的拉取了一个fetch并将分支合并到你的主分支中。是的,你是对的,你应该已经创建了一个本地消息传递分支并进入了它。
考虑将其分解为2个命令git fetch then git merge origin/XX
,以便您100%清楚发生了什么。