Git 远程管理与解冲突实战解析

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

本文通过通过实战的方式与大家一起体会一遍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,之后在备注信息中输入以下内容:

image.png

image.png

或者直接执行

git commit -am"在项目1中创建内容并且push到远程仓库"
复制代码

之后执行push操作将修改推送到远端

git push
复制代码

推送成功后,在Goland右下角的Git中,我们能发现本地和远程的master分钟都多了如下图所示的节点“在项目1中创建内容并且push到远程仓库”:

image.png

之后切换到项目B,同样新建一个文件conflict_master,并且在文件中输入以下内容:

在项目2中创建内容制造冲突
复制代码

之后根据Goland提示点确定将新建文件add进缓存区,或者执行

git add .
复制代码

此时,如果我们想git pull拉取master分支最新更新的话,会报以下错误:

image.png

这时,我们需要先commit或者stash当前变化,stash的情况我们放在后面单独讲解,现在先使用commit操作。

用Goland图形化操作或者直接执行

git commit -am"在项目2中创建master的冲突内容"
复制代码

在这种情况下,本地master与远程master冲突了,需要注意的是,此时没办法使用git merge或者git pull解冲突,因为我们这两次的提交并没有相关性,会报错,大家可以尝试一下。

这里,我么需要在项目B使用git rebase远程的origin/master,这里我们更建议使用Goland图形化界面操作:

image.png

image.png

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

image.png

image.png

3. 在dev分支模拟解冲突

我们在项目B中origin/master的分支上开一个新分支dev:

image.png

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

image.png

在项目1中git fetch并且git checkout到dev上

之后在conflict_dev文件中输入以下内容:

在项目1中创建dev的冲突并且push
复制代码

之后commit并且push:

image.png

之后在项目2的conflict_dev文件中输入以下内容:

项目2中冲突的发生
复制代码

按照之前的步骤commit。

commit完成后,仅能进行pull操作了,会发现产生了冲突,可以手动解决:

image.png

image.png

我们选择留下远端的代码,之后我们就能正常的将代码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分支:

image.png

之后进行冲突解决:

image.png

之后就可以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回到需要退回的节点。

image.png

猜你喜欢

转载自juejin.im/post/7109505515159289892