git - 我如何在 git 中管理 merge 和 rebase ?

标签 git merge rebase

我git rebase的目的。对于我,这说得通。基本上我有一个我正在处理的特性分支,我准备把它放到主分支中历史。对吧?

这是我们一直在做的事情。

  1. 创建功能分支
  2. 在我们构建功能时添加一堆提交
  3. 定期将 master 分支 merge 到 feature 分支(以避免 merge 过程中的痛苦)
  4. 当一切都完成后,将功能分支 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/

相关文章:

visual-studio-2013 - [合并] 和 [合并、分支] 之间的 TFS 差异

Git 改变 rebase

git - git rebase 错误 ("could not apply...")

git - 可视化 git 分支依赖

git - 如何将当前日期设置为 git 提交消息

git - 在 GitHub 上 merge pull 请求后如何同步我的本地主分支?

c++ - 递归部分解释

git - 在源分支中列出冲突文件路径的命令是什么

android - 编译错误说资源名称必须以字母开头

git - 如何在分支的第一个(根)提交上使用交互式 rebase ?