git rebase超详细解读,一文搞懂!!!

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

1. Git Rebase的介绍

我们都知道,git rebase可以实现git节点或者分支的合并,但是,真正涉及到为什么要使用git rebase,它的好处又是什么等一些比较实际的问题,很多同学就搞不清楚了,本文聚焦于git rebase,着重讨论该命令的两种妙用,来帮助大家直观的理解这条命令。

写在前面:如果你的分支不只有你在进行开发,那么git-rebase可能会导致提交记录的丢失,但是如果你是在自己的分支上进行开发,那么这无疑是一个很棒的选择。

2. Git Rebase作用一:合并本地的多条提交(commit)记录

一般情况下,我们进行开发时,都是从master分支拉一个自己的开发分支,进行代码修改操作,再git add以及git commit之后将我们修改好的代码git push到远程仓库。

但是,很多情况下,我们并不会仅仅在本地git commit一次,而是会执行很多次,而我们知道,每一个的git commit都会形成一个git节点,而如果我们把这些节点都push到远端,就会使项目的git日志很乱,因为你的这些commit对于其他同学来说都仅仅是为了完成你对应的修改工作,他们希望的是,你能在一次commit操作中把你的修改全部完成,这时,就可以用到我们的git rebase操作了,在git push之前,我们可以将几次本地的commit操作合并,这样,我们推送到远端的commit操作就只有一个了,更利于项目管理。

已经在本地提交了两次:

image.png

调用git rebase命令合并本地的commit节点

git rebase -i HEAD~2
复制代码

image.png

经过上面的操作,我们就只剩了一个commit节点,里面包含了我们所有的修改信息,再合并到master中。就不会有开始提到的问题了。

需要注意的是,如果你的commit已经push到远端了,那么就没有办法使用我们的这个技巧了。

2. Git Rebase作用一:分支合并

1.我们先从 master 分支切出一个 dev 分支,进行开发:

git checkout -b feature1
复制代码

image.png

  1. 其他同学完成了一次 hotfix,并合并入了 master 分支,此时 master 已经领先于你的 feature1 分支了:

image.png

  1. 使用 rebase 来同步其他同学修改的结果,来保证自己的代码是最新的版本

image.png

3. Git Rebase的过程

git rebase 做了什么操作呢?

首先,git 会把 feature1 分支里面的每个 commit 取消掉;
其次,把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
然后,把 feature1 分支更新到最新的 master 分支;
最后,把上面保存的 patch 文件应用到 feature1 分支上。

4. 冲突解决

在 rebase 的过程中,也许会出现冲突 conflict。在这种情况,git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容。

注意,你无需执行 git-commit,只要执行 continue

git rebase --continue
复制代码

这样 git 会继续应用余下的 patch 补丁文件。

在任何时候,我们都可以用 --abort 参数来终止 rebase 的行动,并且分支会回到 rebase 开始前的状态。

git rebase —abort
复制代码

5. 注意事项

根据上文来看,git-rebase 很完美,解决了我们的两个问题:
1.合并 commit 记录,保持分支整洁;
2.相比 merge 来说会减少分支合并的记录;

但是如果你的分支不只有你在进行开发,那么git-rebase可能会导致提交记录的丢失。

image.png

那么当他 pull 远程 master 的时候,就会有丢失提交纪录。这就是为什么我们经常听到有人说 git rebase 是一个危险命令,因为它改变了历史,我们应该谨慎使用。

但是,只要你自己的分支上需要 rebase 的所有 commits 历史还没有被 push 过,就可以安全地使用 git-rebase来操作。

猜你喜欢

转载自juejin.im/post/7103560564466515981