2014-06-20 41 views
1

最近我一直在使用git和一個系統應用補丁(Phabricator & Arcanist,但我不認爲這對於這個問題很重要)如何在不改變工作副本的情況下籤出git修訂

我經常會以提交形式應用修補程序的情況結束,但我想編輯該提交。 當然,我總是可以編輯和git commit --amend,但我也希望能夠做到git diff,使用meld .和其他工具,假定編輯是在最後一次提交的頂部進行的。

目前我執行以下操作。


git diff HEAD~1 > temp.diff 
git reset --hard HEAD~1 
git apply temp.diff 
rm temp.diff 

編輯補丁...

git commit -a 

然而,這似乎有點笨拙,有沒有一些方法來設置Git倉庫到另一個SHA1,但保持當前工作副本完好無損?

回答

3

您應該能夠通過簡化您復位:

git reset @~ 

該重置HEAD以前的承諾,並且將重置索引,但沒有工作樹
它使用的默認reset模式(如git reset --mixed

一個git diff應該告訴你什麼,去年的補丁了。
A git status應該向您顯示您最近修改的文件,準備好修改/添加beck到索引並再次提交。

+0

注意:使用'@'指的'HEAD'是新,舊的Git客戶端可能需要在其位置明確提及「HEAD」。 – hvd

+0

@hvd是,http://stackoverflow.com/a/964927/6309:混帳1.8.5+(2013年11月) – VonC

2

根據您想要的確切行爲,git reset --softgit reset --mixed會將當前提交更改爲另一個提交(通過在分支上重寫分支標籤)。他們都做這樣的事情在提交圖形方面:

[before `git reset`] 

A - B - C - D <-- HEAD=br1 
     \ 
     E - F <-- br2 
      \ 
      G <-- br3 [before `git reset`] 

[after `git reset HEAD~1`] 

      D <-- only in reflog now 
     /
A - B - C  <-- HEAD=br1 
     \ 
     E - F <-- br2 
      \ 
      G <-- br3 

不同的是,git reset --soft葉工作目錄和索引完好,而git reset --mixed葉的工作目錄不變,但改變以匹配復位指數 - 提交。

(爲了完整起見,git reset --hard做什麼git reset --mixed確實還會改變工作目錄相匹配的復位承諾。通過保存的差異,然後用git apply重新應用它,你得到的git reset --mixed的效果。如果您計劃重新add一切,--soft可能更有意義注意git commit --amend本質上只是git reset --soft && git commit在提交 - 圖和指數行爲方面)

+0

相同的思路我的答案,更多的細節和往常一樣。 +1 – VonC

+0

我簡單地考慮過'reset --soft',但決定首先保持簡單。 – VonC

+1

我喜歡'reset --soft'在http://stackoverflow.com/a/5203843/6309:「每次你對最終結果感到滿意(在工作樹和索引方面),但你不是滿足了所有提交給你的提交:'git reset --soft'就是答案。「 – VonC

相關問題