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


当前回答

有人提到在 IntelliJ IDEA UI 上做得多容易:

转到 git 窗口 手动选择所有要融入一个的承诺. 右键单击 > Squash 承诺 > 编辑失败的承诺消息 点击左侧的分支名称 > 右键单击 > Push > Force Push

此分類上一篇

其他回答

首先,我知道我的功能分支和当前主分支之间的承诺数量。

git checkout master
git rev-list master.. --count

然后,我创建另一个基于我的功能分支的分支,保持我的功能分支无触。

最后,我跑

git checkout my-feature
git checkout -b my-rebased-feature
git checkout master
git checkout my-rebased-feature
git rebase master
git rebase head^x -i
// fixup/pick/rewrite
git push origin my-rebased-feature -f // force, if my-rebased-feature was ever pushed, otherwise no need for -f flag
// make a PR with clean history, delete both my-feature and my-rebased-feature after merge

希望能帮忙,谢谢。

使用 git rebase -i <after-this-commit> 并在第二次和随后的命令中取代“squash”或“fixup”,如手册中所描述。

在此例子中, <after-this-commit> 是 SHA1 hash 或当前分支的 HEAD 的相对位置,从该分支的 Commits 被分析为 rebase 命令. 例如,如果用户希望从当前 HEAD 查看 5 个 Commits 在过去的命令是 git rebase -i HEAD~5.

在我的工作流中,我开始一个分支,我的第一个承诺这个分支总结了目标(也就是说,这通常是我将作为功能的“最终”消息推到公共存储库)。所以当我完成时,我只想做的是Git squash master回到第一个消息,然后我准备推。

我用这个 alias:

squash = !EDITOR="\"_() { sed -n 's/^pick //p' \"\\$1\"; sed -i .tmp '2,\\$s/^pick/f/' \"\\$1\"; }; _\"" git rebase -i

这将破坏历史被破坏之前,它会这样做 - 这给你一个机会,通过抓住一个旧的承诺ID从控制台,如果你想转换。

Anomies 答案很好,但我对此感到不安全,所以我决定添加几张屏幕截图。

步骤 0: git log

查看你在哪里与 git log. 最重要的是,找到第一个 commit 的 commit hash 你不想 squash。

此分類上一篇

步骤一:转动

在我的案例中,执行 git rebase -i(你的哈希):

$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d

步骤2:选择 / 切割你想要的东西

在我的情况下,我想把所有的承诺,这是第一次在时间上。 订单是从第一到最后,所以正如在 git log。 在我的情况下,我想:

此分類上一篇

步骤 3: 调整消息(s)

如果您只选出一个承诺,并解除其余的承诺,您可以调整一个承诺消息:

此分類上一篇

一旦你保存这个(:wq),你已经完成了。

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

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

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