zoukankan      html  css  js  c++  java
  • Git<一> 手工编辑冲突

    一:背景

    Neo君之前在写东西时,都是自己负责各自的模块,没有出现代码拉下来冲突的情况。最近Neo君在搞一搞前端的东东,跟同事功能有些冲突,所以就难免会冲突。

    所以简单总结下,这次针对的情况是不同的用户修改了同一文件的同一区域,合并时会遇到冲突而导致合并中断。

    Neo君之前常用的git命令(git rebase没怎么用过,以后有时间研究下):

    • git pull
    • git push

    Neo君的环境:

    • Mac OS
    • zsh(terminal): 之前直接在IDEA里操作的,发现还是喜欢直接敲命令行;Windows的童鞋,使用“小乌龟”可能会更方便。

    解决冲突的操作了解后,依据具体的Git环境,具体的步骤会有些差异。

    二:过程

    执行git pull命令,提示出错(原谅没有截图):

    remote:Counting objects: 12,done.
    ...
    Auto-merging com/xx/xx/Test.js
    CONFLICT(content): Merge conflict in com/xx/xx/Test.js
    Automatic merge failed;fix conficts and then commit the result.

     使用git status 可看到该文件处于未合并状态(仅供参考):

    ...
    #Unmerged path:
    #     (Use "git add/rm <file>..." as appropriate to mark resolution)
    ...

    Git通过.git目录下的几个文件记录合并过程和冲突:

    • .git/MERGE_HEAD 记录所合并的提交ID
    • .git/MERGE_MSG 记录合并失败信息
    • .git/MERGE_MODE 标识合并状态

     冲突后版本暂存库会记录冲突文件的不同版本,git ls-files -s 查看:

    100644 ea51xxxxxxxxxxxc2 1         com/xx/xx/Test.js  #编号1:冲突双方共同的祖先版本
    100644 ea51xxxxxxxxxxxc2 2         com/xx/xx/Test.js  #编号2:冲突文件在当前分支中修改的副本
    100644 ea51xxxxxxxxxxxc2 3         com/xx/xx/Test.js  #编号3:冲突文件在合并版本中修改的副本
    100644 2ieotxxxxxxxxxxxbd 0         com/xx/xx/Test2.js #编号0:表示该文件没有冲突
    ...

    对于暂存区中冲突文件的三个副本,了解下即可。

    工作区中的版本则包含了成功的合并和冲突的合并,这个是咱们要解决的,如:

    ....
    <<<<<<< HEAD #当前更改
        const { total, pageSize, pageNum, list } = dataSourceList.result
        const dataSource = dataSourceList.result && dataSourceList.result.list
    =======
        const { total, pageSize, pageNum, list } = dataSourceList.result.payload || {}
        const dataSource = dataSourceList.result && dataSourceList.result.payload && dataSourceList.result.payload.list
    >>>>>>> 6c4a4c8d79a5d9a3829bc4d729d59fb250686382 #传入的更改
    .....

    然后将冲突的地方修改,如保存当前更改(根据实际操作):

    ....
        const { total, pageSize, pageNum, list } = dataSourceList.result
        const dataSource = dataSourceList.result && dataSourceList.result.list
    .....

    然后添加到暂存区,并提交

    $ git add -u
    $ git commit -m "Merge completed:xxx"

    ps: git add -u 是(git add --update的缩写)会将文件的修改添加,有兴趣的可以百度下和git add . 以及git add -A的区别。

    提交完可以看到,之前说过的./git下与合并相关的文件.git/MERGE_HEAD、.git/MERGE_MSG、.git/MERGE_MODE消失。

    查看暂存区:git ls-files -s,会发现三个副本也被清除了(实际上 git add执行后就没了):

    100644 ea51xxxxxxxxxxxc2 0         com/xx/xx/Test.js  #编号0:表示该文件没有冲突
    100644 2ieotxxxxxxxxxxxbd 0         com/xx/xx/Test2.js #编号0:表示该文件没有冲突
    ...

    三:总结

    1.  git pull 冲突后可以使用git ls-files -s查看暂存区的三个冲突文件。(如果文件特别多可以再后面加“|grep xxx”)。
    2. 手动修改工作区中冲突文件的冲突内容。
    3. git addgit commit
    4. 冲突解决,使用git push提交代码。(可以git pull下,这次没有冲突的提示了)
    5. 可以使用git ls-files -s查看暂存区的三个冲突文件消失
  • 相关阅读:
    与生命晒跑
    关于你有一条未读短信的静态单页
    【微收藏】来自Twitter的自动文字补齐jQuery插件
    chrome 插件个人使用推介
    vscode中检测代码中的空白行并去除的方法
    FTP文件乱码导致的无法删除
    git操作遇到的几个问题
    一个srand、rand结果相同的问题
    【verilog】单周期MIPS CPU设计
    【verilog】多周期MIPS CPU设计
  • 原文地址:https://www.cnblogs.com/LordNeo/p/9021465.html
Copyright © 2011-2022 走看看