V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ioiioi
V2EX  ›  问与答

问个白痴的 git 问题,如何恢复被 git rm <somefiles>删掉的文件?

  •  
  •   ioiioi · 2016-12-19 23:26:58 +08:00 · 5106 次点击
    这是一个创建于 2897 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样的,我在 bitbucket 中创建了一个私有仓库,公司和家里各一台电脑关联到该私有仓库,家里的电脑前几天修改了仓库中的一个文件: file.txt ,然而当时没有 git push origin master ,然后这几天中在公司的电脑中修改了这个文件,并 git push origin master ,现在我想取消掉家里电脑对 file.txt 这个文件的修改,然后使用 git pull origin master 将私有仓库的 file.txt 最新版本下载下来,正确的操作流程应该是怎样的?

    PS :我现在已经在家里的电脑中使用 git rm file.txt 了,但是接着使用 git pull origin master 并不会将 file.txt 从私有仓库中下下来。
    8 条回复    2016-12-21 17:11:47 +08:00
    forgcode
        1
    forgcode  
       2016-12-19 23:44:21 +08:00
    checkout 一下放弃修改!
    ioiioi
        2
    ioiioi  
    OP
       2016-12-20 00:20:12 +08:00
    嗯,我用 git reset --hard HEAD^回退到上一个 commit 之前的状态,把 git rm file.txt 给找回来了。接着我又用 git pull origin master ,出现如下错误:

    ```
    ....
    Unmerged paths:
    (use "git add <file>..." to mark resolution)

    both modified: _sass/_layout.scss
    both modified: css/main.scss
    both modified: index.html
    ```

    我现在的问题是,我想用远端仓库的文件,覆盖掉本地的这三个文件。该如何操作?
    @forgcode
    entimm
        3
    entimm  
       2016-12-20 00:27:41 +08:00 via Android
    git checkout origin/master --file1 file2 file3
    SoloCompany
        4
    SoloCompany  
       2016-12-20 01:46:47 +08:00   ❤️ 1
    显然你的信息存在误导的地方
    假如你的信息是正确的,版本的衍生过程是
    家里: A0 - A1 (edit file.txt)
    公司: A0 - A2 (edit file.txt)
    repo: A0 - A2 (edit file.txt)

    如果是正确的话, git reset --hard HEAD^ 就回到了 A0 这个点, pull 不会有任何冲突
    肯定是你做了不止一个提交才会有这种情况

    如果你确定本地所有变更都是无用的,可以直接放弃所有
    git fetch origin
    git backup # 为防止你做错事情,先备份一下
    git checkout master # 回到 master
    git reset --hard origin/master
    SoloCompany
        5
    SoloCompany  
       2016-12-20 01:47:17 +08:00
    居然手快打错了
    git backup -> git branch backup
    ioiioi
        6
    ioiioi  
    OP
       2016-12-21 10:30:11 +08:00
    @SoloCompany
    我昨天直接修改了那 3 个文件,然后 git commit , git pull 就解决了前面的问题。我现在还有另外一个问题:
    家里: A0 - A1 (edit file1.txt)
    公司: A0 - A2 (edit file2.txt)
    repo: A2
    假设公司衍生了 A2 ,并 push 到 repo ,但是这个时候,家里并不知道,仍然在 A0 的基础上衍生出 A1 ,并且做了 git add , git commit ,只是 git push origin master 出现错误,这个时候该怎么解决冲突?
    SoloCompany
        7
    SoloCompany  
       2016-12-21 10:34:00 +08:00
    @ioiioi 如果你不希望出现菱形合并,那么
    git reset A0
    git stash
    git pull
    git stash pop
    然后提交你的变更就好了

    第一个 reset 命令不会丢失任何本地变更,也不会丢失 A1 的变更
    相反 A1 变更都回到了本地
    为避免 pull 发生冲突, stash 一下是比较安全的做法
    ioiioi
        8
    ioiioi  
    OP
       2016-12-21 17:11:47 +08:00
    @SoloCompany 谢谢!
    我再学习学习 git
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:24 · PVG 06:24 · LAX 14:24 · JFK 17:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.