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

git 使用错误的问题

  •  
  •   yatesun · 2017-06-29 14:21:06 +08:00 · 2380 次点击
    这是一个创建于 2703 天前的主题,其中的信息可能已经有所发展或是发生改变。

    可能是我 git 用法或者使用错误问题,请大家指教。

    第一次遇到这种情况,谢谢大家。

    git 提交记录是这样的,隐去了一些关键信息

    commit 4c440672c42395128054d5dbcfaabeabe132339d
    Author: user1
    Date:   Thu Jun 22 17:54:16 2017 +0800
    
        版本 2
    
    commit d55b649a37343fb65207cf8343ef5c21e6de32de
    Merge: 67f3d92 abee8a4
    Author: myself
    Date:   Wed Jun 21 12:01:32 2017 +0800
    
        Merge branch 'master' of http://192.168.1.2/git
    
    commit 67f3d9281992e865a35efdf02c1aff8d7e85a1b2
    Author: myself
    Date:   Wed Jun 21 12:01:26 2017 +0800
    
        版本 1
    

    通过

    git show 4c440672c42395128054d5dbcfaabeabe132339d --stat
    

    看到修改了

    /admin/a.html
    /admin/b.html
    2 files changed, 1966 insertions(+), 1 deletion(-)
    

    通过

    git diff d55b649a37343fb65207cf8343ef5c21e6de32de 4c440672c42395128054d5dbcfaabeabe132339d --stat
    

    看到修改了

    /admin/a.html
    /admin/b.html
    /admin/c.html
    3 files changed, 2026 insertions(+), 140 deletions(-)
    

    两次不一致,而且 67f3d928 版本新增的内容,在 git 提交日志是能看到的,但从 d55b649 到 4c44067 的过程中,这个内容丢失了,而且 git show 没有看到修改记录。

    21 条回复    2017-06-29 18:43:27 +08:00
    yatesun
        1
    yatesun  
    OP
       2017-06-29 14:23:18 +08:00
    就是我提交的内容,被同事覆盖了,但是却没有在 git 提交历史中看到他的修改,或者有可能他也不知道他覆盖了我修改的部分。
    GGGG430
        2
    GGGG430  
       2017-06-29 14:29:58 +08:00
    Merge: 67f3d92 abee8a4 这部分 log 在 master 上, 你当前应该不在 master
    yatesun
        3
    yatesun  
    OP
       2017-06-29 14:33:19 +08:00
    @GGGG430 我执行了 git branch,确实是 master 分支,而且这个 git 比较特殊,本身就没有任何其他分支。
    yatesun
        4
    yatesun  
    OP
       2017-06-29 14:34:35 +08:00
    @GGGG430

    git branch -a

    * master
    remotes/origin/HEAD -> origin/master
    remotes/origin/master
    GGGG430
        5
    GGGG430  
       2017-06-29 14:39:14 +08:00
    如果时在 master 分支的话, merge 应该是你在 commit 之前没有 pull, 然后 push 提示需要 pull 产生的;
    GGGG430
        6
    GGGG430  
       2017-06-29 14:40:37 +08:00
    git log --all --graph --pretty=format:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative 把这个的提交记录拿出来看看
    yatesun
        7
    yatesun  
    OP
       2017-06-29 14:41:36 +08:00
    @GGGG430
    对的
    我一般是修改完代码之后
    git pull
    git commit -am "编辑内容"
    git push

    但有时候 git pull 的时候,提示有冲突,要先 commit,于是就是
    git pull
    git commit -am "编辑内容"
    git pull
    git push
    GGGG430
        8
    GGGG430  
       2017-06-29 14:44:12 +08:00
    @yatesun 我有过一段时间, 如果 commit 之前 pull 也有冲突, 我会先把冲突的本地文件 checkout/stash, 然后 pull, 尽量避免产生 merge, 这样查 log 时就比较好看, 就看你有没有洁癖了哈哈
    yatesun
        9
    yatesun  
    OP
       2017-06-29 14:45:52 +08:00
    @GGGG430
    * 3b9e834 - 减少并发几率。 (6 days ago) <user1>
    * b938bf7 - 测试 (7 days ago) <user1>
    |\
    | * d55b649 - Merge branch 'master' of http://192.168.1.2/git (8 days ago) <yatesun>
    | |\
    | | * abee8a4 - (tag: v1.0.0.108) 修改 (2 weeks ago) <qiang>
    | | * ca97d96 - (tag: v1.0.0.107) 调整网络 (2 weeks ago) <qiang>
    | | * f97817c - 发版系统程序包名 (2 weeks ago) <qiang>
    | * | 67f3d92 - 版本 1 (8 days ago) <yatesun>
    * | | 4c44067 - 版本 2 (7 days ago) <user1>
    | |/
    |/|
    * | 59dd567 - (tag: v1.0.0.106) RPC (2 weeks ago) <qiang>
    yatesun
        10
    yatesun  
    OP
       2017-06-29 14:46:31 +08:00
    @GGGG430 是个好方法,我也是有洁癖的。
    yatesun
        11
    yatesun  
    OP
       2017-06-29 14:46:49 +08:00
    @GGGG430 现在就是想找找原因,不重蹈覆辙
    GGGG430
        12
    GGGG430  
       2017-06-29 14:48:15 +08:00
    | | * abee8a4 - (tag: v1.0.0.108) 修改 (2 weeks ago) <qiang>
    | | * ca97d96 - (tag: v1.0.0.107) 调整网络 (2 weeks ago) <qiang>
    | | * f97817c - 发版系统程序包名 (2 weeks ago) <qiang>
    | * | 67f3d92 - 版本 1 (8 days ago) <yatesun>
    GGGG430
        13
    GGGG430  
       2017-06-29 14:48:45 +08:00
    Merge: 67f3d92 abee8a4
    你看在这之前的 log 都有的
    yatesun
        14
    yatesun  
    OP
       2017-06-29 14:51:36 +08:00
    @GGGG430 那是什么问题
    GGGG430
        15
    GGGG430  
       2017-06-29 14:52:58 +08:00
    详细点说就是:
    | * | 67f3d92 - 版本 1 (8 days ago) <yatesun>
    这个人在 commit + push 时本地处于这个点, 然后将
    | | * abee8a4 - (tag: v1.0.0.108) 修改 (2 weeks ago) <qiang>
    | | * ca97d96 - (tag: v1.0.0.107) 调整网络 (2 weeks ago) <qiang>
    | | * f97817c - 发版系统程序包名 (2 weeks ago) <qiang>
    这些 pull merge, 然后再提交成功的
    yatesun
        16
    yatesun  
    OP
       2017-06-29 14:57:14 +08:00
    @GGGG430 对呀,然后呢。
    我 git reset --hard d55b649 还是能看到文件修改的
    但是到了 b938bf7 这个版本就没有了
    bombless
        17
    bombless  
       2017-06-29 16:58:08 +08:00
    没看懂,b938bf7 和 d55b649 是什么关系
    yatesun
        18
    yatesun  
    OP
       2017-06-29 18:22:06 +08:00 via Android
    @bombless 时间上是先后顺序。
    yatesun
        19
    yatesun  
    OP
       2017-06-29 18:28:59 +08:00 via Android
    @yatesun 准确的说,4c44067 在 67f3d92 之后
    networm
        20
    networm  
       2017-06-29 18:31:07 +08:00 via iPhone   ❤️ 1
    错误的合并 * b938bf7 - 测试 (7 days ago) <user1> 导致的问题
    注意,这是一个合并提交,虽然提交信息没写 Merge。
    下面是错误发生过程:

    user1 提交 4c44067
    user1 pull 发现有别人的提交并产生了冲突
    user1 想要回到 pull 之前的状态,错误地使用了 reset 或 checkout 命令,此处不一定是 reset --hard head^,也可以单个文件 reset 或者使用 checkout 重置文件状态。
    user1 处理完成后提交 b938bf7

    关键问题:
    user1 错误地处理合并冲突,如果想要撤销合并,需要使用 merge --abort 才可以,否则 merge 信息会保留,下次提交是直接算合并提交。
    解决方案:
    1 如果错误的提交并未在主分支,暂时还没有其他人拉去此分支,那么可以直接将当前分支 reset --hard 到 d55b649,然后 cherry-pick 4c44067 3b9e834,再使用 push--force 强制推送当前分支,user1 fetch 后 reset --hard origin/yatesun 分支,假定当前分支是 yatesun。
    2 如果错误提交已在主分支,即其他人已 pull,为了减少他人
    麻烦,可以 log 4c44067..d55b649,然后将列出的所有提交手动 cherry-pick 到当前分支,push 即可。

    避免方法:
    1 了解 pull = fetch + merge
    2 了解特定操作撤销只能使用对应命令到 --abort,如:merge rebase cherry-pick 等。
    3 改善分支工作流,消除 pull 导致的无用 merge 提交,可以考虑使用服务器端钩子检查。
    yatesun
        21
    yatesun  
    OP
       2017-06-29 18:43:27 +08:00 via Android
    @networm 了解,非常感谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2815 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:58 · PVG 21:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.