我有一個git存儲庫,以下所示: html
A -> B -> C -> D -> HEAD
我但願分支的頭部指向A,即我但願B,C,D和HEAD消失,我但願頭部與A同義。 git
聽起來我能夠嘗試改變(不適用,由於我推進了之間的變化),或者還原。 可是如何恢復多個提交? 我一次還原一個嗎? 訂單重要嗎? app
爲此,您只需使用revert命令,指定要恢復的提交範圍。 spa
考慮到你的例子,你必須這樣作(假設你在分支'master'): 指針
git revert master~3..master
這將在您的本地建立一個新的提交,使用B,C和D的反向提交(意味着它將撤消這些提交引入的更改): code
A <- B <- C <- D <- BCD' <- HEAD
git reset --hard a git reset --mixed d git commit
這將馬上成爲全部人的回覆。 給出一個好的提交消息。 htm
擴展我在評論中寫的內容 ip
通常規則是您不該該重寫(更改)您已發佈的歷史記錄,由於有人可能已將其工做基於它。 若是您重寫(更改)歷史記錄,則會在合併更改和更新時遇到問題。 get
因此解決方案是建立一個新的提交 ,它能夠恢復你想要刪除的更改 。 您可使用git revert命令執行此操做。 數學
您有如下狀況:
A <-- B <-- C <-- D <-- master <-- HEAD
(這裏的箭頭指的是指針的方向:提交時的「父」引用,分支頭(分支引用)的頂部提交,以及HEAD引用的分支名稱)。
您須要建立的內容以下:
A <-- B <-- C <-- D <-- [(BCD)^-1] <-- master <-- HEAD
其中「[(BCD)^ - 1]」表示恢復提交B,C,D中的更改的提交。數學告訴咱們(BCD)^ - 1 = D ^ -1 C ^ -1 B ^ -1,因此您可使用如下命令獲取所需的狀況:
$ git revert --no-commit D $ git revert --no-commit C $ git revert --no-commit B $ git commit -m "the commit message"
替代解決方案是檢查提交A的內容 ,並提交此狀態:
$ git checkout -f A -- . $ git commit -a
那麼你會遇到如下狀況:
A <-- B <-- C <-- D <-- A' <-- master <-- HEAD
提交A'與提交A具備相同的內容,可是是不一樣的提交(提交消息,父項,提交日期)。
由Charles Bailey修改的Jeff Ferland的解決方案創建在一樣的想法上,但使用git reset :
$ git reset --hard A $ git reset --soft @{1} # (or ORIG_HEAD), which is D $ git commit
與Jakub的答案相似,這使您能夠輕鬆選擇要還原的連續提交。
# revert all commits from B to HEAD, inclusively $ git revert --no-commit B..HEAD $ git commit -m 'message'
首先要確保您的工做副本未被修改。 而後:
git diff HEAD commit_sha_you_want_to_revert_to | git apply
而後只是提交。 不要忘記記錄恢復的緣由。