--force
我只是使用选项将错误的源提交给我的项目。
有可能恢复吗?我知道所有以前的分支都已使用-f
选项覆盖,所以我可能搞砸了我以前的修订。
Git 通常不会丢弃任何东西,但从中恢复可能仍然很棘手。
--force
如果您有正确的来源,那么您可以使用该选项将其推送到遥控器中。除非你告诉它,否则 Git 不会删除任何分支。如果您确实丢失了提交,请查看这个有用的恢复提交指南。如果您知道所需提交的 SHA-1,那么您可能没问题。
最好的做法:备份所有内容并查看本地存储库中的内容。如果可能,在遥控器上做同样的事情。用于git fsck
查看是否可以恢复东西,最重要的是不要运行git gc
。
最重要的是,--force
除非你真的,真的是认真的,否则永远不要使用该选项。
如果您知道提交哈希,这很容易,只需重新创建您的分支。
5794458...b459f069 master -> master (forced update)
删除远程分支:
git push origin :master
然后使用以下命令重新创建您的分支:
git checkout 5794458
git branch master
git push origin master
解决方案已经在这里提到
# 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
是的,您可以在之后恢复提交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
希望这可以帮助
如果您不在强制推送来自的本地存储库中,则在源/主级别无法恢复。但是,如果您有幸使用GitHub或GitHub for Enterprise,您可以查看REST API 并将丢失的提交检索为补丁,例如:
https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de
git apply patch.patch && git commit -m "restored commit" && git push origin master
如果先前的推送不是来自您的本地存储库,则恢复丢失的提交甚至找出丢失的提交的另一种方法是查看您的 CI 机器。
如果你有一份工作在每次提交(或一系列连续提交)后测试主分支,你应该有,你可以看看它最后测试了什么。那是您需要恢复的提交。
CI 机器甚至可以保留 repo 的本地克隆,您可以从中执行此恢复。
来源:可能是持续交付:通过构建、测试和部署自动化实现可靠的软件发布(Addison-Wesley 签名系列 (Fowler))
我在撤消仅对一个文件的最后一次推送时做了同样的事情。最终回到存储库的原始状态。我使用的是来自 Linus 的 git 命令,因为我在 Linux 上有本地副本。幸运的是,该副本仍然完好无损。
我所做的只是(在疯狂地复制了几份本地仓库之后):
git add .
git status
(它说 origin/master 领先 68 次提交,很好......这些都是我删除的所有提交)
git remote set-url origin <GIT_SSH_URL>
git push
一切都恢复到我用力推动之前的状态。要记住的最重要的事情是永远不要执行 git checkout 。在你用力推后。但最佳做法是禁用推送选项。我再也不会使用它了。吸取我的教训!!
对于像我这样处于非常糟糕情况的人(例如,如果您bad object
在运行时遇到错误git reset --hard
):
我写了一个名为 treesaver 的脚本,作为最后的手段,它从 GitHub API 中提取所有文件。以下是如何使用它:
treesaver
脚本并复制cd
到它。SHA
您要恢复的树的字符串
https://api.github.com/repos/<your_username_or_org>/<repo>/events
。payload
与您的推送事件对应的属性中,找到commit
您要恢复到的属性并单击其url
。commit.tree
,复制tree
的url
。python3 main.py <tree_url> <path_to_save_to>
。例如,就我而言,我会运行:
python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .
当然,欢迎 PR。
在这里您可以阅读决策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