2013-03-09 52 views
0

是否有一種簡單的方法可以放棄所有沒有首先提交後者就沒有進行過的更改?放棄所有非階段性更改而不提交?

例如,假設A是一個跟蹤文件,如

% git init -q 
% echo "state 1" > A 
% git add A && git commit -q -m 'initial commit' 
% cat A 
state 1 

下一個修改A,和階段是:

% echo "state 2" > A 
% git add A 
% cat A 
state 2 

最後一個修改A第三次,但是這時間A保持未分檔:

% echo "state 3" > A 
% cat A 
state 3 

如何恢復A上演狀態,即狀態2

編輯:我已經改變了一點代碼序列,希望它現在更清晰。我發佈了問題後發佈了一個解決方案。這個解決方案讓我感到迂迴(必須有更直接的東西),但至少它清楚地表明瞭我希望A最終結束的狀態,無論是在工作目錄中還是在索引中。

回答

2

假設這一直是你的工作流程:

  1. 你犯了一個文件
  2. 你做了一些改變,並上演它
  3. 你做一些改變,但要恢復到版本步驟分階段變化2.

你只需要運行git checkout -- A。這將消除任何未分離的更改,但會在第2步結束時保留更改。

看看下面這個例子的工作流程,這將澄清一些事情:A的

內容只是version1

$ echo "version1" > A 

提交更改 $ git的A加& & git的承諾-q -m「初始承諾'

$ git log 
commit 4fd90642df048ca4beeb29c65c5f7a436e83055a 
Author: Tuxdude <[email protected]> 
Date: Fri Mar 8 16:28:36 2013 -0800 

    initial commit 

A的內容現在是version2

$ echo "version2" > A 

$ cat A 
version2 

舞臺文件更改

$ git add A 

檢查當前的git狀態

$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: A 
# 

做一些更多的變化A

$ echo "version3" > A 

$ cat A 
version3 

現在你決定,你想擺脫祿在A中未分類的變化。你只需要從git的緩存中檢出文件,也就是臨時區域。

$ git checkout -- A 

$ cat A 
version2 

您可以再次運行git status,它會讓你知道階段性變化。

$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: A 
# 
+0

對不起,但你發佈的工作流程並不反映我問到的那個。在我的問題中,「A」經歷了三種不同的狀態:第一種承諾;第二個已經上演;第三個是當前目錄中的一個。我想恢復第二個(不僅在索引中,而且在工作目錄中)。在我發佈這個問題後,我想到了一個我發佈的解決方案。解決方案很難看,但至少它清楚地表明瞭我想要弄清楚該怎麼做。 – kjo 2013-03-09 00:42:22

+0

@kjo - 您的問題對我來說還不清楚 - 至少從您發佈的最初問題來看。你有一個文件'A',它已經被首先提交,然後你有它上演,你有一些沒有被提交的未分階段的變化是嗎?你想在步驟2恢復到文件的版本 - 你只是在那裏上演但沒有提交?你能證實這一點嗎?我可以更新這個例子。 – Tuxdude 2013-03-09 00:45:24

+0

對此感到抱歉;我希望,我編輯了原文,使其更清晰。 – kjo 2013-03-09 00:54:00

1

你只需要做

git checkout -- . 

如果要恢復一個文件,你做

git checkout -- myfile 

如果文件已經添加,則必須取消階段,由做

git reset HEAD myfile 
+1

這是正確的,但第三代碼段,這並不做想要的東西,因爲OP OP要保持上演值,而只刪除未分離的更改。 – 2013-03-09 00:40:52

0

我想到了一個可能的答案,我的問題。這不是特別優雅,我不知道它是否有任何潛在的缺陷,但至少它清楚地表明我想A最終結束的狀態。希望有人會知道一條不太迂迴的路線。

在原來的問題給出的序列後,執行:

% git stash -q -k 
% git stash drop -q 
% cat A 
state 2