2013-07-15 59 views
8

說我編輯的文件如何使用更改恢復暫存文件,保存更改時間?

echo "hi" > someVersionedFile.txt 

//Then I staged the file 
git add . 
git status 

<console reads> 
Changes to be committed 
new file: someVersionedFile.txt 

現在我對這些文件

echo "hi again file" >> someVersionedFile.txt 

//Then I restage the file with these changes 
git add . 
git status 

<console reads> 
Changed but not commited 
modified file: someVersionedFile.txt 

問題的更多變化:我怎麼回覆最後上演的版本?這是否可以做,因爲它沒有承諾?

+0

我很確定這是不可能的,但我也想知道它是不是! –

+0

不知道你是如何做到這一點的,但是如果你現在提交,只會進行階段性更改。然後,您可以將該文件恢復到剛剛創建的提交。 – andypaxo

+0

@andypaxo這不是問題。更爲嚴密的問題是,如果你在變化的情況下展示一個文件,對它進行更多的更改,那麼如何將文件恢復到上演階段 - 考​​慮到階段文件是否存在其他更改? – stackoverflow

回答

5

你也許可以做到這一點,但沒有一個簡單的命令可以爲你做。

當您執行git add時,該文件已被添加到存儲庫,但目前除了索引外沒有任何指向它的文件。當您再次執行git add時,新的(版本)文件將被添加到存儲庫中,並且索引與文件第一版本之間的鏈接將被替換爲新鏈接。但第一個對象仍然存在。

您可以使用git fsck --dangling讓您的存儲庫中目前沒有被任何東西所引用的blob對象的列表,但你必須通過他們一個個git showgit cat-file去,等來確定哪些是你想要的文件。一旦你找到正確的文件,你可以git show HASH > somefile.txt(也許git add somefile.txt)。

當然,如果您已經完成了git prune,git gc等,因爲第二個git add可能實際上已將原始文件從存儲庫中刪除。

這裏有一個簡單的例子:

$ git init foo 
Initialized empty Git repository in foo/.git/ 
$ cd foo 
$ echo blah > foo.txt 
$ git add foo.txt 
$ echo blarg > foo.txt 
$ git add foo.txt 
$ git fsck --dangling 
Checking object directories: 100% (256/256), done. 
dangling blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 
$ git show 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 
blah 
$ 
4

你不能這樣做。 Git只能將文件恢復到以前的提交,而不是以前的分階段版本。這是因爲該文件在進行提交之前不會被輸入到git的存儲庫中。 (你可以在Coding Horror瞭解更多關於承諾的最佳做法)

也許你可以適用明智的使用undo按鈕? (如果您已經在編輯器中編輯了代碼,顯然echo到該文件沒有撤消)。

0

你的意思是你想恢復到上演的版本?是的,你絕對可以做到這一點。也許最簡單的方法是隻提交您的分階段變化,結賬從提交的文件,然後重新設置您的分支:

git commit -m "Temporary commit" 
git checkout HEAD -- /path/to/file_you_want_to_revert 
git reset HEAD~ 

編輯:哎呀,對不起,我沒有注意到,你重演該文件的一部分隨着新的變化。對不起,但其他答案是正確的:這是不可能的(或者至少不是很容易)。我會離開這個答案,以防萬一別人有類似的問題,但還沒有覆蓋緩存。

+1

雖然這是錯誤的答案,但您可以通過'git checkout/path/to/file_you_want_to_revert'實現同樣的功能,而不必提供分支名稱。 – mihi