专栏首页进击的Coder手把手教学,如何解决 Git 冲突?

手把手教学,如何解决 Git 冲突?

阅读本文大概需要 3 分钟。

Git 是现在使用最广泛的源代码管理程序。一个合格的程序员必须要熟练掌握 Git。在使用 Git 的时候,最让人头疼的问题是什么?肯定是解冲突了。如果两个人修改了同一个文件的相同位置,那么当一个人提交代码并合并到主分支以后,第二个人尝试合并时就会触发冲突。大多数情况下,Git 自己知道如何把两份代码合并起来。但有时候当 Git 不知道应该怎么合并,就会提示你需要手动解决冲突。

我以前学习 Git 的时候,由于没有人跟我一起提交代码,所以我为了模拟两人提交的情况,会把代码 clone 到两个文件夹里面,然后把相同的位置分别做不同的修改,再分别提交。过程非常繁琐。

最近因为评上了微软 MVP 的关系,会主动关注一下微软的在线课程,结果发现微软悄无声息地出了一整套的 Github 课程。而这其中,有一套交互式的课程手把手指导如何解决 Git 的冲突:在 GitHub 上使用合并冲突解决来解决竞争提交[1],由于 Github 是基于 Git 的,所以只要稍作设置,这个课程就能变成通用的 Git 操作指导教程。

一开始我以为这个课程只有 MVP 能看,后来发现,课程不仅完全免费,而且不需要注册,所有人都能随时学习。只要你有一个 Github 账号就能参加。大家点击公众号下方的阅读原文就可以打开这个课程页面。

打开课程以后,页面如下图所示:

点击其中的“开始”按钮,就可以开始学习。课程一共有5个单元,如下图所示。

其中,第1,2单元是知识性介绍,大家可以看一下。今天我们重点说一下第3单元《练习-管理合并冲突》。这一单元,会基于 Github Lab(Github 学习实验室)来一步一步手把手指导。我们点击在 Github 上启动学习实验室按钮。

此时,浏览器会新开一个选项卡,如下图所示。点击Start free course,如下图所示。

此时,会让你登录 Github,并授权 Github Lab 创建一个练习源,如下图所示:

大家可以创建公共源,也可以创建私有源。如果是创建私有源的话,之后每次从远程推拉代码时,会让你输入 Github 账号密码。需要注意的是Additional Options这一项一定要选择Use the command line,这样我们才能学习通用的 Git 操作。另外两项都是 Github 专用的操作。对我们帮助不大。

授权完成以后,你的 Github 上会自动创建一个源,并且有很多的冲突,如下图所示:

回到刚才的课程页面,可以看到下面出现了几个课程阶段,如下图所示。

我们点击第一课的Start按钮,开始第一课。浏览器弹出了新的页面(实际上就是 Github 的 PR 页面),在这里,我们可以根据它的提示和说明进行操作。如下图所示:

大家不要担心全是英文看不懂,真正需要你进行的操作,都是灰色背景的代码片段,这些代码是很容易看懂的。

根据提示,首先 clone 代码:

git clone https://github.com/kingname/merge-conflicts.git
cd merge-conflicts

接下来,切换到update-config分支,然后拉取远程最新代码。

git checkout update-config
git pull

然后,我们把远程的master分支代码合并到update-config分支中:

git merge origin/master

发现了冲突,如下图所示:

它已经提示了_config.yml文件有冲突。所以我们可以直接打开_config.yml文件。你可以使用自己喜欢的编辑器打开。我这里使用 Vim。打开以后的代码如下图所示:

注意,这里的实际代码可能跟教程不一样。教程里面说冲突内容是被<<<<<<< update-config>>>>>>> master包起来的,但实际上代码里面的冲突内容是被<<<<<<< HEAD>>>>>>> origin/master包起来的。

大家可以看到,在<<<<<<< HEAD=======中间的内容,与=======>>>>>>> origin/master中间的内容,他们的字段名是一样的,但是值不一样,所以 Git 不知道应该以哪个为准,需要我们人工决断。

假设我想以上面这一段为准(在实际开发过程中,可能上下要各取一部分合并),如下图所示:

保存修改,根据它的提示,执行以下代码进行提交:

git add .
git commit -m "merge master into update-config"
git push

提交成功以后,网页上会立刻给出反馈:

我们继续往下看,根据它的提示,首先切换回master分支,然后拉取最新代码,然后把update-config分支的内容合并进入master:

git checkout master
git pull
git merge update-config

合并成功,如下图所示。

最后把本地已经合并的代码使用git push推到远程即可。

