簡體   English   中英

如何“取消還原”已還原的 Git 提交?

[英]How do I "un-revert" a reverted Git commit?

給定一個使用commit的更改,然后使用revert ,那么撤消該還原的最佳方法是什么?

理想情況下,這應該通過新的提交來完成,以免重寫歷史。

git cherry-pick <original commit sha>
將制作原始提交的副本,本質上是重新應用提交

恢復 revert 將做同樣的事情,但提交信息更混亂:
git revert <commit sha of the revert>

這兩種方式中的任何一種都可以讓您在不覆蓋歷史記錄的情況下進行git push ,因為它會在還原后創建一個新的提交。
輸入提交 sha 時,通常只需要前 5 或 6 個字符:
git cherry-pick 6bfabc

如果您還沒有推送該更改,請使用git reset --hard HEAD^

否則,還原還原是非常好的。

另一種方法是git checkout HEAD^^ -- . 然后git add -A && git commit

恢復提交就像 git 中的任何其他提交一樣。 意思是,您可以還原它,如下所示:

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

這顯然只有在推送更改后才有意義,尤其是當您無法強制推送到目標分支時(這對您的分支來說是個好主意)。 如果尚未推送更改,只​​需按照其他帖子進行挑選、還原或簡單地刪除還原提交。

在我們的團隊中,我們有一個規則,對在主分支中提交的 Revert 提交使用revert ,主要是為了保持歷史記錄干凈,以便您可以看到哪個提交還原了什么:

     7963f4b2a9d    Revert "Revert "OD-9033 parallel reporting configuration"
     "This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
                    ...
     a0e5e86d3b6    Revert "OD-9055 paralel reporting configuration"
     This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
                ...
     Merge pull request parallel_reporting_dbs to master* commit 
    '648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'

這樣,你可以追溯歷史,找出整個故事,甚至那些不了解遺產的人也可以自己解決。 然而,如果你挑選變基的東西,這些有價值的信息就會丟失(除非你在評論中包含它)。

顯然,如果一個提交多次恢復和重新恢復,那將變得非常混亂。

恢復revert就可以了

例如,

如果abcdef是您的提交,而ghijkl是您恢復提交abcdef時的提交,則運行:

git revert ghijkl

這將還原還原

我是這樣做的:
如果分支my_branchname包含在已恢復的合並中。 我想恢復my_branchname

我首先從my_branchname執行git checkout -b my_new_branchname my_new_branchname 。
然后我做一個git reset --soft $COMMIT_HASH其中$COMMIT_HASHmy_branchname的第一次提交之前提交的提交哈希(參見git log
然后我做了一個新的提交git commit -m "Add back reverted changes"
然后我向上推新分支git push origin new_branchname
然后我對新分支提出了拉取請求。

給定使用commit的更改,然后使用revert的更改,那么撤消該還原的最佳方法是什么?

理想情況下,應使用新的提交完成此操作,以免重寫歷史記錄。

如果你不喜歡“reverting a revert”的想法(尤其是當這意味着丟失許多提交的歷史信息時),你可以隨時查看有關“Reverting a faulty merge”的 git 文檔。

鑒於以下起始情況

 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E   <-- fixed-up topic branch

(W 是您對合並 M 的初始還原;D 和 E 是對您最初損壞的功能分支/提交的修復)

您現在可以簡單地將提交 A 重播到 E,以便它們都不“屬於”恢復的合並:

$ git checkout E
$ git rebase --no-ff P

您的分支的新副本現在可以再次合並到master

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E

如果您錯誤地進行了還原:

git revert <commit-id>

你只需要運行:

git cherry-pick <commit-id>

我必須提交我的更改以使用此命令進行處理。

您可以通過運行以下命令獲取您的提交 ID:

git log --pretty=format:"%h - %an, %ar : %s"

或者你可以git checkout -b <new-branch>git cherry-pick <commit>之前的和git rebase來刪除revert commit。 像以前一樣發送拉取請求。

要取回提交后恢復的未暫存和暫存更改:

git reset HEAD@{1}

要恢復所有未暫存的刪除:

git ls-files -d | xargs git checkout --

我遇到了一個問題,有人將我的分支恢復為 master,但我需要能夠再次合並它,但問題是恢復包含了我的所有提交。 讓我們看看我們從 M1 創建功能分支的案例,我們在 M3 中合並我們的功能分支並在 RM3 中恢復它

M1 -> M2 -> M3 -> M4- > RM3 -> M5
 \.         /
  F1->F2 -

如何讓F2能夠合並到M5?

git checkout master
git checkout -b brach-before-revert
git reset --hard M4
git checkout master
git checkout -b new-feature-branch
git reset --hard M1 
git merge --squash brach-before-revert

在意外刪除所有文件的最初恐慌之后,我使用以下方法取回了我的數據

git reset HEAD@{1}         
git fsck --lost-found      
git show 
git revert <sha that deleted the files>

我看到響應包括命令git reset --hard HEAD沒有任何謹慎。 由於選項--hard ,您應該小心使用該命令。 它會重置您的索引和遠程存儲庫,但大多數情況下,它還會重置您的本地存儲庫,並且所有未推送到遠程但尚未從本地存儲庫和索引中提交的提交都將丟失。 切勿使用該標志--hard ,除非您確定還想將所有本地工作從當前提交重置到您選擇的哈希值。 如果無論如何你做錯了,運行git reflog來檢索你的 ~hash 然后git reset --hard ~hash來恢復你的文件。

就我而言,我需要在還原后提交更改,然后才能挑選原始提交而不會失敗。

git commit -m "Make changes (original commit)."
git revert <original commit hash>
git commit -m "Revert original commit."
git cherry-pick <original commit hash>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM