4

我的代码运行良好,并创建了一个分支来在我的工作计算机上使用git checkout -b messaging. 我提交了我部分完成的工作并将其推送到我的远程存储库git push origin messaging。现在我回家了,我做了一个git pull origin messaging并且在那个分支上,但是我想切换回 master,但是git checkout master给了我以下消息:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.

我修改messaging分支的所有文件都在那里。 git status通知我我在 branch 上master,但我的 branch 提前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

4

3 回答 3

6

哦,git pull……我不喜欢git pull;它所做的只是迷惑人们。所以发生了什么事?

直到你回家跑步之前的一切都git pull origin messaging很好。如果你运行git branch -av,你会看到origin/masterorigin/messaging指向你想要的提交。

那么,拉动是做什么的呢?

git pull实际上只是 agit fetch后跟a 的包装器git mergegit fetch简单; 它只是收集有关远程(由 指定origin)拥有的您在本地没有的任何快照的信息。在这种情况下,一个提交和分支名为origin/messaging. git merge origin/messaging然后,将分支合并origin/messaging到您当前签出的任何分支中的拉动运行( master)。origin/messaging因此,您无意中将更改从master.

让我们解决问题。首先,将 master 放回应有的位置:

git checkout master
git reset --hard origin/master

现在,检查一个messaging基于您的远程分支调用的本地分支:

git checkout -b --track messaging origin/messaging

您现在可以继续在messaging分支上工作。

将来,我建议避免使用git pull. 我发现它的语义令人困惑。相反,运行git fetch然后更新每个分支,因为您有兴趣使用合并或变基处理它们。

于 2013-05-23T01:42:32.187 回答
5

我想你已经回答了你自己的问题。从手册中git pull

将来自远程存储库的更改合并到当前分支中。在其默认模式下,git pull 是 git fetch 后跟 git merge FETCH_HEAD 的简写。

换句话说,您将远程“消息传递”分支拉入本地主分支。

git pull在没有真正了解它在做什么的情况下,这是一个普遍的危险。本质上,它是 agit fetch后跟 a git merge,在这种情况下,这显然不是您想要的。您可能想要做的git fetchgit checkout --track origin/messaging. 这将创建一个messaging跟踪远程的本地分支——这可能是您期望的行为。

Mark Longair 的这篇博客文章很好地解释git pull了为什么你通常最好明确地获取和合并。

于 2013-05-23T01:37:20.013 回答
0

是的,你的 pull 做了一个提取并将分支合并到你的主分支中。是的,你是对的,你应该创建一个本地消息传递分支并拉入其中。

考虑将其分解为 2 个命令git fetch then git merge origin/XX,以便您 100% 清楚正在发生的事情。

于 2013-05-23T01:43:09.670 回答