繁体   English   中英

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

[英]How do I manage merging and rebasing in git?

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

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

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

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

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

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

在分支的生命周期结束时,您应该只与主服务器合并一次。 功能/主题分支的想法是它只包含与功能相关的更改; 当你反复合并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

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

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

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

git checkout master
git merge --squash feature
git commit

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

当然,你也可以做一个定期的合并,以master这种变化,留下的凌乱的历史feature现在,只是在今后的工作中更加干净。 例如,简单地说

git checkout master
git merge feature

然后继续前进。

如果你要改变(我建议你这样做),那么就不要与master合并。 rebase工作流基于以下想法:主题分支包含从主要到新要素的路径,而不包含任何其他内容。 当主人向前移动时,你对新功能的改变随之移动。

当您最终准备好将更改带入master时,您有两个主要选项:

  1. 最后一次重新掌握master,然后进行正常的快进合并,这实际上将你所有分支的提交逐个引入master。 这保留了更细粒度的历史记录,但如果中间提交破坏了构建,那么您可能更愿意压缩它们。 交互式rebase(-i)可以帮助安排这些提交。

  2. 使用merge --squash在master中进行单个提交,其中包含所有分支的更改。

无论如何你要重新定义分支,只要你想要“合并”变化,就可以进行重新定义。在准备好将该分支“合并”为主分支之前,你不必重新加注。

我相信简短的回答是:

使用git merge --squash if:

如果您有一个功能分支,并且在工作时从另一个分支进入该分支,例如,您切换到功能并定期运行git merge master以在主分支中合并。 或者你正在把那个分支拉到或推到别人或像github这样的中央仓库。

使用git rebase如果:

如果你有一个功能分支,你没有推或拉给别人,你没有定期合并另一个分支,如上所述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM