【问题标题】:git interactive rebase: stop without commitgit 交互式 rebase:不提交就停止
【发布时间】:2018-11-14 11:48:04
【问题描述】:

(TLDR) git rebase -i 有没有办法在没有提交 ID 的情况下停止编辑? (/TLDR)

加长版:

背景

使用git rebase -i,我得到一个文本编辑器,我可以在其中定义命令列表,每行以pick COMMIT_ID 开头。

其中一个选项是将“pick COMMIT_ID”替换为“edit COMMIT_ID”,这意味着它将在提交后停止,以便我修改提交或进行一些手动操作。然后我可以继续git rebase --continue

从选项列表中:

#  e, edit = use commit, but stop for amending

问题

我想知道是否可以选择停止编辑,而不选择任何提交。

动机/用例

例如如果我想压缩一系列提交,然后停止一些手动操作,我必须将编辑 + 压缩放在同一个提交 id 前面 - 这是不允许的。

相反,我会这样做:

pick COMMIT_0 Change some colors
pick COMMIT_1 Make it faster
squash COMMIT_2 Fix a typo in previous commit
squash COMMIT_3 Fix another typo in previous commit
edit
pick COMMIT_4 Refactor some things
pick COMMIT_5 Introduce new options

这样的选项还允许在序列中的第一次提交之前停止。

(我想说它允许在整个历史的初始提交之前进行编辑,但事实并非如此 - 初始提交绝不是变基序列的一部分)

如果我这样做,git 会这样说:

警告:SHA-1 丢失或不是以下行中的提交:

有趣的是,效果或多或少是我想要的,它停止了,我可以做事了。但我确信这不是预期的方式。

【问题讨论】:

    标签: git rebase git-interactive-rebase


    【解决方案1】:

    根据某些情况,您有一个、两个或三个选项。

    第一个选项

    插入

    exec false
    

    或其缩写形式

    x false
    

    在你想停下来的地方。如您所知,exec 在命令发生的位置运行 shell 命令;但如果命令失败退出,git rebase 停止,命令false 总是失败退出。

    第二个选项

    如果您使用的是 Git 2.20 或更高版本,则可以插入

    break
    

    或其缩写形式

    b
    

    在你想停下来的地方。引入此命令的目的正是您所要求的。

    第三个选项

    edit 而不是pick 在要停止的点之前标记提交。显然,如果您想在第一次提交之前或在 squashfixup 提交之后停止,这将不起作用。

    【讨论】:

    • 另外,将最后一个壁球更改为编辑,并使用git reset --soft @^; git commit --amend自己进行壁球
    【解决方案2】:

    我不知道这是否可能。在 squash 之后,您必须进行第二次交互式 rebase,然后修改提交。

    【讨论】:

    • 好的,如果有人提出更好的解决方法,请等待。
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 2017-10-27
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2015-06-25
    • 2017-08-19
    相关资源
    最近更新 更多