2011-11-03 49 views
29

如何在Git中對一個或多個文件執行相當於TFS的撤銷掛起更改?如何執行TFS等效的'撤消掛起更改'

,基本意思是做下列步驟操作:

  • 撤消磁盤上的變化
  • 重置任何改變的Git已經發現
  • 獲取該文件的最新變化,從Git的

它如果你有(1)只是在磁盤上改變它,而不添加它,將很好地知道命令中的差異(如果有的話),但是當你已經做了(2)完成了附加命令和獎金(3)即使你已經提交了更改

回答

31

爲1和2,所有你需要做的是:

git stash -u #same effect as git reset --hard, but can be undone 

這將扔掉任何變化。如果您使用reset,請小心。閱讀操作復位和結賬的指數和硬,軟和混合選項的排列。該progit書中詳細解釋了這一點:http://progit.org/2011/07/11/reset.html

對於3,

git reset --hard HEAD^ 

,但會更好發出此之前git stash -u - 以防萬一你有掛起更改。

這會將當前分支重置爲當前提交的父級。在網上查找「tree-ish」。參考後的^和〜N將允許您指向該參考歷史記錄中的任何可到達的點。要了解歷史記錄是如何在git中進行跟蹤的,「計算機科學家Git」解釋了有向非循環圖:http://eagain.net/articles/git-for-computer-scientists/

要從當前提交的狀態中獲取單個文件(即丟棄更改),可以使用checkout

git checkout HEAD -- <a list of files> 

如果您發出錯誤上面的最後一個重置命令,您不會遇到麻煩。 Git會跟蹤分支用於指向reflog的位置。

git reflog 

會列出你的歷史。您可以在輸出中看到如何引用每個,所以:

git reset --hard [email protected]{1} 

將重置分支到它曾經是前1個變化。

要添加,如果你想消滅被忽略的文件和未跟蹤文件,你可以用這個擦:

git clean -xdf 
+0

小心; git不會提示你有一個漂亮的(令人煩惱的)對話框來選擇你想撤消待處理更改的文件。 :) –

+1

這樣做的一種方法是添加-p參數,它將提示您進行每個更改。你可以說'a'或'd'來處理整個文件,而不是'y'或'n'來處理單個的文件。 –

4

這個命令將撤消本地更改,並將它們恢復到當前版本的庫:

git reset --hard 

可以通過發出恢復到您的最後一個有效的提交:

git reset --hard HEAD 

我F你只是想恢復只是一個文件,使用git結帳代替:

git checkout -- file_name.extension 
git checkout HEAD file_name.extension 
+2

你爲什麼要區分'git reset --hard'和'git reset --hard HEAD'? – manojlds

2
  1. git checkout [path]或(整個回購),其次git reset --hard HEAD
  2. git reset [path]通過git checkout [path]
  3. git reset --hard [commit]在恢復回購的狀態[commit],必須是tree-ish
0

我相當於在Git中使用Eclipse的是簡單地右鍵單擊該文件並選擇Replace with - >HEAD Revision(或任何您想要的版本)。