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


当前回答

许多答案是基于Git Rebase命令,但在我的经验中,它对Git初学者来说有点复杂和先进。

假设你想排除最后3个命令,然后以下是步骤:

下载现行承诺ID: 使用 git log -1 --online 并记住当前状态的承诺ID(仅在您与 git reset 做错事的情况下) 返回 3 个承诺: 使用 git reset --soft HEAD~3 您将返回 3 个承诺(并忘记您以前做过这三个承诺) 做一个新的承诺: 现在简单地做 git commit -m <NEW_SINGLE_MESSAGE> 将自动结合 t

如果与 git reset 发生错误,您可以通过 git reset --soft <ORIGINAL_COMMIT> 返回原始状态。

其他回答

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

现在使用

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

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

git rebase -i HEAD~3


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


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

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

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

我们真的很高兴这个答案,这意味着你不需要通过承诺计算。

如果你有大量的承诺在主分支,并希望将它们全部结合在一个:

确保你在主分支和做 git 状态,以确保它是所有的清洁 复制承诺 SHA 为承诺 之前你开始你的工作 git 重新设置 ‒软承诺IdSHA

[您将注意到,您此时此刻的所有更改都将显示在您的 IDE 源控制部分 - 很好地审查它们以检查它们都在那里]

git commit -am “你想要的消息将取代所有其他 commit 消息” git push (会抱怨你在承诺后面) 所以做 git push --force

这就是它!

这是超级可爱的,但在某种寒冷的方式,所以我只会把它推到戒指中:

GIT_EDITOR='f() { if [ "$(basename $1)" = "git-rebase-todo" ]; then sed -i "2,\$s/pick/squash/" $1; else vim $1; fi }; f' git rebase -i foo~5 foo

翻译:为 git 提供一个新的“编辑器”,如果要编辑的字体名称是 git-rebase-todo(互动的 rebase prompt) 会改变所有,但第一个“点”到“squash”,否则 spawns vim - 这样,当你被要求编辑破碎的承诺消息时,你会得到 vim。

也许我会做马克·隆加尔所建议的事情。

程序1

(一)定义承诺短暂的哈希

# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....

在这里,即使是 git log --oneline 也可以用来获得短暂的 hash。

# git rebase -i deab3412 

....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....

....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....

# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....

# git push origin +master

程序2

首先,添加所需的文件

git add <files>

git commit --fixup=OLDCOMMIT

现在这个创建了一个新的承诺在头顶与 fixup1 <OLDCOMMIT_MSG>。

其次,下令下令下令下令下令下令下令下令下令下令下令下令。

git rebase --interactive --autosquash OLDCOMMIT^

在这里 ^ 意味着以前的承诺到 OLDCOMMIT. 这个 rebase 命令在一个编辑器(vim 或 nano)上打开了互动窗口,我们不需要做任何事情,只是保存和输出是足够的. 因为转移到此的选项将自动移动最新的承诺到旧的承诺旁边,并将操作转换为 fixup(相当于 squash)。 然后 rebase 继续完成。

程序3

如果需要将新的更改添加到最后的承诺方式 - 更改可以使用 git-commit。

    # git log --pretty=oneline --abbrev-commit
    cdababcd Fix issue B
    deab3412 Fix issue A
    ....
    # git add <files> # New changes
    # git commit --amend
    # git log --pretty=oneline --abbrev-commit
    1d4ab2e1 Fix issue B
    deab3412 Fix issue A
    ....  

结论