给定使用commit提交的更改,然后使用revert恢复,然后撤消该恢复的最佳方法是什么?
commit
revert
理想情况下,这应该通过新的提交来完成,以免重写历史。
如果您还没有推送该更改,git reset --hard HEAD^
git reset --hard HEAD^
否则,恢复还原是完全可以的。
另一种方法是git checkout HEAD^^ -- .,然后git add -A && git commit。
git checkout HEAD^^ -- .
git add -A && git commit
git cherry-pick <original commit sha> 将复制原始提交,基本上重新应用提交
git cherry-pick <original commit sha>
恢复将做同样的事情,使用更混乱的提交消息: git revert <commit sha of the revert>
git revert <commit sha of the revert>
这两种方式都允许您git push而不会覆盖历史记录,因为它会在还原后创建一个新的提交。 键入提交sha时,通常只需要前5或6个字符: git cherry-pick 6bfabc
git push
git cherry-pick 6bfabc
如果您不喜欢“恢复还原”的想法(尤其是当这意味着丢失许多提交的历史信息时),您可以随时前往关于"恢复错误的合并"的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:
master
A'---B'---C'------------D'---E' <-- recreated topic branch / P---o---o---M---x---x---W---x \ / A---B---C----------------D---E
或者你可以git checkout -b <new-branch>和git cherry-pick <commit>之前到和git rebase删除revert提交。像以前一样发送拉请求。
git checkout -b <new-branch>
git cherry-pick <commit>
git rebase
恢复提交就像git中的任何其他提交一样。这意味着,你可以恢复它,如:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
这显然只有在更改被推送后才有意义,尤其是当你不能强制推送到目标分支时(这对你的大师分支来说是个好主意)。如果更改没有被推送,就像其他帖子一样,选择、恢复或简单地删除恢复提交。
在我们的团队中,我们有一个规则,在主分支中提交的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'
通过这种方式,你可以追溯历史并弄清楚整个故事,甚至那些不知道遗产的人也可以自己解决。然而,如果你樱桃采摘或rebase的东西,这些有价值的信息就会丢失(除非你在评论中包含它)。
显然,如果提交多次恢复并重新恢复,那就会变得非常混乱。
我是这样做的: 如果分支my_branchname包含在已恢复的合并中。我想取消恢复my_branchname:
my_branchname
我首先从my_branchname执行git checkout -b my_new_branchname。 然后我做一个git reset --soft $COMMIT_HASH,其中$COMMIT_HASH是提交权的提交哈希之前my_branchname的第一次提交(见git log) 然后我做一个新的提交git commit -m "Add back reverted changes" 然后我向上推新的分支git push origin new_branchname 然后我对新分支提出了拉取请求。
git checkout -b my_new_branchname
git reset --soft $COMMIT_HASH
$COMMIT_HASH
git log
git commit -m "Add back reverted changes"
git push origin new_branchname
恢复还原就行了
例如,
如果abcdef是您的提交,而ghijkl是您恢复提交abcdef时的提交,则运行:
abcdef
ghijkl
git revert ghijkl
这将恢复还原
要取回提交后恢复的未分阶段和分阶段更改:
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来检索你的~哈希,然后运行git reset --hard ~hash来恢复你的文件。
git reset --hard HEAD
--hard
git reflog
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>
如果您错误地恢复了:
git revert <commit-id>
您只需运行:
git cherry-pick <commit-id>
我必须提交我的更改才能使用此命令进行处理。
您可以通过运行以下命令获取提交ID:
git log --pretty=format:"%h - %an, %ar : %s"