目录

Git 多人协作冲突解决

基本冲突解决

前言

在我们在用 Git 进行多人开发的时候,会遇到没及时拉取最新仓库代码就直接上手写的情况(或者说你正在写,人家就推送了),这种时候我们写好后 push 就会发现无法推送,查看信息可以得知是远端仓库已经有更新了,本地不是最新版,这就产生冲突了。

流程

先放一张整体流程图: https://cdn.zggsong.cn/2021/10/30/44bb08b08c969.png

一般的流程都是:

1
2
3
git add .
git commit -m "your msg"
git push origin master

随后发现报错: https://cdn.zggsong.cn/2021/10/30/81ad39f423e96.png 当我们在提交之后就可以使用下面这个命令

1
git reset HEAD^

将本地仓库退回至上一个版本,同时将上一次提交的内容退回至工作区
此时还不可以拉取最新版,需要先将自己修改过的内容先存到堆栈区
然后再从远端仓库拉去最新的版本,最后在取出堆栈区的文件和拉取的文件对比

1
2
3
git stash [save "your msg"]
git pull
git stash pop

https://cdn.zggsong.cn/2021/10/30/acfda5a2285e4.png https://cdn.zggsong.cn/2021/10/30/7e7398d378138.png https://cdn.zggsong.cn/2021/10/30/71ca2915d42bc.png https://cdn.zggsong.cn/2021/10/30/f68f6ab650812.png

其中:冲突标记<<<<<<<=======之间的内容是别人修改的,=======>>>>>>>之间的内容是自己修改的

最简单的编辑冲突的办法,就是直接编辑冲突了的文件,把冲突标记删掉,把冲突解决即可

拓展

在解决这个问题时涉及一些命令:

  • git diff: 比较工作区和暂存区(如无则为 HEAD)内容
  • git reset HEAD: 清理暂存区,恢复至工作区
  • git reset --hard HEAD: 清理暂存区和工作区(修改内容丢失
  • git log: 查看版本号
  • git reset [版本号]: 恢复至指定版本
  • git checkout <filenem>: 若暂存区为空,则直接回复上一个版本(HEAD)的指定文件至工作区

分支合并冲突

前言

更加严谨的来说,再修改时要创建一个新的分支进行修改,修改完成再拉取远端仓库最新版本,再进行合并,有冲突解决冲突,再push,最后在删除开发分支这样一个流程。所以现在就来简单记录分享一下如何解决合并分支冲突。

案例

总结

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建分支 (develop)
git checkout -b dev

# 新分支和本地最新的master分支内容相同,再次进行修改
vim [xxxx.md]

# 在dev分支上add && commit
git add .
git commit -m "commit on dev"

# 切换回master分支并拉去最新代码
git checkout master
git pull origin master

# 合并dev分支至master
 git merge dev

 # 若无冲突直接push
 git push origin master

 # 若有冲突直接打开冲突文件解决冲突再次提交推送即可
 vim [xxxx.md]
 git add .
 git commit -m "resolve conflict"
 git push origin master

# 删除dev分支
git branch -d dev

举例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master)
$ git checkout -b dev
Switched to a new branch 'dev'

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (dev)
$ vim index.html

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (dev)
$ git add .

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (dev)
$ git commit -m "zggsongadd3ondev"

[dev 5c28c74] zggsongadd3ondev
 1 file changed, 1 insertion(+)

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (dev)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master)
$ git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), 293 bytes | 16.00 KiB/s, done.
From ssh://git.zggsong.cn/ksat/Test
   cbf451e..294d107  master     -> origin/master
Updating cbf451e..294d107
Fast-forward
 index.html | 1 +
 1 file changed, 1 insertion(+)

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master)
$ git merge dev
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master|MERGING)
$ vim index.html

####### Conflict Content ######
<<<<<<<HEAD
  // add by ksat3
=======
  // add by zggsong3
>>>>>>> dev
####### Conflict Content ######

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master|MERGING)
$ git add .

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master|MERGING)
$ git commit -m "resolve conflict on zggsong"
[master 03a1211] resolve conflict on zggsong

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master)
$ git push origin master
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 632 bytes | 632.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To ssh://git.zggsong.cn/ksat/Test.git
   294d107..03a1211  master -> master

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master)
$ git branch -d dev
Deleted branch dev (was 5c28c74).

song@DESKTOP-JDGUG5G MINGW64 /d/gitR/Test (master)
$