Git解决代码冲突
本文介绍了使用Git进行团队协作开发时的冲突处理流程。首先演示了如何初始化Git仓库、创建裸库并开启Git服务供局域网共享。随后重点讲解了两种常见冲突场景:空文件冲突和内容冲突。在空文件冲突中,Git会自动合并不同版本;而在内容冲突时,需要手动修改冲突标记并提交合并结果。文章详细展示了冲突解决的具体操作步骤,包括拉取更新、识别冲突标记、手动修改文件以及最终提交合并结果的过程。最后验证了冲突解决后代
背景
现在有一个VS项目,我想将其共享给同事,让大家一起开发。这算是Git的基础任务了,操作过程并不复杂,首先初始化git服务,并提交当前的项目文件,然后克隆一个裸库,并设为远程仓库,用于周转,最后打开git服务,让局域网内的其他计算机也可以克隆。
# S1 初始化Git服务
cd proj
git init
git add .
git commit -m "Initial commit"
cd ..
# S2 克隆裸库,并设为远程仓库
git clone --bare proj proj.git
cd proj
git remote add origin ..\proj.git
git push -u origin master
cd ..
# S3 打开git服务
git daemon --export-all --enable=receive-pack --base-path=.
然后,局域网中的其他电脑,就可以愉快地克隆了。且同事在克隆之后,做了一些修改,然后push了一下
git clone git://Main/proj.git
cd proj
mkdir py
# 新建一个test.py空文件
git add .
git commit -m "add pythoon folder"
git push origin master
空文件冲突
同事在克隆代码后,对项目做了一些修改,然后push了一下;然而,我自身也在干活,proj也发生了变化。如果我和同事修改的内容不一样,那么问题不大,可以直接pull。
git pull origin master
然而,如果我和同事之间存在冲突,那么直接拉取就会进入合并提交界面
git reset --hard HEAD~1
# 人为制造一些冲突,创建py/test.py,并添加一行内容
git add .
git commit -m "local python"
git pull origin master
如果在安装Git时,勾选了使用VIM,那么此时进入的就是VIM编辑器,如果使用默认信息,那么只需按下冒号(Shift+;),输入wq即可,然后Git会自行合并冲突,具体涉及到的版本可通过log查看
>git log --oneline -n 3
4e566ee (HEAD -> master) Merge branch 'master' of ..\proj
882ddc7 local python
5c9810c (origin/master) add python folder
在5c9810c中,我创建了一个空文件,而882ddc7中,则添加了一行内容,git在比对之后,自动保留了local python的版本,即4e566ee的实际内容,与882ddc7相同。
push冲突
首先,本地将刚刚的合并结果push给proj.git
git push origin master
然后,在远程的test.py文件中也添加一行,并提交,于是不出意外地报错了。
git commit -a -m "add plt"
git push origin master # 此行会报错
这是因为,和远程主机上一次push的内容相比,proj.git中的内容已经发生了变化,必须把这些变化取回本地,才可以继续继续上传。git允许的push流程如下图所示。C0不必考虑,C1是从C0的基础上开发而来;C3是从C1的基础上开发而来;C5是从C3的基础上开发而来,以此类推。而如果在C4这一步直接push,origin的时间线上,C3和C4之间,将失去这种直接指向的关系。
A主机 C0->C2->C3
↓ ↗ ↓
origin C0 C1 C3 C5
↓ ↑ ↘↑
B主机 C0->C1->C4->C5
为了不报错,必须先获取origin中的内容,对此可以直接pull,并解决一下冲突。当然,这一过程也可以拆解为先下载,然后自行合并合并
git fetch origin
git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
git merge origin/master
由于test.py的内容存在差异,所以merge失败了,但test.py已经发生了更改,内容如下
<<<<<<< HEAD
import matplotlib.pyplot as plt
=======
import numpy as np
>>>>>>> origin/master
其中,<<<<<<< HEAD 到 ======= 是本地内容;======= 到 >>>>>>> origin/master 是远程的内容。接下来手动修改test.py,二者都保留
import matplotlib.pyplot as plt
import numpy as np
然后commit,就可以继续提交了
git comit -a -m "merge plt & np"
git push origin master
收尾
至此,我们已经演示了git解决冲突的整个流程,最后,本地拉取最新的结果。由于在上传【add plt】版本之后,本地再未更新程序,因此拉取最新的【merge plt & np】之后,直接非常丝滑地更新到了最新版。
git pull origin master
更多推荐
所有评论(0)