Git - 如何反复压缩合并到主分支

Git - How to recurringly squash merge to a master branch

我有两个分支:

  1. 我每天提交几次的个人分支。
  2. 一个 "dev" 分支,我偶尔想将我的个人分支更改合并到该分支,但带有压缩的提交消息。

合并后,我想继续使用我原来的个人分支,然后可以随意重新合并回dev分支。

使用 svn,这很容易做到,而且不会出现任何合并冲突。

  1. 在个人分支上提交多项更改
  2. 将更改合并到 dev 分支,这将记录单个提交消息
  3. 将第 2 步的更改合并回个人分支,但 "only record merge info" 这样它就不会合并任何内容。
  4. 重复步骤 1。

现在 dev 分支知道它有什么来自个人分支,而我的个人分支知道它有来自 master 分支的一切。

使用 git,我尝试使用 git merge --squash 从个人分支转到开发分支,第一次使用效果很好。但是第二次我遇到了一堆冲突。由于 merge --squash 没有合并原始提交,而是进行了与原始提交无关的新提交, git 没有意识到我已经合并了一堆我个人的内容分支到开发分支。

git这个工作流程有什么解决方案吗?好像如果我 merge --squash 一个分支,我必须为下一次创建一个新分支。

你想让被压缩的修订站在开发者一边吗?就像,一次又一次的壁球修订?如果是这样,您可以这样做:

git checkout --detach my-branch
git reset --soft the-previous-squash-commit
git commit -m "A new squash operation that covers revisions x, y and z"
git checkout dev
git merge -m "Merging a new squash commit" HEAD@{1} # given that I didn't have a branch set up for the squashed revision

我觉得应该不会有什么冲突吧

首先要了解的是,您描述所需行为的方式(合并到目标记录仅 1 次提交)正是默认合并的工作方式。

之所以看起来不是这样,是因为许多 git 命令在默认情况下遵循所有进入合并的分支。您可以通过为命令

提供 --first-parent 选项来更改它
git log --first-parent

常规合并和 "squash merges" 都准确记录一个新提交并将其放置在目标分支上(即发出命令时签出的分支)。

不同之处在于压缩合并假装它们没有编写合并 - 也就是说,只有新提交的父级是目标分支的先前提示。普通合并有第二个父级 - 无论您合并到哪个分支 - 正如您所注意到的,如果您希望后续合并正常工作,则需要第二个父级。

你可以跳过障碍,重新发明轮子。例如,eftshift0 为您提供了一种方法,可以随时使 dev 与您的其他分支的尖端相匹配——这有点像合并,而不管合并基础如何,只要除了您的分支之外没有任何地方做出贡献至 dev。如果您搜索 SO,您甚至可以找到更通用的解决方案。

但所有这些解决方案的共同点是,它们都与 git 的工作原理背道而驰。按预期使用 git 真的要容易得多——也就是说,当你想进行这些更改时,只需将你的分支合并到 dev 中,如果你想要不遵循侧分支的输出,请使用 first-parent

git merge --squash 之后,不应使用分支进行进一步合并。

如果你坚持使用squash merge,你可以使用这个流程:

git checkout dev
git merge --squash personal
git tag personal_1_0 personal  #optional to save old personal branch
git checkout -B personal

实际上,您从当前开发人员创建了一个新的个人分支,稍后您可以从中压缩合并。每次压缩合并时都这样做(每次使用不同的标签)。