我经常使用 git rebase -i HEAD~5
来重新设置提交并将它们压缩为一个。我的问题是,是否有一种速记方法可以做到这一点,但要选择/重命名第一个提交,然后压缩所有其他提交?例如,如果我有 5 个提交,例如每次提交手动执行此操作,但是当我说 40 个提交时,我不想在其中的 39 个旁边放置 squash
或 s
一开始。
同样,一旦我选择了选择/重命名/压缩的提交,当您进入下一个屏幕要求您选择要包含的提交消息时,是否有更短的方法告诉它注释掉所有提交除了第一条消息?
答案 0 :(得分:0)
压缩提交的最快方法是 git reset --soft
:
git reset --soft HEAD~5
# or
git reset --soft a12345
git commit
如果您想将其与 rebase -i
重写相结合:您可以在您的音序器脚本中使用 break
:
pick a12345 first commit
pick b23456 2nd commit
pick c34567 3rd commit
...
pick f67890 6th commit
break # 'break' will temporarily stop the rebase
# you can type whatever commands you want,
# (e.g : 'git reset --soft xxx' and 'git commit')
# followed by 'git rebase --continue'
您也可以使用 exec
,但如果您正在重写,请注意提交引用(c34567
或 HEAD~3
)音序器脚本到达那个点:
pick a12345 first commit
pick b23456 2nd commit
pick c34567 3rd commit
...
pick f67890 6th commit
exec git reset --soft HEAD~3 # caution : if some actions already squash or split
# commit 4 for example, 'HEAD~3' won't have the
# same meaning as what you see now.
答案 1 :(得分:0)
如果您在变基时配置了默认的 vim
编辑器,则可以使用可视模式并替换行。当我执行 git rebase -i
时,我看到:
pick c536072 something
pick cf5b2ca something
pick c092c25 something
pick c1b19af something
pick 0261bb1 something
pick 38d9cd4 something
通常您输入 i
以进入插入模式并输入内容。但相反,键入 j
(向下一行)和 V
3
j
这将选择(视觉上)4 行,然后键入 :
({{ 1}} 将在下面单独显示),然后输入 :'<,'>
并按 Enter,这会将 s/pick/s
替换为 pick
以代表所有选定的行。之后用 s
或 ZZ
退出 vim。
:wq<CR>
是一个非常强大的工具,它有大量在线文档可供您研究 - 您可以为工作创建自己的函数。您还可以work non-interactively on git rebase创建自己的 shell 命令。
无论如何,我的 git 配置中有:
vim
这样我就不会进行许多几乎为空的提交并推送它们,而是先进行提交,然后修改对该提交的所有更改,以便首先不存在几乎为空的提交(我在测试时这样做gitlab-ci 配置很多).