如何在添加多次提交后取消提交提交?

时间:2016-04-12 15:11:20

标签: git

我知道如果我做出某些事情,我可以这样解除承认:

get reset HEAD~1

这将有效地“回归”一次提交。我的问题是我做了一个提交,然后是拉。事实上,我做了很多工作,添加了越来越多的代码。所以我最终得到了:

--> Other User Commit A  <<-- WAS PUSHED
--> Other User Commit B  <<-- WAS PUSHED
--> MY COMMIT <<---- This is what must be UNDONE, that was never pushed
--> Other User Commit E  <<-- WAS PUSHED
--> Other User Commit F  <<-- WAS PUSHED

因此重置HEAD~1将简单地摆脱“其他用户提交A”。但是我只需要删除“MY COMMIT”,这是从未被推过的。

关于如何摆脱我的这个提议的任何想法?

(仅供参考,发生的事情是我意外地提交了一个1.6 Gb的文件,并且无法弄清楚为什么push不起作用,但是继续工作并提取新的代码,因为它进来了......但是直到我刚才意识到这个大文件不在提交中......)

非常感谢任何帮助?

更新

最好的解决方案是允许我“取消添加”我添加的文件。

3 个答案:

答案 0 :(得分:5)

由于你从未推动过这个分支,你应该很好地重写历史记录并删除错误的提交。为此,您可以在分支上执行交互式rebase:

git rebase -i HEAD~5

这将显示一个屏幕,显示分支历史记录中的最后5次提交。看起来应该是这样的:

pick dl3n2l2 Other User Commit A
pick be7mme2 Other User Commit B
pick loc83ns MY COMMIT
pick af8uo31 Other User Commit E
pick dl983md Other User Commit F

现在删除包含标记为MY COMMIT的提交的行。只需从文件中删除该行,保存并关闭即可。这应该可以有效地从您的分支中删除错误的提交,现在您应该能够推送到远程。

答案 1 :(得分:2)

由于你从未推动过你的提交,如果你不想改变历史,最好的选择可能就是推出一个全新的分支。让我们假设您正在处理的分支称为功能,您可以这样做:

git checkout "Other User Commit E' code"
git branch -f feature
git pull origin feature

这将为您提供最新功能分支代码的全新副本,如果您从未推送过您的提交,这应该足够好了。
git branch -f会将所需的分支带到您当前所在的任何提交中。

答案 2 :(得分:1)

您可以在不触及顶部推送的其他更改的情况下还原提交:

git revert <commit>

这将反转一次提交中的更改。一旦推送,就会发生这样的提交(尽管git历史仍然存在。)

另一种选择是删除文件,然后提交删除。