代码之家  ›  专栏  ›  技术社区  ›  David van Dugteren

我怎么能从一个铁质的git push-f原点大师那里恢复?

  •  68
  • David van Dugteren  · 技术社区  · 14 年前

    我刚把错误的来源提交给我的项目使用 --force 选择权。

    是否可以恢复?我了解所有以前的分支都已被覆盖,使用 -f 选项,所以我可能把以前的修改搞砸了。

    7 回复  |  直到 6 年前
        1
  •  44
  •   David Ferenczy Rogožan Hugo L.M    8 年前

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

    如果你有正确的信号源,你可以用 --force 选择权。Git不会删除任何分支,除非你告诉它。如果你真的失去了承诺,那么看看 this useful guide to recovering commits . 如果你知道你想要的承诺中的sha-1,那么你可能没事。

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

    最重要的是,不要使用 --力 除非你真的,真的很认真。

        2
  •  44
  •   David Ferenczy Rogožan Hugo L.M    8 年前

    如果知道提交哈希,那么很容易,只需重新创建分支即可。

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

    删除远程分支:

    git push origin :master
    

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

    git checkout 5794458
    git branch master
    git push origin master
    
        3
  •  19
  •   Community CDub    7 年前

    已经提到了解决方案 here

    # 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
    
        4
  •  6
  •   Pierrick HYMBERT    7 年前

    如果您不在强制推送来源的本地回购上,则在原始/主级别无法恢复。但如果你是 幸运的 足够使用 GitHub GitHub for Enterprise ,你可以看看 REST api和retrieve lost commit as patch,示例:

    1. 列出事件并查找commit sha1 long格式

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

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

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

    1. 本地应用并再次推送

    git apply patch.patch&git commit-m“还原提交”&git push origin master

        5
  •  2
  •   Fabio Mora    12 年前

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

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

    git add .
    git status
    

    (据说源头/主人领先68个承诺,很好……这些都是我删除的承诺)

    git remote set-url origin <GIT_SSH_URL>
    git push
    

    在我用力推之前,一切都恢复了原状。 最重要的是记住永远不要做一个git结帐。在你用力推之后。但最好的做法是禁用推送选项。我再也不用了。我吸取教训了!!

        6
  •  2
  •   user7610    6 年前

    另一种恢复丢失的提交甚至弄清楚丢失了什么提交的方法是查看您的CI机器,如果以前的推送不是来自您的本地回购。

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

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

    资料来源:可能 Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))

        7
  •  0
  •   Andrey    6 年前

    在这里你可以阅读决定 https://evilmartians.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某些分支->来源/某些分支

    第二个hash 0b258eb正是我需要的。所以,我接受了这个哈希并生成命令

    git push --force origin 0b258eb:some-branch