手把手教你用Git——详解git merge

13,083 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情

前言

背景

由于本社新人并不常用Git,再加上国内的网络并不算好,在这样一个背景下,为了简化Git的使用,我在这里简单记录了一个关于 Git的教程,希望对大家有所帮助。

关于本教程的编写环境

本文基于Windows10系统Mac系统的小伙伴可以尝试Homebrew。由于本人手里并没有搭载MacOS的电脑,因此Homebrew相关的使用请自行尝试。

对于使用 Windows11系统 的小伙伴,本文的教程是通用的,不过一些细节可能略有不同,这点希望小伙伴们注意一下

关于Git

Git 是一个开源的分布式版本控制系统,可以有效、快速的进行项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 ——来自 Git 简介 | 程序员大彬 (topjavaer.cn)

简单来说,Git 就是一个项目代码管理软件

关于本教程的评论

这个教程基于我的个人实践,很多东西基于我个人的理解,所以有望大家多多指教。如果你发现了这个教程的错误之处,欢迎你通过邮箱或者QQ联系我,我会及时的进行改进。如果教程中有表述不清楚的地方,也请指出,或提供建议。

关于本教程的转载

任何个人或组织可以转载我的这个教程系列,甚至可以对其进行一些修改。但前提是要保证实时更新,并且保留本教程的版权信息,谢谢支持,我也会不定时的更新这个系列的教程。

正文

Git安装与使用

具体安装教程可以看看这个系列的第一期:手把手教你用Git——Git使用教程(一) - 掘金 (juejin.cn)

一个惨痛的事故

有两个开发人员(其中一个绝对不是我,呜呜呜)正在独立开发同一个功能,分别在featureAfeatureB分支上进行开发。他们都修改了同一个文件main.js的不同部分。为了将这两个功能合并到master分支上,使用git merge命令进行合并操作。

首先,开发人员A将featureA分支合并到master分支上:

$ git checkout master
$ git merge featureA

此时,Git会尝试自动合并featureA分支的修改。但是,由于开发人员B同时也修改了main.js文件,因此会产生合并冲突。Git会提示用户手动解决冲突。假设解决冲突后,main.js文件的内容如下:

jsCopy code
function main() {
<<<<<<< HEAD
  console.log("Feature A");
=======
  console.log("Feature B");
>>>>>>> featureA
}

此时,featureA分支的修改已经成功合并到了master分支上。接下来,开发人员B也将featureB分支合并到master分支上:

rubyCopy code
$ git checkout master
$ git merge featureB

由于featureA分支的修改已经合并到了master分支上,因此这次合并操作不会产生冲突。Git会自动将featureB分支的修改合并到master分支上,并创建一个新的合并提交。最终,master分支的提交历史记录如下:

*   Merge branch 'featureB'
|\  
| * Commit B2
| * Commit B1
* |   Merge branch 'featureA'
|\ \  
| * | Commit A2
| * | Commit A1
| |/  
* |   Commit M2
|/  
*     Commit M1

在这个例子中,如果开发人员A和B没有进行充分的沟通和协作,他们的修改可能会相互冲突,导致代码错误或功能失效。

Git merge介绍

Git merge是Git版本控制系统中一种将两个或多个不同的分支合并为一个新分支的操作。在软件开发中,团队成员通常会创建不同的分支,以便在不同的任务和特性上进行工作,这些分支在某些时候需要合并到主分支或其他分支上,以确保代码的整体稳定性和一致性。

Git merge操作是将两个分支的历史记录合并到一个新的提交中。当你执行merge操作时,Git会自动找到两个分支的最近共同祖先节点,然后比较这些节点之间的差异,将这些差异合并到一个新的提交中。这个新提交会包含两个分支的所有变更内容,并成为这两个分支的最新公共祖先。

Git merge有两种主要的合并策略:fast-forward和recursive。在fast-forward合并策略中,如果一个分支的提交历史是另一个分支的子集,那么Git会简单地将当前分支指向另一个分支的最新提交,这样就完成了合并操作。在recursive合并策略中,Git会创建一个新的提交来表示合并结果,这个提交会包含两个分支的所有变更内容。

在执行merge操作之前,通常需要先切换到目标分支,使用git checkout命令。然后,使用git merge命令将源分支合并到目标分支上。如果合并出现冲突,Git会提示你手动解决冲突。最后,使用git push命令将合并结果推送到远程仓库上,以便让其他团队成员看到最新的代码。

使用

当你需要将一个分支合并到当前分支时,可以使用git merge命令。该命令的基本用法如下:

git merge <source-branch>

其中,<source-branch>指定了要合并的源分支的名称。

例如,如果你当前在master分支,并想将dev分支合并到master分支上,可以执行以下命令:

git checkout master
git merge dev

在执行这个命令之前,你需要先切换到master分支上,使用git checkout命令。然后,执行git merge dev命令,将dev分支合并到master分支上。

如果合并成功,Git会创建一个新的提交来表示合并结果,并将该提交添加到当前分支的提交历史中。如果合并出现冲突,Git会提示你手动解决冲突。

另外,git merge命令还支持一些选项,用于控制合并的行为。其中一些常用的选项包括:

  • --no-ff:禁用fast-forward合并策略,强制Git创建一个新的合并提交。
  • --squash:将合并结果压缩为一个提交,并且不会保留源分支的提交历史。
  • -m <message>:指定新的合并提交的提交信息。

例如,如果你想要禁用fast-forward合并策略并创建一个新的合并提交,可以执行以下命令:

git merge --no-ff dev

如果你想要将合并结果压缩为一个提交,并指定合并提交的提交信息,可以执行以下命令:

git merge --squash dev
git commit -m "Merge dev branch"

注意,当你使用--squash选项时,需要使用git commit命令手动提交合并结果。因为该选项会禁止Git自动创建合并提交。

如何尽量避免代码合并事故?

  1. 保持代码库干净和整洁,避免创建不必要的分支。应该尽可能减少并合并分支,避免出现太多的冲突。
  2. 在执行合并操作之前,确保代码库和分支都已经进行了充分的测试和审查。代码合并之前需要进行全面的测试,并且应该遵循代码审查的最佳实践,确保代码的正确性和可靠性。
  3. 使用工具和技术来帮助管理和减轻合并冲突的风险,例如使用分支策略、代码审核和自动化测试等。使用Git等版本控制系统可以减少合并代码时的人为错误,通过分支策略可以将风险最小化,并使用自动化测试来检测潜在的错误。
  4. 让团队成员保持沟通和协作,确保他们都了解合并的风险和最佳实践。开发团队应该建立有效的沟通机制,确保团队成员能够相互交流,及时发现和解决问题。在项目开始之前,应该制定好合并代码的规范和流程,确保团队成员都了解和遵循最佳实践。