Git分支和切换回主人的领先优势?

时间:2013-05-23 01:27:44

标签: git branching-and-merging

我的代码运行良好并创建了一个分支,以便在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指回提交?

3 个答案:

答案 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分支 - 这可能是您期望的行为。

Mark Longair的

This blog entry很好地解释了git pull以及为什么你最好明确地获取和合并。

答案 1 :(得分:5)

哦,git pull ...我不喜欢git pull;所有这一切都让人困惑。那发生了什么?

直到你回家的所有事情git pull origin messaging都很好。如果您运行git branch -av,则会看到origin/masterorigin/messaging指向您想要的提交。

那么,拉动做了什么?

git pull实际上只是git fetch后跟git merge的包装器。 git fetch很容易;它只是收集了有关您在本地没有的遥控器(由origin指定)的任何快照的信息。在这种情况下,一个名为origin/messaging的提交和分支。然后,pull git merge origin/messagingorigin/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%清楚发生了什么。