1. 程式人生 > >Git<一> 手工編輯沖突

Git<一> 手工編輯沖突

成功 保存 don 有時 提示 沖突解決 source IE 導致

一:背景

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查看暫存區的三個沖突文件消失

Git<一> 手工編輯沖突