Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何从一个铁血的git push-f原始主机中恢复?_Git_Git Commit_Git Push - Fatal编程技术网

我如何从一个铁血的git push-f原始主机中恢复?

我如何从一个铁血的git push-f原始主机中恢复?,git,git-commit,git-push,Git,Git Commit,Git Push,我只是使用--force选项向我的项目提交了错误的源代码 有可能恢复吗?我知道以前的所有分支都被使用-f选项覆盖了,所以我可能把以前的修订搞砸了。Git通常不会扔掉任何东西,但从中恢复可能仍然很棘手 如果您有正确的来源,则可以使用--force选项将其推入遥控器。Git不会删除任何分支,除非你告诉它。如果您确实丢失了提交,请查看。如果您知道所需提交的SHA-1,那么您可能还可以 最好的做法是:备份所有内容并查看本地存储库中仍然存在的内容。如果可能,请在遥控器上执行同样的操作。使用git-fsck

我只是使用
--force
选项向我的项目提交了错误的源代码


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

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

如果您有正确的来源,则可以使用
--force
选项将其推入遥控器。Git不会删除任何分支,除非你告诉它。如果您确实丢失了提交,请查看。如果您知道所需提交的SHA-1,那么您可能还可以

最好的做法是:备份所有内容并查看本地存储库中仍然存在的内容。如果可能,请在遥控器上执行同样的操作。使用
git-fsck
查看是否可以恢复,最重要的是不要运行
git-gc


最重要的是,不要使用
--force
选项,除非你是认真的。

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

我所做的只是(在疯狂地复制了几份本地回购协议之后):

(上面说origin/master领先了68次提交,很好……这些都是我删除的提交)

git远程设置url源
git推送
一切都恢复到我用力推之前的状态。
要记住的最重要的事情是永远不要进行git签出。在你用力推之后。但最好的做法是禁用推送选项。我再也不用它了。我吸取了教训

如果知道提交散列,很容易,只需重新创建分支即可

删除远程分支:

git push origin :master
然后使用以下命令重新创建分支:

git checkout 5794458
git branch master
git push origin master

解决方案已经提到


如果您不在强制推送来源的本地回购协议上,则在原始/主级,无法恢复。但是,如果您足够幸运地使用or,您可以查看API并检索丢失的提交作为补丁,例如:

  • 列出事件并查找提交sha1长格式
  • 下载丢失的提交并检索json路径中的相关补丁。files[]/patch
  • 局部应用并再次推送
  • git apply patch.patch&&git commit-m“还原的提交”&&git推送源主机


    如果上一次推送不是来自您的本地回购,则恢复丢失的提交,甚至找出丢失了哪些提交的另一种方法是查看您的CI计算机

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

    CI计算机甚至可能保留一个本地的repo克隆,您可以从中执行此恢复


    资料来源:可能你可以在这里阅读决策

    第二个帮助了我。 我把这些命令搞错了

    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
    

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

    文档中的文本:

    删除早于指定时间的条目。如果此选项不可用 指定时,将从配置设置中获取过期时间 gc.reflogExpire,默认为90天--过期=全部 修剪条目,而不考虑其年龄--expire=永不关闭 修剪可访问项(但请参见--expire unreachable)

    因此,您可以:

    1-
    git reflog

    2-您选择要使用
    git reset–hard Head@{Head-Number}

    3-通过
    git cherry-v branch\u name

    4-最后,您应该强制推送
    git push-f branch\u name

    1-从GIT客户端(接口)获取SHA的编号

    2-强制推送

    git push -f your_branch
    

    希望这对像我这样处境非常糟糕的人有所帮助(例如,如果在运行git reset--hard时遇到
    错误对象
    ):

    我写了一篇文章,最后从GithubAPI中提取所有文件。以下是如何使用它:

  • 克隆
    treesaver
    脚本并将
    cd
    复制到其中
  • 通过访问查找要还原的树的
    SHA
    字符串
    https://api.github.com/repos///events
  • 在推送事件对应的
    payload
    属性中,找到要还原到的
    commit
    并单击其
    url
  • commit.tree
    下,复制
    树的
    url
  • 运行python3 main.py
  • 例如,在我的情况下,我会运行:

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

    当然,PRs是欢迎的。

    您很可能只需查看重新登录即可确定远程分支最初的位置。例如,
    git reflog show remotes/origin/master
    。你应该能够看到你的推进;前一行中的提交是在您将其弄糟之前的位置。然后,您可以将该修订版(使用
    --force
    )推到原始版本,然后回到原来的位置@大卫:哦。你在问题中没有提到你没有回购协议。(这当然是你永远不想做的事情。)但是,如果你有文件系统访问权限,你仍然可以在那里做所有这些。@David:Yikes。总是很好
    1) (some-branch) git pull -> correct command was git pull origin some-branch
    
    2) (some-branch) git push -f origin some-branch
    
    git push --force origin 0b258eb:some-branch
    
    git reset --hard commit_SHA
    
    git push -f your_branch
    
    python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .