我是 Git 新手,现在我处于这种情况:
- 我有四个分支(master、b1、b2 和 b3)。
- 在我从事 b1-b3 工作之后,我意识到我在分支 master 上需要更改一些应该在所有其他分支中的东西。
- 我改变了我需要的东西
master
......这是我的问题:
如何使用master
分支代码更新所有其他分支?
我是 Git 新手,现在我处于这种情况:
master
......这是我的问题:如何使用master
分支代码更新所有其他分支?
你有两个选择:
第一个是合并,但这会为合并创建一个额外的提交。
检查每个分支:
git checkout b1
然后合并:
git merge origin/master
然后推:
git push origin b1
或者,您可以进行变基:
git fetch
git rebase origin/master
你基本上有两个选择:
你合并。这实际上非常简单,并且是一个完美的本地操作:
git checkout b1
git merge master
# repeat for b2 and b3
这使历史保持原样:您从 master 分叉,您对所有分支进行了更改,最后您将 master 的更改合并到所有三个分支中。
git
可以很好地处理这种情况,它是为同时在各个方向发生的合并而设计的。您可以相信它能够正确地将所有线程聚集在一起。它根本不关心分支是b1
合并master
还是master
合并b1
,合并提交在 git 中看起来都一样。唯一的区别是,哪个分支最终指向这个合并提交。
你变基。具有 SVN 或类似背景的人会觉得这更直观。这些命令类似于合并案例:
git checkout b1
git rebase master
# repeat for b2 and b3
人们喜欢这种方法,因为它在所有分支中都保留了线性历史。然而,这个线性历史是一个谎言,你应该意识到它是一个谎言。考虑这个提交图:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
合并产生了真实的历史:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
然而,变基会为您提供以下历史记录:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
关键是,提交E'
、F'
和G'
从未真正存在过,并且可能从未经过测试。他们甚至可能无法编译。实际上,通过 rebase 创建无意义的提交非常容易,尤其是master
当b1
.
这样做的结果可能是,您无法区分三个提交中的哪一个E
,F
实际上G
引入了回归,从而降低了git bisect
.
我并不是说你不应该使用git rebase
. 它有它的用途。但是,无论何时使用它,您都需要意识到您在历史上撒谎的事实。你至少应该编译测试新的提交。
git rebase master
是这样做的正确方法。合并意味着将为合并创建提交,而变基则不会。
如果您一直在断断续续地在一个分支上工作,或者在您一直在处理某事时在其他分支上发生了很多事情,那么最好将您的分支重新定位到 master 上。这使历史保持整洁,并使事情更容易理解。
git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed
笔记:
在http://git-scm.com/book/ch3-6.html有一章关于变基,以及网络上的大量其他资源。
@cmaster 做出了最详尽的回答。简单来说:
git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`
您不应该重写分支历史记录,而是将它们保持在实际状态以供将来参考。在合并到 master 时,它会创建一个额外的提交,但这很便宜。提交不收费。
使用您的主分支副本更新其他分支,例如(备份)。您可以按照任何一种方式(变基或合并)...
合并分支(将有一个额外的自动提交到备份分支)。
注意:变基只不过是建立一个新的基地(一个新的副本)
git checkout backup git merge master git push
(如果有任何类似backup2等的其他分支,请重复此操作)
git checkout backup git rebase master git push
(如果有任何类似backup2等的其他分支,请重复此操作)
您可以合并,也可以使用git cherry-pick跨分支应用单个提交。
在对 master 进行 rebase 后,您需要进行有力的推动
从 master 更新您的分支:
git checkout master
git pull
git checkout your_branch
git merge master
如果您想恢复到上次提交并删除日志历史记录
使用下面的命令假设您想转到具有 commitID SHA - 71e2e57458bde883a37b332035f784c6653ec509的上一个提交,您可以指向此提交,在此提交后它不会显示任何日志消息,之后所有历史记录都将被删除。
git push origin +71e2e57458bde883a37b332035f784c6653ec509^:master
这个问题有两种选择。
1) git rebase
2)git合并
只有在合并的情况下与以上两者存在差异,才会在历史记录中有额外的提交
1) git checkout 分支(b1,b2,b3)
2) git rebase origin/master (如果发生冲突,通过执行 git rebase --continue 在本地解决)
3) git推送
或者, git merge 选项是类似的方式
1) git checkout "your_branch"(b1,b2,b3)
2) git 合并大师
3) git推送