如何从错误的git push -f origin master中恢复?

mrd*_*enz 77 git git-push git-commit

我刚使用--force选项将错误的源代码提交给了我的项目.

是否有可能还原?我知道所有以前的分支都被使用-f选项覆盖,所以我可能搞砸了我之前的修订版.

Cam*_*ner 47

Git通常不会扔掉任何东西,但从中恢复可能仍然很棘手.

如果您有正确的源,那么您可以使用该--force选项将其推入遥控器.除非你告诉它,否则Git不会删除任何分支.如果您确实丢失了提交,那么请查看这个有用的指南来恢复提交.如果你知道你想要的提交的SHA-1那么你可能没问题.

最好的办法:备份所有内容,查看本地存储库中的内容.如果可能,在遥控器上执行相同操作.使用git fsck,看看你是否能恢复的东西,最重要的不运行git gc.

最重要的是,永远不要使用该--force选项,除非你真的,真的是这个意思.

  • 您很可能只需查看reflog即可确定远程分支的最初位置.例如,`git reflog show remotes/origin/master`.你应该能够看到你的推动; 上一行中的提交是在你搞砸之前的地方.然后你可以将该修订版(带有`--force`)推送到原点,并回到原来的位置! (58认同)
  • @Jefromi 的答案在哪里?在此评论线程之外,我没有看到此页面上提到的用户。 (3认同)

小智 45

如果你知道提交哈希,那很容易,只需重新创建你的分支.

5794458...b459f069 master -> master (forced update)
Run Code Online (Sandbox Code Playgroud)

删除远程分支:

git push origin :master
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令重新创建分支:

git checkout 5794458
git branch master
git push origin master
Run Code Online (Sandbox Code Playgroud)


Abd*_*fid 23

这里已经提到解决方案

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,感谢您链接到正确的答案。 (2认同)

يعق*_*قوب 8

是的,您可以在之后恢复提交 git push -f your_branch

来自 Doc 的文字

修剪早于指定时间的条目。如果未指定此选项,则过期时间取自配置设置 gc.reflogExpire,默认为 90 天。--expire=all 修剪条目,无论其年龄如何;--expire=never 关闭可访问条目的修剪(但请参阅--expire-unreachable)。

所以你可以这样做:

1- git reflog

在此处输入图片说明

2- 你选择 Head_Number 你想用什么来恢复 git reset –hard HEAD@{HEAD-NUMBER}

在此处输入图片说明

3-您可以通过以下方式查看此头上的所有提交 git cherry -v branch_name

4-最后你应该强制推送 git push -f branch_name

或者

1- 从您的 GIT 客户端(界面)获取 SHA 的数量

git reset --hard commit_SHA
Run Code Online (Sandbox Code Playgroud)

2-力推

git push -f your_branch
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


Pie*_*ERT 6

如果您不在强制推送来自的本地仓库中,则在原始/主级别无法恢复.但是如果你有幸使用GitHubGitHub for Enterprise,你可以查看REST API并检索丢失的提交作为补丁,例如:

  1. 列出事件并找到提交sha1长格式

https://api.github.com/repos/apache/logging-log4j2/events

  1. 下载丢失的提交并在json路径.files []/patch中检索相关的补丁

https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. 在本地应用并再次推送

git apply patch.patch && git commit -m"restored commit"&& git push origin master


use*_*610 5

如果之前的推送不是来自本地存储库,则恢复丢失的提交甚至找出丢失的提交的另一种方法是查看 CI 机器。

如果您有一项工作在每次提交(或一系列连续提交)后测试主分支,那么您可以查看它最后测试的内容。这就是您需要恢复的提交。

CI 机器甚至可能保留存储库的本地克隆,您可以从中执行此恢复。

资料来源:可能是持续交付:通过构建、测试和部署自动化实现可靠的软件发布(Addison-Wesley 签名系列 (Fowler))