Jas*_*aat 3 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.
Run Code Online (Sandbox Code Playgroud)
我修改messaging分支的所有文件都在那里. git status告诉我我在分支机构master,但我的分支在origin/master1提交之前.我发现我可以通过两种方式找到真正的主人:
git checkout origin/master
git checkout master~1
Run Code Online (Sandbox Code Playgroud)
但是我很困惑为什么会发生这种情况,我想确保我的更改master不会影响messaging分支,反之亦然.我想做的就是让origin/master我的本地人master也留messaging在它的独立分支.我是否做错了什么来master指出messaging我家用电脑上的提交?在这一点上,我希望有两个完全孤立的分支.
考虑更多,当我这样做时,git pull origin messaging我在我的master分支上,这实际上是否将messaging分支合并到我的本地master?如果是这样,我应该做什么(创建本地messaging分支并拉入其中?)如何master在没有messaging更改的情况下将本地指向提交?
我想你已回答了自己的问题.从手册git pull:
将来自远程存储库的更改合并到当前分支中.在默认模式下,git pull是git fetch的简写,后跟git merge FETCH_HEAD.
换句话说,您将远程"消息传递"分支拉入本地主分支.
如果git pull没有真正了解它正在做什么,这是一个普遍的危险.从本质上讲,它是a git fetch后跟a git merge,在这种情况下显然不是你想要的.你可能想要做什么git fetch之后git checkout --track origin/messaging.这将创建一个messaging跟踪远程的本地分支 - 这可能是您期望的行为.
Mark Longair的这篇博客文章很好地解释了git pull为什么你通常更好地明确获取和合并.
哦,git pull......我不喜欢git pull; 所有这一切都让人困惑.所以发生了什么事?
在家和跑步之前一切都git pull origin messaging很好.如果你运行,git branch -av你会看到origin/master并origin/messaging指向你想要的提交.
那么,拉动做了什么?
git pull实际上只是a git fetch后面的一个包装器git merge.git fetch简单; 它只收集origin了你在本地没有的遥控器(指定)的任何快照的信息.在这种情况下,一个提交和分支命名origin/messaging.然后,pull run git merge origin/messaging将origin/messaging分支合并到您当前检出的任何分支(master).所以,你无意中将变化从中拉origin/messaging入master.
让我们解决问题.首先,将主人放回原处:
git checkout master
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
现在,检查messaging基于远程分支调用的本地分支:
git checkout -b --track messaging origin/messaging
Run Code Online (Sandbox Code Playgroud)
您现在可以继续在messaging分支机构上工作了.
将来,我建议避免git pull.我发现它的语义令人困惑.相反,运行git fetch然后更新每个分支,因为您有兴趣使用合并或rebase处理它们.
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |