112

--force我只是使用选项将错误的源提交给我的项目。

有可能恢复吗?我知道所有以前的分支都已使用-f选项覆盖,所以我可能搞砸了我以前的修订。

4

9 回答 9

63

Git 通常不会丢弃任何东西,但从中恢复可能仍然很棘手。

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

最好的做法:备份所有内容并查看本地存储库中的内容。如果可能,在遥控器上做同样的事情。用于git fsck查看是否可以恢复东西,最重要的是不要运行git gc

最重要的是,--force除非你真的,真的是认真的,否则永远不要使用该选项。

于 2010-10-20T01:11:45.630 回答
56

如果您知道提交哈希,这很容易,只需重新创建您的分支。

5794458...b459f069 master -> master (forced update)

删除远程分支:

git push origin :master

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

git checkout 5794458
git branch master
git push origin master
于 2014-06-23T19:00:42.407 回答
43

解决方案已经在这里提到

# 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
于 2017-02-16T10:44:55.423 回答
16

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

文档中的文字

修剪早于指定时间的条目。如果未指定此选项,则过期时间取自配置设置 gc.reflogExpire,默认为 90 天。--expire=所有修剪条目,无论其年龄大小;--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

2-强制推动

git push -f your_branch

希望这可以帮助

于 2019-11-20T09:51:48.053 回答
7

如果您不在强制推送来自的本地存储库中,则在源/主级别无法恢复。但是,如果您有幸使用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

于 2018-01-05T09:42:35.423 回答
4

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

如果你有一份工作在每次提交(或一系列连续提交)后测试主分支,你应该有,你可以看看它最后测试了什么。那是您需要恢复的提交。

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

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

于 2018-08-16T07:15:39.737 回答
2

我在撤消仅对一个文件的最后一次推送时做了同样的事情。最终回到存储库的原始状态。我使用的是来自 Linus 的 git 命令,因为我在 Linux 上有本地副本。幸运的是,该副本仍然完好无损。

我所做的只是(在疯狂地复制了几份本地仓库之后):

git add .
git status

(它说 origin/master 领先 68 次提交,很好......这些都是我删除的所有提交)

git remote set-url origin <GIT_SSH_URL>
git push

一切都恢复到我用力推动之前的状态。要记住的最重要的事情是永远不要执行 git checkout 。在你用力推后。但最佳做法是禁用推送选项。我再也不会使用它了。吸取我的教训!!

于 2012-07-26T22:23:01.623 回答
1

对于像我这样处于非常糟糕情况的人(例如,如果您bad object在运行时遇到错误git reset --hard):

我写了一个名为 treesaver 的脚本,作为最后的手段,它从 GitHub API 中提取所有文件。以下是如何使用它:

  1. 克隆treesaver脚本并复制cd到它。
  2. 通过访问找到SHA您要恢复的树的字符串 https://api.github.com/repos/<your_username_or_org>/<repo>/events
  3. payload与您的推送事件对应的属性中,找到commit您要恢复到的属性并单击其url
  4. commit.tree,复制treeurl
  5. 运行python3 main.py <tree_url> <path_to_save_to>

例如,就我而言,我会运行:

python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .

当然,欢迎 PR。

于 2020-07-12T00:41:13.490 回答
0

在这里您可以阅读决策https://eilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it

第二个帮了我。我做错了这些命令

1) (some-branch) git pull -> correct command was git pull origin some-branch

2) (some-branch) git push -f origin some-branch

在这些命令之后,我失去了三个提交。为了恢复它们,我查看了错误地“git pull”的终端,并看到了类似的输出

60223bf...0b258eb 一些分支 -> 起源/一些分支

第二个哈希 0b258eb 正是我需要的。所以,我拿了这个哈希并产生命令

git push --force origin 0b258eb:some-branch
于 2019-01-08T13:03:35.830 回答