--preserve-merges
Instead of ignoring merges, try to recreate them.
This uses the --interactive machinery internally, but combining it
with the --interactive option explicitly is generally not a good idea
unless you know what you are doing (see BUGS below).
Run Code Online (Sandbox Code Playgroud)
那么当你使用时会发生什么--preserve-merges?它与默认行为(没有该标志)有何不同?"重新创建"合并等意味着什么?
我希望有一个简单的解决方案,可以在交互式rebase期间将两个合并提交压缩在一起.
我的存储库看起来像:
X --- Y --------- M1 -------- M2 (my-feature)
/ / /
/ / /
a --- b --- c --- d --- e --- f (stable)
Run Code Online (Sandbox Code Playgroud)
也就是说,我有一个my-feature最近合并过两次的分支,中间没有真正的提交.我不只是想重新定义my-feature分支,因为它是它自己的已发布分支,我只想将最后两个合并提交压缩成一个(还没有发布那些提交)
X --- Y ---- M (my-feature)
/ /
/ /
a --- ... -- f (stable)
Run Code Online (Sandbox Code Playgroud)
我试过了:
git rebase -p -i M1^
Run Code Online (Sandbox Code Playgroud)
但我得到了:
Refusing to squash a merge: M2
Run Code Online (Sandbox Code Playgroud)
我最后做的是:
git checkout my-feature
git reset --soft HEAD^ # remove the last commit (M2) but keep the changes …Run Code Online (Sandbox Code Playgroud) 我正在开发一个功能分支.
因此,当前的提交历史记录如下所示.从现在到旧:
在将我的功能分支合并到主控之前,如何将3个提交压缩为1?
有没有办法自动对大量合并提交进行变基?另一个问题Rebase a Git merge commit 的答案建议使用--preserve-merges,但这也会对非合并提交进行 rebase。
当将功能分支合并到主分支或集成分支,然后发现其他人刚刚推送了更改时,这种行为是不需要的。此外,能够将开发分支重新建立到新的主提交上,或者从开发中删除不会使用的修复也很有用。
例如,考虑到以下情况:
* 7909b1a (origin/master) Merge bug/456
|\
| * f9d43b6 (origin/bug/456) 456 - Change color
|/
| * 32666f3 (HEAD, master) Merge branch 'bug/123'
| |\
|/ /
| * 0939652 (origin/bug/123, bug/123) 123 - Fix Spelling
|/
o 96c9aa9 (tag: v1.1.1)
Run Code Online (Sandbox Code Playgroud)
如果我运行git rebase --preserve-merges origin/master,将产生以下结果:
* (HEAD, master) Merge branch 'bug/123'
|\
| * 8e6ccbe 123 - Fix Spelling
|/
* 7909b1a (origin/master) …Run Code Online (Sandbox Code Playgroud) 这是我们当前的功能分支工作流程 ->
问题:
如果我们将功能分支合并到主分支中,那么就没有问题。如果我们进行定期合并,然后重新建立基础,我们必须再次解决所有冲突。在具有 100 个提交的功能分支上,这是一个很大的痛苦。
有没有办法将功能分支合并回master并rebase而不发生冲突?
我正在清理 git 存储库以使其更易于理解。到目前为止,它都是私人的,所以我可以改变历史。
大多数情况下,我一直将提交压缩成有意义的集合。
问题在于,该项目在其历史早期是其他两个项目的合并。我在压缩合并之前的提交时遇到问题。
我的问题是:我该怎么做?
具体来说:我有
xxxxxx * master: Latest commit
xxxxxx * another commit
xxxxxx * Merge projectA and projectB
xxxxxx |\
0000A6 | * a minor commit in project A
0000A5 | * another minor commit
Run Code Online (Sandbox Code Playgroud)
我想把 0000A5 和 0000A6 压在一起。
当我尝试交互式变基时,magit(我碰巧使用的 git 的 emacs 前端)警告我“尽管合并在变基范围内,但仍继续吗?” 当我继续时,它会失败(取自我的实际工作,而不是上面的简化示例)。我不确定合并之前的重新提交提交是否存在问题,或者其他问题(“未跟踪文件”行是可疑的,因为合并包括将客户端项目移动到更大的“client/”子目录中)项目。
Last commands done (5 commands done):
pick fb5de84 Simplified schema:
squash 96ac7ac Revert schema to full complexity
Next commands to do (29 remaining commands):
pick 4ad389a Just indentation, for readability …Run Code Online (Sandbox Code Playgroud) git ×6
merge ×3
git-rebase ×2
rebase ×2
git-merge ×1
git-squash ×1
interactive ×1
magit ×1
squash ×1