本篇文章带大家了解学习一下Git分支,介绍一下使用分支的Git Merge命令,希望对大家有所帮助!
在Git中merge是用来把分叉的提交历史放回到一起的方式。git merge
命令用来将你之前使用git branch
命令创建的分支以及在此分支上独立开发的内容整合为一个分支。
请注意下面的所有命令都会是将其他分支合并到当前所在工作分支上。当前工作分支的内容会由于merge操作产生更新,但是目标分支则完全不受影响。再次强调,这意味着git merge
通常与其他几个git命令一起使用,包括使用git checkout
命令来选择当前工作分支,以及使用git branch -d
命令来删除已经合并过的废弃分支。
它是如何运行的
git merge
会将多个提交序列合并进一个统一的提交历史。在最常见的使用场景中,git merge
被用来合并两个分支。在本文档接下来的部分,我们会专注于这种合并场景。在这种场景中,git merge
接受两个commit指针,通常是两个分支的顶部commit,然后向前追溯到这两个分支最近的一个共同提交。一旦找到这个共同提交,Git就会创建一个新的"merge commit",用来合并两个分支上各自的提交序列。
比如说我们有一个功能分支由main
分支派生出来,现在我们希望将这个功能分支合并回main
分支。
执行合并命令会将指定分支合并到当前工作分支上,我们假设当前工作分支为main
。Git根据两个分支自行决定合并提交的算法(将在下面具体讨论)。
合并commit与普通commit不一样,因为合并commit会有两个父提交。创建一个合并commit时Git会尝试自动将两个独立的提交历史合并为一个。不过当Git发现某一块数据在两边的提交历史中都含有变更,它将无法自动对其进行合并。这种情况被称为版本冲突,此时Git需要人为介入调整才能继续进行合并。
准备合并
在实际进行合并操作之前,需要进行一些准备步骤,以保证合并过程能够顺利进行。
确认接收合并的分支
执行git status
命令查看当前分支的状态,确保HEAD
指正指向的是正确的接收合并的分支。如果不是,执行git checkout
命令切换到正确的分支。在我们的示例中,执行git checkout main
。
获取最新的远程提交
确保合并操作涉及的两个分支都更新到远程仓库的最新状态。执行git fetch
拉取远程仓库的最新提交。一旦fetch操作完成,为了保证main
分支与远程分支同步,还需执行git pull
命令。
合并
当上面提及的准备工作都已完备,合并就可以正式开始了。执行git merge <branch>
命令,其中为需要合并到当前分支的目标分支名称。
快进合并
当前工作分支到合并目标分支之间的提交历史是线性路径时,可以进行快进合并。在这种情况下,不需要真实的合并两个分支,Git只需要把当前分支的顶端指针移动到目标分支的顶端就可以了(也就是快进的意思)。在这种情况下快进合并成功的将提交历史合并至一处,毕竟目标分支中的提交此时都包含在当前分支的提交历史中了。对于将功能分支快进合并到main
分支的流程可以参见下图所示:
然而快进合并在两个分支出现分叉的情况下是不允许执行的。当目标分支相对于当前分支的提交历史不是线性的,Git只能通过三路合并算法来决定如何对两个分支进行合并。三路合并算法需要使用一个专用commit来整合两边的提交历史。这个名词源于Git要想生成合并commit,需要用到三个commits:两个分支的顶端commit,以及它们的共同祖先commit。
虽然实际上可以选择使用这些不同的合并策略,但是大多数开发者更喜欢快进合并(通过利用 rebasing 命令),尤其是用于小功能的开发或者bug修复;反之对于合并长期开发的功能分支,则更倾向于使用三路合并的方式。在第二种场景中,merge产生的合并commit会作为两个分支合并的标志保留在提交历史中。
接下来我们用下面第一个例子来展示如何进行快进合并。下面的命令会先创建一个新分支,在新分支上进行两次提交,然后用快进合并把新分支合并回main
分支。
# Start a new feature git checkout -b new-feature main # Edit some files git add <file> git commit -m "Start a feature" # Edit some files git add <file> git commit -m "Finish a feature" # Merge in the new-feature branch git checkout main git merge new-feature git branch -d new-feature
这个例子中的工作流程通常用于短期功能的开发,这种开发流程