2012-10-09 91 views
2

我想取消提交對其運行「git commit」的更改。如何取消提交Git更改

特別是,我想指定文件。

例子:

> #5 commits ago 
> commit -m "bug fix" A.java 
> 
> #bunch of commits occurred 
> 
> [command to uncommit] A.java 

注意我不想從我的回購刪除A.java。我只想將它恢復到基本狀態,即當我運行git clone repo時。

感謝, 凱文

+2

檢查這個 http://stackoverflow.com/questions/2845731/how-to-uncommit-my-last-commit-in-git –

+0

請[點擊這裏](https://stackoverflow.com/a/49130829/7178104)檢查如何取消提交git更改。 –

回答

2

你可以做衍合互動和刪除提交。如果後面的提交依賴於該提交,它可能不起作用。

git rebase -i HEAD~5

,只是刪除相應的行,然後保存退出。

如果您已推送到遠程,請勿執行此操作。

2

除非A.java包含在repo歷史記錄中不存在的私人數據,否則您應該提交該文件的刪除,而不是嘗試刪除其以前的存在。

git rm A.java 

如果文件中包含哪些必須刪除敏感數據,就可以刪除該文件的歷史,但它會改寫裁判,需要強制推送,並要求對任何人的部分額外的工作誰已克隆或拉您目前的裁判。

https://help.github.com/articles/remove-sensitive-data

簡而言之:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch A.java' --prune-empty --tag-name-filter cat -- --all 

編輯納入答案,如果想從另一個回購或分支恢復的版本:

如果A.java是,你已經一個文件並且您希望將其恢復到可在upstream/master處獲得的原始版本,那麼這將替換您當前的副本:

git checkout upstream/master A.java 
+0

我不想從git repo中刪除A.java。克隆回購之後,我修改並提交了A.java。現在,我想撤消這些更改並將A.java恢復爲原始的克隆版本。 –

+0

假設'upstream/master'包含您想要的版本,'git checkout upstream/master A.java'會爲您提供原始版本。 – cjc343

+0

我可以用https:// ...鏈接替換「克隆的回購」的「上游/主人」嗎? –

3

小心重新綁定,如果你已經推動你的提交,你必須強制推送,並且可能會遇到麻煩,除非你知道你在做什麼。

使用git revert $SHAYOUWNATOREVERT恢復您不再需要的提交。這基本上會創建一個「倒轉」的提交,解除給定的提交。

+2

然後,交互式底線是要走的路。 –

+0

因此,當我運行「git push origin」時,是否可以附加SHA以僅推送我想要推送的SHA?我的一些git commit不應該推給master。 –

+0

如果什麼都沒有推,我同意@hvgotcodes的答案。我一直在假設您已承諾並推動您的更改。如果還沒有推送,請將它們重新排除。 – cjc343