第二个问题更复杂一些,这次有两个冲突文件,如下图所示:

并且冲突的内容有好几个,如下图所示:

但解决方法还是一样的,人来决定要保留哪些内容,把不要的地方删掉:

保存修改,然后检查第二个文件。第二个文件也解决以后,根据页面上的提示输入代码,合并提交就可以了。

前两个问题,是别人创建了冲突,需要我们来改。第三个问题,是我们自己导致了冲突,我们自己来解决。方法跟之前是一样的,就不多说了。

最后这一步,让你完善这个源里面的内容。因为这个模拟冲突的源本质上是一个在线简历页面,你可以把里面的内容改成你自己的。当然,这是选做题,可做可不做。

所有任务都做完了,是不是很有成就感:

最后还能解锁成就:

总结

根据上面的学习过程,我总结了一个解决冲突的常规流程:

  1. 前提条件:不能在 master 分支上修改任何文件。master 分支的变更只能通过 git pull 和 git merge 获得。在 master 分支下面,不能手动修改任何文件。
  2. 我们自己有一个分支用来修改代码,例如我的分支叫做dev分支。我把代码修改完成了,现在不知道有没有冲突。
  3. 在 dev 分支里面,执行命令git merge origin/master,把远程的master分支合并到当前dev分支中。如果没有任何报错,那么直接转到第5步。
  4. 如果有冲突,根据提示,把冲突解决,保存文件。然后执行命令git add xxx把你修改的文件添加到缓存区。然后执行命令git commit -m "xxx"添加 commit 信息。
  5. 执行如下命令,切换到 master 分支:git checkout master
  6. 执行命令git pull确保当前 master 分支是最新代码。
  7. dev分支的代码合并回 master 分支:git merge dev
  8. 提交代码:git push

只要所有开发者都遵守这个规则,那么解决冲突是一件非常容易的事情。

参考资料

[1]

在 GitHub 上使用合并冲突解决来解决竞争提交: https://docs.microsoft.com/zh-cn/learn/modules/resolve-merge-conflicts-github/?WT.mc_id=DT-MVP-5003916

本文分享自微信公众号 - 进击的Coder(FightingCoder)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!

    你是否也曾有过「跟着代码跳了很久之后,才发现那一大坨代码其实没有任何作用」的惨痛经历?

    崔庆才
  • 记不住命令行?用这个开源项目一次性解决问题!

    命令行是非常高效的工具,但一个很常见的现象是,很多命令行过一段时间就容易忘。举个栗子,如果我们常用 git 命令行管理代码、利用 conda 命令管理开发环境,...

    崔庆才
  • 牛逼!GitHub 耗时整整一年开发的代码扫描工具终于上线了!

    就在 9 月的最后一天开始,你在 GitHub 上传的代码可以免费使用 Bug 筛查功能了。官方的目的是免费 帮开发者 Review 查找 Bug,程序员不用再...

    崔庆才
  • MySQL高可用之MHA(二)

    2、MHA引入keepalived(MySQL服务进程挂掉时通过MHA 停止keepalived) 要想把keepalived服务引入 MHA,我们只需要修改切...

    小手冰凉
  • JavaEE中遗漏的10个最重要的安全控制

    JavaEE中遗漏的10个最重要的安全控制 JavaEE有一些超赞的内置安全机制,但它们远远不能覆盖应用程序要面临的所有威胁。很多常见攻击,例如跨站点脚本攻击...

    用户1289394
  • SAP CRM产品搜索支持的标准搜索条件的渲染逻辑

    You can see in Product search WebClient UI that a lot of search parameters are s...

    Jerry Wang
  • 【开发指南】(三)认识ionic3

    如果你要做一个app应用,你有最少三种方式:原生开发、加壳在线WebApp开发与混合式开发。

    IT晴天
  • Python 爬取 B 站,宋智孝李光洙哪个更受宠?

    在中国,大家应该都了解《跑男》这个节目吧,跑男这个节目就是引用了韩国的《Running Man》,成员组成包括原六位成员刘在石、池石镇、金钟国、HAHA(河东勋...

    一墨编程学习
  • Visual Studio 调试系列9 调试器提示和技巧

    如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看。 即使在重新启动后,固定的变量也能保持不动。 要固定数据提示,请在鼠标...

    张传宁老师
  • 高性能前端架构解决方案

    无论你的页面是否需要成为客户端应用程序,还是如何优化应用程序的渲染时间,我都不会说太多后端如何传递资源。

    ConardLi

扫码关注云+社区

领取腾讯云代金券