2017-06-21 103 views
0

說我這樣做如下操作:如何在恢復後提交相同的提交,同時保留提交信息?

git init 
touch initial && git add initial && git commit -m "Initial commit" 
git checkout -b A 
touch test_1 && git add . && git commit -m "Commiting test 1"                                                          NORMAL 
touch test_2 && git add . && git commit -m "Commiting test 2"                                                          NORMAL 
git checkout master 
git merge --no-ff A 
git revert -m 1 head 

現在,恢復這些提交,變化的東西后,我決定,我再次想這些提交。我不能再做git merge A,因爲那些提交已經在分支中。

我寧願不做git revert head,因爲當有人跑git blame時,他們會看到Revert "Revert "Merge branch 'A'""這不是特別有用。所以我想要保留原始提交的提交消息/正文。

我的破解是在A上運行git rebase,並稍微修改了第一次提交的消息,因此提交的哈希值已更新,我可以再次合併,但必須有更好的方法來完成同樣的事情。

回答

0

你能恢復的還原:

git revert <commit sha of the revert> 

另一種選擇是櫻桃採摘兩次提交之間的差異:

git cherry-pick master...dev 

最後,你也可以把差異變成補丁然後應用它:

git diff commit1 commit2 > some.patch 
git apply some.patch 
+0

我寧願不恢復恢復(請參閱問題爲什麼)。你能更具體地說明我將如何使用櫻桃挑選?可以肯定的是,我不能做'git cherry-pick master ... A',因爲最後一次提交是櫻桃挑選不喜歡的合併。 –

+0

我已經添加了修補程序選項,也許您可​​以使用它在您選擇的提交之間創建一個修補程序。 – hurturk

0

恢復恢復比在腳下改變更多信息sudde通過改版而無需解釋。

記住:

  • revert保留提交信息,並有效地創建一個反向的補丁,這就是爲什麼Git把合併後的分支,拒絕,直到復歸回覆到重新合併。

  • rebase刪除歷史。除非有必要,否則不想刪除歷史記錄。

+0

要清楚,我沒有在主人身上運行rebase。我在A上運行它,然後將A合併回主。 –

+0

這更糟糕。當回覆已經引入了自己的混亂時,它會讓你的Git歷史混亂。你最好堅持回覆。 – Makoto

+0

爲什麼更糟?我弄亂的唯一git歷史記錄是在功能分支上,它不需要一致的歷史記錄。 –

0

確實,絆倒一系列回覆 - 回覆是令人討厭的。

(更糟糕的是,在一次衝刺中,有一段代碼路徑,我認爲總共有六個恢復級別,我看過去了。幸運的是,這個分支不適合發佈。)

默認情況下,恢復記錄它正在恢復的提交的哈希ID,因此您可以簡單地明確選擇原始提交(也可以編輯消息以指出它在恢復後重新導入)。這甚至可以通過提供-m參數進行合併,儘管這裏偶爾會出現一些邊界情況(所以要小心結果)。

或者 - 更安全 - 恢復合併的恢復,但是然後編輯提交消息以提供更多信息。您可以將git revert命令或git commit --amend恢復恢復提交使用-e/--edit(這是默認設置),以將其複製到具有改進的提交消息的新的改進的提交。

相關問題