git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
6yong
V2EX  ›  git

一个很神奇的事故,空白 commit,却回滚了前几个 commit 的代码。

  •  
  •   6yong · May 10, 2018 · 2936 views
    This topic created in 3012 days ago, the information mentioned may be changed or developed.
    看提交记录,在我 commitB 提交记录之后,同事提交了一个 commitA.

    但是该 commitA 用看不到文件修改记录。(照理来说没有修改文件 无法 commit )。

    checkout commitA 的时候,我提交的 commit 里的代码都回滚了。

    请问什么情况会发生这种现象?
    9 replies    2018-05-10 16:18:33 +08:00
    jybox
        1
    jybox  
       May 10, 2018
    > 在我 commitB 提交记录之后,同事提交了一个 commitA

    你要看这个「之后」是时间上的先后还是存在父子关系

    >照理来说没有修改文件 无法 commit

    git commit --allow-empty
    jasonyang9
        2
    jasonyang9  
       May 10, 2018
    可能是假个 Git。

    ```
    git reset --hard commitB
    ```

    然后再试着玩玩 commit
    jasonyang9
        3
    jasonyang9  
       May 10, 2018
    怀疑是 force push,忘记 pull 先
    mcfog
        4
    mcfog  
       May 10, 2018
    commitA 是不是一个 merge commit ? 可能是同事 merge 的时候用 GUI 的类似” Resolve Conflict With My Code “的功能,相当于自动删掉你的代码,并且 merge commit 由于有 2 个 parent,可能 GUI 上看不到这样的删除,手动选你的 commit 做比较,或者命令行里和 parent2 比较就能看到删除
    6yong
        5
    6yong  
    OP
       May 10, 2018
    是的 同事用 SourceTree,我看到他这条 commit 也是有两 parent。应该就是你说的情况了。
    @mcfog
    mcfog
        6
    mcfog  
       May 10, 2018
    @6yong 如果是多人用同一条分支开发,建议团队统一用 fetch&rebase,命令行的话`git pull --rebase`,SourceTree 在 pull 的时候勾选 rebase instead of merge,乌龟直接就叫 fetch&rebase

    这样冲突合并以后由于提交的不是 merge commit,还是普通的 commit,比较容易发现这种问题,另外大大减少 commit 的数量和 git log 的复杂程度
    6yong
        7
    6yong  
    OP
       May 10, 2018
    6yong
        8
    6yong  
    OP
       May 10, 2018
    感谢楼上各位建议
    luoer
        9
    luoer  
       May 10, 2018
    我觉得 commitA 的 parent 是 commitB 导致的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2648 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:08 · PVG 19:08 · LAX 04:08 · JFK 07:08
    ♥ Do have faith in what you're doing.