2013-03-01 76 views
2

過去幾個月裏,我爲特性開發了代碼,將功能提交給git存儲庫,然後在某個日後決定刪除其中的某些部分特徵。爲了保持代碼基礎的清潔,我最終必須做的是刪除一個文件或部分文件,這些文件或文件被提交給git並提交這些更改。將刪除操作移至git中的某個分支

但是,爲了在稍後的日期輕鬆恢復已刪除的代碼,我需要經過一個額外的步驟來克隆其他地方的存儲庫,檢查刪除之前的提交,複製已更改的文件使用同上或甚至手動),然後將更改提交給新的分支。這個額外的步驟使我能夠在分支中提取已刪除的特徵,並通過合併分支在稍後階段很容易地將特徵恢復到代碼庫中。

這是一種常見的做法,更重要的是我錯過了一個允許我開箱即用的git功能。如果是這樣,那麼實現這個目標的命令是什麼

回答

3

假設你在Git的git倉庫中工作,並且你有一個好主意。

$ git rm -rf Documentation 
$ git commit -m 'Documentation is for the weak'

這會導致以下歷史記錄。 (注:git lol是非標準的,但非常有用的別名)

$ git lol 
* d55a922 (HEAD, master) Documentation is for the weak 
* 443d803 (origin/master, origin/HEAD) Merge branch 'maint' 
|\ 
| * 8d44277 (origin/maint) Update draft release notes to 1.8.1.5 
| * 6f0c336 Merge branch 'ef/non-ascii-parse-options-error-diag' into maint 
| |\ 
...

給自己一個再調度,在您的新崛起的檢出一個分支提交併恢復那裏。

$ git checkout -b mulligan/delete-all-documentation 
$ git revert --no-edit HEAD

現在用

$ git checkout master

,你可以回去工作。

說你添加一個新的承諾高手,那麼你的歷史變成

$ git lola 
* b4d76d9 (HEAD, master) Add new feature X 
| * 84b0e21 (mulligan/delete-all-documentation) Revert "Documentation is for the weak" 
|/ 
* d55a922 Documentation is for the weak 
| * 46b564f (origin/pu) Merge branch 'pc/subtree-add-before-fetch' into pu 
...

這不是一個常見的做法。只有當git mergegit cherry-pick乾淨利落時,也就是說,如果沒有其他更改已應用於刪除舊功能的代碼,則恢復該功能將非常容易。看看這條路,看看這個規模會有多糟糕。爲了恢復舊功能,開發人員必須篩選一系列分支以找到正確的恢復。 Git有極好的支持搜索歷史,我們從缺乏這些長壽命的mulligan分支是常見的做法。

+0

感謝大聲笑的提示。輝煌! – sfk 2013-03-03 10:02:54

3

git checkout <sha1> filepath/filename將修訂版sha1中的文件帶入您的工作副本。

git revert用於恢復提交所做的更改,包括合併提交。你也可以恢復回覆。

請不要克隆,因爲它過於繁重,檢出工作速度更快。

+0

感謝您的回答,但我想澄清一點,我希望刪除顯示爲分支。使用git checkout和revert,我必須知道提交,這是其他開發人員不容易瞭解的,或者在查看提交樹時顯式看到的。將採取克隆提示 – sfk 2013-03-01 16:33:36

+0

@sfk不確定你的意思是......將一個人的標籤分支到特定的提交sha1。所以你可以通過'git branch some_branch '來創建一個分支,並且當使用分支名稱而不是來做同樣的事情時。你能給出更詳細的問題,也許是一些例子嗎? – kan 2013-03-01 16:59:39