Jos*_*h R 4 git squash git-interactive-rebase git-squash
在Git中,我可以使用交互式的基础来重写历史记录,这很棒,因为在我的功能分支中,我探索了不同的重构和完成方式时,使用部分有效的代码进行了大量提交。
在将分支重新合并或合并到master之前,我想将很多提交压缩在一起。
一些按从上到下的顺序排列提交
1. Initial commit on feature branch "Automatic coffee maker UI"
2. Add hot chocolate as product
3. Add tea as product. Products are now generic
4. Create in memory data store for adapter tests
5. Cry because I can't get entity framework to create a composite key. Integration tests broken.
6. Implemented composite key!!
7. All tests green and feature done!
Run Code Online (Sandbox Code Playgroud)
假设我要保留提交3、4和7。
使用变基我想“压扁”提交
理想情况下,我会在交互式基础中执行
1. squash
2. squash
3. pick (contains the work of 1 & 2)
4. pick
5. squash
6. squash
7. pick (contains the work of 5 & 6)
Run Code Online (Sandbox Code Playgroud)
但这是倒退的,因为squash将提交与先前的提交合并。我不知道如何使它向前挤压。
我是否很困难,我是否应该接受那是行不通的(我宁愿让它工作),还是有办法实现?
我正在用以下命令
git checkout My-feature-branch
git rebase master -i
Run Code Online (Sandbox Code Playgroud)
然后,我正在编辑即将出现的提交列表,并尝试通过保存文件并编辑编辑器来完成它,这通常对我有用。
确实可以在交互式变基期间将一个提交压缩到下一个提交中,并完全保留第二个提交的身份(包括作者、日期等)。
然而,该方法有些复杂,因此git rebase -i仍然希望获得本机支持。
我将仅用三个提交来演示和aaaaaaa A,我们想要折叠并保留的身份:(该方法很容易推广到更多提交)bbbbbbb Bccccccc CABB
git rebase -i aaaaaaa^B并退出编辑器:
pick aaaaaaa A
edit bbbbbbb B
pick ccccccc C
Run Code Online (Sandbox Code Playgroud)
B,恢复最新提交两次,然后继续:
git revert HEAD
git revert HEAD
git rebase --continue
Run Code Online (Sandbox Code Playgroud)
因为恢复恢复会恢复之前的状态,所以所有后续提交都将干净地应用。B和一起的顺序Revert "B"没有效果,但是这些提交中的第一个提交带有提交 B 的完整标识(事实上,在这个阶段它仍然是commit B)。B并且Revert "B"可以被压缩在一起形成一个无操作提交,其中携带提交 B 的身份以及一个单独的rebase -i --keep-empty aaaaaaa^. 这非常有用,建议防止虚假合并冲突,特别是在更复杂的情况下。不过,我们将在这里跳过该步骤并将提交保留在一起。Revert "Revert "B""将包含 . 最初所做的所有更改B。rebase -i aaaaaaa^再次超越A和B,Revert "B"同时压缩B到Revert "B"和A:
pick bbbbbbb B
squash b111111 Revert "B"
squash a222222 A
squash b333333 Revert "Revert "B""
pick c444444 C
Run Code Online (Sandbox Code Playgroud)B由于和
的顺序Revert "B"无效,因此您可以将任何提交移过它,同时仅创建可简单解决的合并冲突。git mergetool可以自动解决琐碎冲突的工具,并让工具来解决这个问题。git rebase --continue你就完成了。您也可能需要重新排列提交的顺序,以便在可行的情况下,要保留的提交早于要压扁的提交。
如果这不可行,则因为您会遇到不想解决的冲突,只需解决它
1. pick
2. squash
3. squash
4. pick
5. pick
6. squash
7. squash
Run Code Online (Sandbox Code Playgroud)
压缩完成后,您可以编辑提交消息以包含您希望最终提交的消息。非常简单。:-)
你甚至可以做
1. pick
2. fixup
3. squash
4. pick
5. pick
6. fixup
7. squash
Run Code Online (Sandbox Code Playgroud)
然后,我认为应该只启动一次提交消息编辑器,就像使用fixup一样,无需启动编辑器就可以简单地获取以前的提交消息。
在squash上,当提交消息编辑器被触发时,您还同时获得了两个提交消息,分别是要压缩的提交和要压缩的提交,因此您可以简单地删除不需要的提交消息保持。
| 归档时间: |
|
| 查看次数: |
2274 次 |
| 最近记录: |