在提交代码到 Git 后,无法压缩已推送的提交记录 - Visual Studio

7
我是一个使用git的项目中唯一的成员,完成了一些提交、合并和推送到远程仓库的操作,但这些操作顺序不当。现在我想重新组织所有变更(只有1个主分支,1个用户),通过变基(rebase)方式压缩(squash)和重命名(rename)一些提交。
我试图使用此链接中建议的命令进行操作:How to squash commits in git after they have been pushed?,但是我遇到了一些错误,而且无法理解。以下是显示问题的屏幕截图:

image - git cmd rebasing error

image - part of visual history tree

===========================ERROR AS TEXT================================

使用的命令:

git rebase -i origin/master~2 master

(应该只显示2个提交,但不知何故它显示了超过2个,如40+)

错误信息:

interactive rebase in progress; onto 9bdd944
Last commands done (15 commands done):
   pick 7af3656 "commit message"
   pick 7355eff "another commit message"
Next commands to do (110 remaining commands):
   pick fc10330 "another commit message"
   pick f22d8c0 "another commit message"
You are currently rebasing branch 'master' on '9bdd944'.

nothing to commit, working tree clean
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyways, use:

   git commit --allow-empty

Otherwise, please use 'git reset'
Could not apply 7355eff... "another commit message"

===========================文本错误================================

看起来很混乱,如果有任何提示可以帮助我解决这个问题,将不胜感激。我是一个新手,使用git可能对一些高级用户来说很容易。


请将以下与编程有关的内容从英语翻译成中文。只返回翻译后的文本:请以文字形式发布错误,不是每个人都能阅读您的图片... - umläute
看起来你从你发布的图片中选择了“Pick”而不是“Squash”...如果你只是对所有内容使用“Pick”,它只会重新应用当前提交...相反,编辑每一行并将操作设置为“s”或“squash”。 - jessehouwing
@umläute 对不起,我不知道,现在我会以文本形式发布..... - lbtg
@jessehouwing,它应该只显示给我2个提交,但实际上它显示了40多个提交来进行rebase...所以我只是做了一个squash来测试,但我得到了这个错误,在新项目中我可以轻松地进行squash,因为我只在本地分支中进行rebase,但这是第一个git项目,我不知道我到目前为止做了什么。 - lbtg
其中一个提交是合并吗?因为它会显示作为该合并的一部分的提交。 - jessehouwing
是的,我曾经做了很多合并然后推送到远程,因为我不知道如何变基。 - lbtg
1个回答

10

你可以轻松地通过以下方式来实现:

git reset --soft d0b8a84d
git commit -m "squashed everything after d0b8a84d"
git push -f

这将首先将历史记录重置回到提到的提交,并撤销所有本质上的更改,但它们仍存储在暂存区中。
然后你可以使用一个新的提交一次性提交所有这些更改。
然后将它们推回到远程。由于重写了已发布的历史记录,这将需要使用“强制”命令。
Git“rebase”也可以做到这点,但如果您想将某个时间点之后的所有提交压缩成一个单独的提交,那么上面的方法会更容易。在合并时,“rebase”会拉取所有提交,这可能会让事情变得困难。
如果您想合并特定的提交或更改旧提交的提交消息等,则交互式“rebase”更为强大。但在您的情况下,上述方法要简单得多。

是的,我只想压缩和重命名提交,我的历史记录有大约200个提交和多达3个合并......我会尝试你建议的方法,希望它有效,否则我将不得不重新推送所有东西作为单个提交,谢谢,稍后我会发布结果。 - lbtg
我已经尝试过了,对于第一组提交来说效果很好,但如果我想再次对第二组进行操作,那么第一组的提交信息就会丢失。 - lbtg
是的,在这种情况下,您需要使用rebase。当重新合并时,您需要在rebase时重新执行实际的合并操作。当需要清理大量数据时,这可能会非常令人沮丧。 - jessehouwing
简单选项,如果你真的想以简便的方式清理干净,它很有效。 - Tore Aurstad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接