Git - 如何反复压缩合并到主分支
Git - How to recurringly squash merge to a master branch
我有两个分支:
- 我每天提交几次的个人分支。
- 一个 "dev" 分支,我偶尔想将我的个人分支更改合并到该分支,但带有压缩的提交消息。
合并后,我想继续使用我原来的个人分支,然后可以随意重新合并回dev分支。
使用 svn,这很容易做到,而且不会出现任何合并冲突。
- 在个人分支上提交多项更改
- 将更改合并到 dev 分支,这将记录单个提交消息
- 将第 2 步的更改合并回个人分支,但 "only record merge info" 这样它就不会合并任何内容。
- 重复步骤 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
实际上,您从当前开发人员创建了一个新的个人分支,稍后您可以从中压缩合并。每次压缩合并时都这样做(每次使用不同的标签)。
我有两个分支:
- 我每天提交几次的个人分支。
- 一个 "dev" 分支,我偶尔想将我的个人分支更改合并到该分支,但带有压缩的提交消息。
合并后,我想继续使用我原来的个人分支,然后可以随意重新合并回dev分支。
使用 svn,这很容易做到,而且不会出现任何合并冲突。
- 在个人分支上提交多项更改
- 将更改合并到 dev 分支,这将记录单个提交消息
- 将第 2 步的更改合并回个人分支,但 "only record merge info" 这样它就不会合并任何内容。
- 重复步骤 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
实际上,您从当前开发人员创建了一个新的个人分支,稍后您可以从中压缩合并。每次压缩合并时都这样做(每次使用不同的标签)。