2011-11-06 22 views
1

可能重複:
git undo changes in some filesGIT:通過Solo Developer撤消對文件或文件夾的更改?

我獨唱開發商(當然,學生實際),並發現自己常常希望將文件回滾到以前的狀態,並撤消引入錯誤的變化到程序。我希望在大多數時間對單個文件執行此操作,但可能希望在其他時間執行此操作以及整個文件夾。這在理論上可以延伸到恢復我已刪除的文件。假設我有事先保存的文件和文件夾的狀態。我不是想抹掉之前的提交,只是爲了回滾並記錄我所做的事情。我是唯一從事文件工作的人,這不是從託管站點克隆的項目。

我知道如何做Mercurial中的極端基礎知識,並發現hg reverthg update #做了我想要在mercurial世界中做的事情,但還沒有理解git如何做。我可能希望最終在Github上主持一個項目,並且也有興趣瞭解git,因爲它正在成爲版本控制領域的主導者。我沒有顛覆的背景,也不需要關於事物與顛覆不同的參考。

我不妨學習如何將我自己的項目分成幾個版本並稍後合併它們,但我會稍後再探討它。我目前的問題適用於將更改回滾到我自己的硬盤驅動器上唯一的文件和文件夾副本。

任何建議,以新手友好的介紹git?無論是在線還是書本形式都可以。請不要指引我使用Scott Chacon寫的任何資源;我發現他的風格和書籍/ Peepcode PDF非常混亂。我也有Swicegood的Git書的實用指南,但還沒有發現它非常有幫助。弄清楚如何撤銷git中的更改應該不是那麼難。我已經花了數小時搜索。

請注意,我是一個版本控制的新手,所以請溫柔。

謝謝。

回答

0

你說過,不喜歡Scott Chacon的任何資源,但可能會有所幫助。

我發現他的關於「重置」命令的文章非常有用並且很明白要理解。只有在我瞭解它的用法之後。鏈接:http://progit.org/2011/07/11/reset.html

至少它可以用於其他人會讀這個問題。

1

如果要恢復提交,請使用git revert hash_of_the_commit。這被追蹤 - 恢復本身就是一個新的提交。

如果要恢復的承諾只是一部分,你可以做的事情之一就是使用git diff

$ git diff HEAD~3 file.txt 
# will display a diff of file.txt between the current head and three 
# revisions prior to that 
$ git diff HEAD~3 file.txt | patch -R 
$ git add file.txt 
$ git commit -m "super commit message" 
# will revert that file to what it was in HEAD~3 
+0

git reverse不存在,它是git還原。 – aleroot

+0

哎呀錯字。謝謝。 – Mat

0

你需要git checkout。它可以從指定的提交籤的單個文件或路徑:

git checkout commit_SHA1 -- your_file_name.here 

因爲在大多數情況下git checkout用於切換分支它可以是混亂。

你可以使用任何方法來識別提交在這裏,我建議你做git log或使用一些gui並找到你的提交的SHA1 ID。

2

首先做一個git log來查看您的歷史記錄,以便您可以決定要「回滾」到哪個版本。我們稱之爲A。現在,你有幾個選擇。

  1. 您可以從A削減分支並在那裏工作。這通常是正確的,因爲通常情況下,你不想完全恢復,只是想嘗試別的。這可以使用git checkout -b retry A(創建並切換到從承諾A開始,稱爲retry的分支)完成。現在你可以在那裏工作,就好像A以後的其他更改不在那裏一樣。

  2. 假設你在master分支上,你可以做一個git reset --hard A放棄自A以來的所有提交併返回到該狀態。這通常不是一個好主意,因爲從那時起很難追蹤所有的變化(如果你需要的話)。

  3. 一個更大腦死亡版本,以簡單地替換一個文件的內容(說foo.c)與它的內容作爲承諾A就是說git cat-file -p A:foo.c > foo.c。然後你可以提交這個文件的「新版本」。這真的不是一個好主意,因爲git不知道你會回滾。它只是認爲這是一個新的承諾。

我不確定這一切是否清楚,但如果沒有,請問,我會盡力澄清。