我git rebase的目的。对于我,这说得通。基本上我有一个我正在处理的特性分支,我准备把它放到主分支中历史。对吧?
这是我们一直在做的事情。
- 创建功能分支
- 在我们构建功能时添加一堆提交
- 定期将 master 分支 merge 到 feature 分支(以避免 merge 过程中的痛苦)
- 当一切都完成后,将功能分支 merge 到master
我看到的问题是,定期将 master 分支 merge 到功能分支会导致 rebase 时出现问题,因为现在我的功能 checkin 中混合了一堆 master 分支 checkin 。
这里正确的工作流程是什么?以下逗号在哪里发挥作用:
- git rebase -i Head^#
- git rebase 大师
- git merge 大师
- git-rerere
- git reset --hard HEAD^
最佳答案
您应该只在分支生命周期结束时与 master merge 一次,或者从 master merge 一次。功能/主题分支的想法是它只包含与功能相关的更改;当您反复 merge master 时,您会丢失它。 (你可以看一下Junio Hamano, the git maintainer, says about branches。)
你可以做一个“练习” merge ,你会扔掉它,然后使用 git-rerere
让 Git 自动记录你的 merge 决议,这样当你真正准备 merge 。参见 http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html背景和教程。这真的很酷,因为它允许您完成 merge 工作,而无需在任何地方显式提交,然后在您真正准备好创建 merge 时“神奇地”恢复该工作。因此,与其在最后进行一次大而痛苦的 merge ,您还可以在此过程中进行一系列较小的、希望更简单的中间“实践” merge 。粗略地说:
# Enable rerere
git config --global rerere.enabled 1
# Start a feature branch
git checkout -b feature
# Hack hack hack
git commit
git commit
# Practice merge
git merge master
# ...then throw the merge commit away, the work is saved by rerere
git reset --hard HEAD^
# Hack hack hack
git commit
# Really merge to master, reusing any saved work from rerere
git checkout master
git merge feature
git branch -d feature
另见 http://progit.org/2010/03/08/rerere.html获取另一个教程。
您还可以定期将您的主题分支 rebase 到 master 之上,然后在最后进行 merge 。
要处理像您当前所处的情况,有一个主题分支(例如名为 feature
),该分支包含来自 main 的一系列 merge 以及各种正在进行的提交,最简单的方法是进行压缩 merge 以生成一个“merge 的”工作树,然后在 main 上创建一个新的提交(或一系列提交)。例如:
git checkout master
git merge --squash feature
git commit
这将产生一个单一的提交,代表特征头部的树的状态,并 merge 到主节点中。
当然,您也可以针对此更改定期 merge 到 master
,留下 feature
的杂乱历史,并在以后更干净地工作.例如,简单地
git checkout master
git merge feature
继续前进。
关于git - 我如何在 git 中管理 merge 和 rebase ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4337364/