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