Git 远程管理与解冲突实战解析
本文通过通过实战的方式与大家一起体会一遍git远程解冲突的过程,帮助大家更深入的体会git解冲突的过程,本文使用Goland作为开发工具
0. 总结写在前面
- 推荐使用Goland图形化界面解冲突,操作更方便
- 在merge或者pull解冲突之前,需要先commit或者stash自己的修改
1. 新建仓库,拉取项目
在gitlab或者马云平台创建一个空的远程仓库,并且在本地用git clone命令拉取两份(后面我们分别以项目A与项目B称呼),模拟并行开发的场景。
2. 模拟同时在master分支发生冲突
在项目A中新建一个文件conflict_master,并且在文件中输入以下内容:
在项目1中创建内容并且push到远程仓库
之后根据Goland提示点确定将新建文件add进缓存区,或者执行
git add .
之后可以点进Goland左侧边缘的Commit,之后在备注信息中输入以下内容:


或者直接执行
git commit -am"在项目1中创建内容并且push到远程仓库"
之后执行push操作将修改推送到远端
git push
推送成功后,在Goland右下角的Git中,我们能发现本地和远程的master分钟都多了如下图所示的节点“在项目1中创建内容并且push到远程仓库”:

之后切换到项目B,同样新建一个文件conflict_master,并且在文件中输入以下内容:
在项目2中创建内容制造冲突
之后根据Goland提示点确定将新建文件add进缓存区,或者执行
git add .
此时,如果我们想git pull拉取master分支最新更新的话,会报以下错误:

这时,我们需要先commit或者stash当前变化,stash的情况我们放在后面单独讲解,现在先使用commit操作。
用Goland图形化操作或者直接执行
git commit -am"在项目2中创建master的冲突内容"
在这种情况下,本地master与远程master冲突了,需要注意的是,此时没办法使用git merge或者git pull解冲突,因为我们这两次的提交并没有相关性,会报错,大家可以尝试一下。
这里,我么需要在项目B使用git rebase远程的origin/master,这里我们更建议使用Goland图形化界面操作:


我们选择留下远端的代码:


3. 在dev分支模拟解冲突
我们在项目B中origin/master的分支上开一个新分支dev:

在项目B中新建一个文件conflict_dev,之后commit并且推送到远端:

在项目1中git fetch并且git checkout到dev上
之后在conflict_dev文件中输入以下内容:
在项目1中创建dev的冲突并且push
之后commit并且push:

之后在项目2的conflict_dev文件中输入以下内容:
项目2中冲突的发生
按照之前的步骤commit。
commit完成后,仅能进行pull操作了,会发现产生了冲突,可以手动解决:


我们选择留下远端的代码,之后我们就能正常的将代码push到远程仓库了。
3. 模拟在dev2分支mergedev时发生冲突
在项目1中dev的基础上新建并切换到分支dev2上,
git checkout -b dev2
新建conflict_dev2文件中输入以下内容,并且commit:
在项目1中创建dev2冲突等待merge到远端的dev
在项目2的dev分支新建conflict_dev2文件中输入以下内容,并且推送到远端:
在项目2中创建dev2冲突push到远端
在项目1中git fetch,之后在dev2分支merge远端的dev分支:

之后进行冲突解决:

之后就可以push到远端了。
4. git stash 解析
git stash是将我们从上次commit到现在的修改存储在一个栈结构中,之后可以调用git stash pop 将存储的修改取出,如果在进行pull操作的时候发现代码有冲突,可以先存储一下,在 git stash pop 时进行修改。
5. 错误解冲突之后的回滚操作
如果我们解冲突时操作有误,需要进行回退操作,可以在Goland中直接点击下图的Reset Current Brabch to Here会推到解冲突前的commit节点,也可通过下图的Copy或者git log找到需要退回节点的哈希值,之后运行git reset --hard commit_id回到需要退回的节点。

转载自:https://juejin.cn/post/7109505515159289892