在这里插入图片描述

背景

现在有一个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
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