V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
Yo_oY
V2EX  ›  git

git push -f 了之后有后悔药可以吃么

  •  
  •   Yo_oY · 2014-06-09 16:29:40 +08:00 · 25847 次点击
    这是一个创建于 3827 天前的主题,其中的信息可能已经有所发展或是发生改变。
    git push -f 的时候写错了分支名,把develop分支给覆盖了,但是本地的develop进度还是几个小时之前的,所以这之后别人提交到远端develop分支的进度就没了。

    有没有什么方法可以取消这个操作?还是只能让别人重新提交了?

    谢谢。。。。
    13 条回复    2014-06-10 13:48:12 +08:00
    YufunHe
        1
    YufunHe  
       2014-06-09 16:33:10 +08:00
    额 帮顶,刚才刚-f了一个,还好没弄错……
    ToughGuy
        2
    ToughGuy  
       2014-06-09 16:44:40 +08:00
    今天用git rm -rf 之前忘记commit
    现在正失落ing...
    ijse
        3
    ijse  
       2014-06-09 16:50:17 +08:00
    应该可以用git reset或者revert来找回,记录还是有的
    clino
        4
    clino  
       2014-06-09 16:58:41 +08:00   ❤️ 1
    重新 git push -f 原来的版本不就好了?
    还没gc的话可以用git reflog来找之前丢的版本
    hexor
        5
    hexor  
       2014-06-09 17:02:38 +08:00   ❤️ 1
    这样没办法的.

    假设你冲掉了A的提交, 而且你之前又没把A的提交拉到你的本地, 那么这样一来A的提交就只存在于A的本地了(假设没有另外的人在你冲掉之前拉过A的提交的话).

    reflog的话应该只适用于在你本地存在过的commit都能找回来, 但是A的提交根本没在你本地存在过.

    不过这不是很严重吧 让A再提交一次就可以啦, 成本还是很低的.

    以上.
    jsonline
        6
    jsonline  
       2014-06-09 17:05:30 +08:00 via Android
    不要手贱。
    smalldirector
        7
    smalldirector  
       2014-06-09 17:18:02 +08:00
    上周末,我更蛋疼,我居然执行了rm -rf ~命令,敲下回车的那一刹那,一万个草泥马在我心中奔腾~~
    clowwindy
        8
    clowwindy  
       2014-06-09 18:26:59 +08:00   ❤️ 2
    如果远程没 gc 可能捞得回来。

    $ git clone xxx
    $ cd xxx
    $ git fsck --lost-found
    dangling commit 4d4888a3273a5b56d69df69cbf9698fed7c19a36

    $ git show 4d4888a3273a5b56d69df69cbf9698fed7c19a36
    commit 4d4888a3273a5b56d69df69cbf9698fed7c19a36
    Author: clowwindy <[email protected]>
    Date: Mon Jun 9 12:48:28 2014 +0800

    Update README.md

    ...
    确认是你要找的 commit 之后 checkout 这个 commit。然后
    $ git branch -D develop
    $ git branch -b develop
    $ git push -f origin develop
    neevek
        9
    neevek  
       2014-06-09 18:52:21 +08:00
    可以有些补救方法,首先要找到那个有原来upstream上最新提交的人,让他执行下面这组命令:

    方法1:
    如果只有两个人(包括你自己):
    git fetch origin develop
    git checkout develop
    git rebase --onto origin/develop SHA1_CULPRIT develop
    git push origin develop

    方法2:
    如果多于两个人(包括你自己):
    git fetch origin develop
    git checkout develop
    git cherry-pick SHA1_CULPRIT^..origin/develop
    (这时候如果有冲突则解决冲突后执行git add .; git cherry-pick --continue)
    git push -f origin master

    对于方法2,确保在执行git push -f的时候其他人没有在做push。

    注:SHA1_CULPRIT就是上次你跟upstream同步之后提交的第一个commit的sha1 hash。


    最后一个提醒,99%的场景下,你不需要push --force。如果你没有100%确认自己在做什么,没有100%把握知道怎么解决问题,最好别尝试force push。
    Panic
        10
    Panic  
       2014-06-09 19:05:06 +08:00
    git果然是给专家用的
    ichou
        11
    ichou  
       2014-06-10 11:09:56 +08:00
    我默默的去百度 -f 是干嘛的去了
    jamiesun
        12
    jamiesun  
       2014-06-10 13:45:15 +08:00
    @smalldirector 做好备份就好,
    rm -fr 还是相当贴心的。
    我又一次因为/usr/local搞乱了搞不定,就直接 rm -fr /usr/local,然后将备份恢复省了折腾时间。
    smalldirector
        13
    smalldirector  
       2014-06-10 13:48:12 +08:00
    @jamiesun 是的,幸亏两天前用time machine备份过一次,不过还是丢了这两天的一些改动~~现在弄得我硬盘天天插着备份了~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2564 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 05:17 · PVG 13:17 · LAX 21:17 · JFK 00:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.