ioiioi
V2EX  ›  问与答

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

  •  
  •   ioiioi · Dec 19, 2016 · 6174 views
    This topic created in 3614 days ago, the information mentioned may be changed or developed.
    是这样的,我在 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 replies  •  2016-12-21 17:11:47 +08:00
    forgcode
    forgcode
    Dec 19, 2016
    1
    checkout 一下放弃修改!
    ioiioi
    ioiioi
    OP
    Dec 20, 2016
    2
    嗯,我用 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
    entimm
    Dec 20, 2016 via Android
    3
    git checkout origin/master --file1 file2 file3
    SoloCompany
    SoloCompany
    Dec 20, 2016❤️1
    4
    显然你的信息存在误导的地方
    假如你的信息是正确的,版本的衍生过程是
    家里: 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
    SoloCompany
    Dec 20, 2016
    5
    居然手快打错了
    git backup -> git branch backup
    ioiioi
    ioiioi
    OP
    Dec 21, 2016
    6
    @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
    SoloCompany
    Dec 21, 2016
    7
    @ioiioi 如果你不希望出现菱形合并,那么
    git reset A0
    git stash
    git pull
    git stash pop
    然后提交你的变更就好了

    第一个 reset 命令不会丢失任何本地变更,也不会丢失 A1 的变更
    相反 A1 变更都回到了本地
    为避免 pull 发生冲突, stash 一下是比较安全的做法
    ioiioi
    ioiioi
    OP
    Dec 21, 2016
    8
    @SoloCompany 谢谢!
    我再学习学习 git
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2203 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 14:32 · PVG 22:32 · LAX 06:32 · JFK 09:32
    ♥ Do have faith in what you're doing.