我如何将最后的N承诺集成到一个承诺中?


当前回答

我认为最简单的方式来做到这一点是通过创建一个基于大师的新分支,并进行功能分支的合并。

git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch

然后,你有所有的变化准备好进行。

其他回答

在分支中,你想将承诺结合起来,运行:

git rebase -i HEAD~(n number of commits back to review)

例子:

git rebase -i HEAD~2

此将打开文本编辑器,您必须在每个承诺前更换“点击”,如果您希望这些承诺合并。

p, pick = 使用 commit

s, squash = 使用承诺,但输入前承诺

例如,如果您正在寻找将所有承诺合并到一个,则“选择”是您所做的第一个承诺,并且所有未来的承诺(位于第一个下方)都应该设置为“滑动”。如果使用vim,请使用 :x 在输入模式中保存和输出编辑器。

然后继续下调:

git add .

git rebase --continue

更多关于此和其他方式重新写下你的承诺历史,请参见这篇有用的文章

如果你想写下新的承诺消息从滑板,这就足够了:

git reset --soft HEAD~3 &&
git commit

如果你想开始编辑新的承诺消息与现有承诺消息的折叠(即类似于什么一个 pick/squash/squash/.../squash git rebase -i 指示列表会开始你),那么你需要提取这些消息,并将它们转移到 git commit:

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

两种方法都将过去三项承诺分成一个单一的新承诺,相同的方式。 软重定义只会重新点头到最后一项承诺,你不想分解。 无论指数还是工作树都不会被软重定义所触摸,让指数在你新承诺所需的状态(即它已经有所有从你即将“扔掉”的承诺的变化)。

感谢这个有用的博客帖子,我发现你可以使用这个命令来破坏过去的3个任务:

git rebase -i HEAD~3


显示的文档是相当清晰的. 在任何指定线上,您可以将命令从选择到您选择的命令更改。


我做的第一件事是纠正错误,并在评论中做出新的承诺,把这一点推到我的新功能中。

接下来,我将包含修复(fe7f1e0)的承诺移动到属性承诺下方,并将选择转换为修复。

这在所有承诺都是本地的时工作得很好,但如果你试图改变已经推到远程的承诺,你真的可能会给那些已经检查过同一个分支的其他骗子带来问题!

我建议尽可能避免吉特重新设置 - 特别是对于吉特新闻. 除非你真的需要自动化一个过程,基于几个承诺,有一个不那么异国情调的方式。

将被排除的承诺放在一个工作分支(如果它们还没有) - 使用 gitk 为此 查看目标分支(例如“主”) git merge --squash (工作分支名称) git commit

承诺的消息将基于 squash 预受欢迎。

什么可能真的很方便: 找到你想在顶部滑动的承诺,说d43e15。

现在使用

git reset d43e15
git commit -am 'new commit name'