如何在git中管理合并和重新定位?

Mic*_*cah 3 git merge rebase

我给出了rebase的目的.对于我,这说得通.基本上我有一个我正在研究的功能分支,我已经准备好把它放到主分支中我会做一个rebase来将我的所有提交压缩成一个干净的一个,这样它就可以很容易地集成到master中而不会让所有的混乱历史.对?

这就是我们一直在做的事情.

  1. 创建功能分支
  2. 在我们构建功能时添加一堆提交
  3. 定期将主分支合并到功能分支中(以避免在路上进行痛苦的合并)
  4. 一切都完成后,将功能分支合并到主服务器中

我看到的问题是,定期将master合并到功能分支会导致重新定位时出现问题,因为现在我的功能签入中混合了一堆主分支签到.

这里的工作流程是什么?以下逗号在哪里发挥作用:

  • git rebase -i Head ^#
  • git rebase master
  • git merge master
  • 混帐rerere
  • git reset --hard HEAD ^

Emi*_*Sit 5

在分支的生命周期结束时,您应该只与主服务器合并一次.功能/主题分支的想法是它只包含与功能相关的更改; 当你反复合并master时,你会失去它.(你可以读一下git维护者Junio Hamano对分支的看法.)

你可以做一个"练习"合并,你将丢弃,并使用git-rerere让Git自动记录你的合并分辨率,以便在你真正准备合并时可以重复使用它们.有关背景和教程,请参阅http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html.这真的很酷,因为它可以让你完成合并的工作,而无需在任何地方明确地提交它,然后当你真正准备创建合并时,"神奇地"恢复工作.因此,在最后,您可以进行一系列较小的,希望更简单的中间"练习"合并,而不是最后一次大的痛苦合并.粗略地说:

# 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
Run Code Online (Sandbox Code Playgroud)

另请参阅http://progit.org/2010/03/08/rerere.html以获取其他教程.

您还可以定期在master上重新分配主题分支,然后在最后进行合并.

为了处理你当前所处的情况,使用一个主题分支(比如命名feature),其中包含一系列与main混合的各种正在进行的提交,最简单的方法是进行压缩合并以生成一个"合并"的工作树,然后在main上创建一个新的提交(或一系列提交).例如:

git checkout master
git merge --squash feature
git commit
Run Code Online (Sandbox Code Playgroud)

这将生成一个提交,表示功能头部的树状态,合并为主.

当然,您也可以定期合并以master进行此更改,留下现在的混乱历史feature,并在将来更干净地工作.例如,简单地说

git checkout master
git merge feature
Run Code Online (Sandbox Code Playgroud)

然后继续前进.