2016-04-12 165 views
2

我知道,如果我犯的东西,我可以取消提交它像这样:如何在添加多次提交后取消提交提交?

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”。但我只需要删除“我的提交”,这从来没有推过。

关于如何摆脱我的这个承诺的任何想法? (仅供参考,发生了什么事是我无意中提交了一个1.6Gb的文件,并且无法弄清楚为什么push不起作用,但继续工作,并且在进入时拉取新代码...但从来没有推过这个直到我刚刚意识到这个大文件不会在提交...)

任何帮助将不胜感激?

UPDATE

最好的解决办法是一个可以让我“未添加”我添加的文件。

+0

是否有其他人使用你的分支?你可以改写它/重写历史吗? – Makoto

+0

我不能重写历史......我必须只能删除那一个 – coderama

+0

考虑到它是你的代码库中的一个1.6GB文件,我认为你*有*重写历史记录以便能够将它从否则每个拉你的代码的人都会被迫在获取你的分支时把它拉下来。 – Makoto

回答

5

既然你从来没有推过这个分支,你应该很好地重写历史记录并删除坏提交。要做到这一点,你可以在你的分支做一个互动变基:

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行。只需从文件中删除该行,保存并关闭。这应该有效地从您的分支中删除错误的提交,现在您应该能够推送到远程。

+0

这听起来是最有前途的。让我试试看吧...... – coderama

+0

@Juan给出的答案也有效,但它完全放弃了分支。 –

+0

这样做后,我得到:错误:未被破坏的工作树文件'public_html/sites/default/files/advagg_js/js__OFsU.js'将被合并覆盖。 – coderama

1

您可以还原一个承诺,而通过接触被推向之上,其他的变化:

git revert <commit> 

这将扭转只在一个提交更改。一旦推入,就会像从未发生过任何提交(尽管git历史记录仍然存在)。

另一种选择是只删除文件并提交删除。

+1

我不认为这是最好的选择,因为包含大量二进制文件的错误提交可能仍会被推送到远程。 –

+0

这就是我想要避免的......即提交巨大的二进制文件 – coderama

2

正如你从未推动你的承诺,如果你不想改变历史最好的选择可能是拉一个全新的分支。让我们假设你重新工作的分支上叫功能,你可以只是做:

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

这只会让你的分支中最新的代码,这应该是足够了的全新副本,如果你从来没有推你的提交。
git branch -f将带来所需的分支,无论你现在在哪个提交。

+0

@coderama,这样你可以“解除添加”文件,因为你只是恢复到当前的远程分支状态,忘记了你的本地更改 – Juan

+0

回想起来,这可能会更容易: – coderama

相关问题