一、简介
在Git中,有两种方法将两个不同的branch合并。一种是通过git merge
,一种是通过git rebase
。然而,大部分人都习惯于使用git merge
,而忽略git rebase
。本文将重点介绍git rebase
的原理、使用方式及应用范围以及与git merge的区别。
二、git merge
当我们在开发一些新功能的时候,往往需要建立新的branch。
在上图中,每一个绿框均代表一个commit。除了c0,每一个commit都有一条有向边指向它在当前branch当中的上一个commit。项目在c2之后就开了另外一个branch,名为experiment
。在此之后,master
下的修改被放到c4 commit中,experiment
下的修改被放到c3 commit中。
如果我们使用merge
合并两个分支,比如讲experiment上的提交(c3)合并到master上,则可以使用如下命令:
$ git checkout master
$ git merge experiment
merge后得到的commit log如下图所示
我们看到,merge
所做的事情实际上是:
- 首先找到
master
和experiment
中最新的commit的最近公共祖先,在这里就是c4
和c3
的最近公共祖先c2
。
- 将
experiment
分支上在c2
以后的所有commit合并成一个commit,并与master
合并
- 如有合并冲突(两个分支修改了同一个文件),首先人工去除重复。
- 在master上产生合并后的新commit。
三、git rebase
rebase
所做的事情也是合并两个分支,但是它的方式略有不同。基于上例描述,rebase
的工作流程是:
- 首先找到
master
和experiment
中最新的commit的最近公共祖先,在这里就是c4
和c3
的最近公共祖先c2
。
- 将
experiment
分支上在c2
以后的所有commit*全部移动到*master
分支的最新commit之后,在这里就是把c3
移动到c4
以后。
由于git的每一个commit都只存储相对上一个commit的变化(或者说是差值,delta)。我们通过移动c3到master
,代表着在master
上进行c3相应的修改。为了达成这一点,只需在experiment
分支上rebase master
$ git checkout experiment
$ git rebase master
需要注意的是,rebase
并不是直接将c3移动到master上,而是创建一个副本。我们可以通过实际操作发现这一点。在rebase
前后,c3的hash code是不一样的。
rebase
前的commit log是
* 1b4c6d6 (master) <- c4
| * 66c417b (experiment) <- c3
|/
* 972628d
rebase后
的commit log是
* d9eeb1a - (experiment) <- c3'
* 1b4c6d6 - (master) <- c4
* 972628d
可以发现c3的hash code从
66c417b
变到了
d9eeb1a
。
在这之后,我们只需要在master
上进行一次前向合并(fast-forward merge)
$ git checkout master
$ git merge experiment
rebase
之后的commit log呈线性,更加清晰。此时如果experiment分支不再被需要,我们可以删除它。
$ git branch -d experiment
四、何时使用
我们一般只在本地开发的时候rebase
一个自己写出来的branch。
谨记,千万不要rebase一个已经发布到远程git服务器的分支。例如,你如果将分支experiment
发布到了GitHub,那么你就不应该将它rebase
到master
上。因为如果你将它rebase
到master
上,将对其他人造成麻烦。
总结
git rebase
帮助我们避免merge
带来的复杂commit log,允许以线性commit的形式进行分支开发。
更多有关git rebase
的更多用法,见这篇文章。
- 大小: 4.2 KB
- 大小: 4.9 KB
- 大小: 4.9 KB
- 大小: 4.2 KB
分享到:
相关推荐
git rebase 和 git merge 的理解与区别 Git 是一个版本控制系统,广泛应用于软件开发过程中。其中,git rebase 和 git merge 是两个常用的命令,都是用于合并分支,但是它们的实现机制和应用场景却有所不同。 git...
与 `git merge` 不同,`git rebase` 是一种“重放”或“平滑”分支历史的方法。在执行 `git rebase` 时,Git 将从共同祖先开始,将一个分支(在这个例子中是 `master`)上的所有更改应用到另一个分支(`develop`)上...
merge主要发生在这样几个地方1 两个人同时开发一个分支,在拉取对方代码的时候2 要将代码合并到master的时候git pull origin master
3. 合并分支:"VCS" -> "Git" -> "Merge",选择要合并的分支,IDEA会自动解决冲突。 六、解决冲突 1. 当多人修改同一文件时,可能会出现冲突。IDEA会在冲突文件中用特殊标记显示冲突部分。 2. 解决冲突后,需要...
本文将深入探讨Git的两个关键功能——`merge`和`rebase`,以及它们在日常开发中的应用。 1. **Git的版本控制**:Git的核心功能是版本控制,它能够记录文件的每一次修改,包括修改的内容、作者和时间。这使得开发者...
Git 是一个分布式版本控制系统,广泛应用于软件开发领域。在日常的开发工作中,为了保持代码库的整洁...因此,一般建议在自己的本地分支上进行 `rebase` 操作,然后再通过 `merge` 或 `rebase --onto` 合并到共享分支。
gti详细的分支操作,在git中,可以使用git merge 和git rebase两个命令来进行分支的合并。 git merge 和git rebase在大体上都差不多,下文主要以git merge来例来讲解分支的合并流程。 如果你想了解分支合并的更多...
Git 高级使用指南 - merge 和 rebase 的区别 在 Git 中,我们经常会遇到分叉的情况,特别是在多人协作时。当我们执行 `git merge` 命令时,commit 历史就会出现分叉,这种分叉再汇合的结构会让一些人觉得混乱而难以...
如果子目录是Git仓库(即包含`.git`目录),它会切换到该目录,执行`git fetch`获取远程更新,然后用`git merge`或`git rebase`将远程的`main`分支(或你习惯的分支名)合并到本地。 在实际使用中,你可能需要根据...
git视频教程.4.6.Git 命令 - git merge、git mergetool.mp4 git视频教程.4.7.Git 命令 - git log、git stash、git tag.mp4 git视频教程.5.1.Git 命令 - git fetch.mp4 git视频教程.5.2.Git 命令 - git pull.mp4 git...
`git merge` 的基本用法是将一个分支(通常是我们当前所在的分支)的最新变化与另一个分支的最新状态合并。这在团队协作中尤其有用,因为每个成员可能在不同的分支上工作,然后需要将他们的改动整合到主分支,如 `...
文件可能会发生冲突,需要解决一下最后结果* 85ef130 (HEAD -> master) Merge branch 'dev'可以看出,merge 有保留d
这可以通过`git fetch`、`git rebase`和`git push`来实现。 8. **版本控制** 使用Git flow,你可以更好地管理版本,通过release和hotfix分支确保线上版本的稳定。每次合并到master分支都会创建一个对应的tag,便于...
对于团队项目,可以使用`git clone`下载远程仓库,`git pull`同步远程更新,`git push`推送本地更改,以及`git fetch`和`git merge`或`git rebase`来整合远程分支。 总之,Git-2.37.3-64-bit_3.exe是Git的64位...
- **git rebase**:与`merge`不同,`git rebase`会将你的分支的变更移动到目标分支的最新提交之上,使得你的提交历史看起来像是直接在主线分支上完成的。这有助于保持一个清晰的提交历史,但可能会导致冲突,需要...
* `git rebase -i`:交互式变基,用于合并提交记录。 * `git rebase --continue`:继续变基操作。 * `git rebase --skip`:跳过当前提交记录。 * `git rebase --abort`:取消变基操作。 Git Merge 命令 Git ...
首先,Git初始化与分支操作是日常开发中不可或缺的步骤。使用`git clone`可以克隆远程仓库到本地。当需要检出特定分支时,可以使用`git checkout`,如果要创建一个新的分支,基于当前分支状态,则可以使用`git ...
通过这样的练习,你不仅可以熟悉Git的基本操作,还能深入理解Rebase和合并的区别以及它们在实际项目中的适用场景。 记住,掌握Git的这些高级特性对提升团队协作效率和代码管理能力至关重要。不断地实践和探索,你将...