Git中关于merge和rebase的使用场景

很多人都熟悉merge在git中的使用,但是并不是很熟悉rebase,那么首先我们先了解一下什么是rebase?⁉️
git rebase 可以将它理解为重新设置基线–变基,将你当前的分支重新设置为开始点。这样你才能知道当前所处的分支与需要进行比较的分支的差别在哪里。
rebase要基于一个分支来设置你当前的分支的基线,即当前最新跟踪的分支的最后面,这样当前分支就是最新的跟踪分支。因为这里的操作是基于文件事务进行处理的,所以不用怕中间失败会影响文件的一致性,在中间的任何过程都可以随时取消rebase事务。

那么git rebase 和 git merge有什么区别呢?

rebase会把当前分支的commit放到公共分支的最后面,所以叫做变基,就好像从公共分支又重新拉出来这个分支一样,基线发生改变。
举个栗子?如果你从master拉了个feature分支出来,然后你提交了几个commit,这个时候刚好有团队中的其他成员把他开发的东西合并到了master了,这个时候master就比你拉分支的时候对了几个commit,此时就是我们的变基rebase登场的时候了,我们现在使用git rebase,这样就会把你的commit放到刚才那个人的commit后面~

merge会把公共分支和当前的commit合并在一起,形成一个新的commit提交

‼️注意:
  • 不要在公共分支使用rebase
  • 本地和远端对应同一条分支优先使用rebase,而不是merge
那么问题来了,为什么不要在公共分支使用rebase?

因为往后放的这些commit都是新的,这样其他从这个公共分支拉出分支的人都需要在rebase,相当于你rebase东西进来,就都是新的commit了?

  1. 1-2-3是现在的分支状态
  2. 这个时候从master拉出来一个分支member
  3. 然后master提交了4-5,而member分支提交了6-7
  4. 这时候master分支状态就是1-2-3-4-5,member分支状态变成了1-2-3-6-7
  5. 如果在member分支上使用rebase master,那么member分支就变成了1-2-3-4-5-6-7
  6. 但是如果使用merge,就变成了1-2-3-6-7-8…|4-5|
  7. 会多出来一个8,这个8就是将4-5合并的提交

rebase有好有坏,比如你自己在开发分支一直在做,然后你需要把主线的修改合到你的分支上做一次集成,这种情况就用rebase比较好,将自己的提交都放在主线修改的后面,但是还有一个重要问题,rebase的话,加入我的分支是从3拉出来的,rebase完了以后就不知道我是从哪个分支拉出来的了

### 3.1 工作方式的区别 `git rebase` 的工作方式是将当前分支的提交逐个重新应用到目标分支的最新提交上。这种方式会创建一个新的提交历史,使得当前分支的提交看起来像是直接在目标分支上进行的。由于提交历史被重新构建,因此 `git rebase` 会改变提交历史[^2]。 ```bash git rebase main ``` `git merge` 则是将两个或多个分支的更改合并到一个新的提交中。这个新提交有两个或多个父提交,分别指向合并之前的各个分支。`git merge` 保留了原始分支的提交历史,并在合并点创建一个新的提交来记录合并操作[^2]。 ```bash git merge feature-branch ``` ### 3.2 提交历史的影响 `git rebase` 会重写提交历史,因此适用于本地未推送的提交。如果对已经推送到远程仓库的提交进行变基,可能会导致混乱,影响其他开发者的工作。这种操作适合在开发过程中定期执行,以保持提交历史的清晰[^3]。 `git merge` 不会改变提交历史,而是通过创建一个新的合并提交来整合两个分支的历史。这种方式更安全,适合用于已经推送到远程仓库的分支,尤其是多人协作的场景[^1]。 ### 3.3 合并冲突的处理 在 `git rebase` 过程中,如果遇到冲突,需要手动解决冲突后使用 `git rebase --continue` 继续执行变基操作。如果希望放弃变基并回到操作前的状态,可以使用 `git rebase --abort`[^1]。 ```bash # 解决冲突后继续变基 git rebase --continue # 放弃变基 git rebase --abort ``` 在 `git merge` 中,如果遇到冲突,同样需要手动解决冲突,然后使用 `git commit` 完成合并提交。`git merge` 通常不会改变已有提交的历史,因此更适合用于多人协作的分支合并。 ### 3.4 使用场景 **使用 `git rebase` 的场景:** - 在本地开发过程中,将功能分支变基到主分支上,以保持提交历史的线性与整洁。 - 在提交尚未推送到远程仓库时,进行变基操作,以简化合并过程,减少冲突。 **使用 `git merge` 的场景:** - 在多人协作的分支上,保留完整的提交历史,确保合并操作的可追溯性。 - 当不需要重写提交历史时,例如合并远程分支或发布分支的更改[^2]。 ### 3.5 `git merge` `git merge --no-ff` 的区别 `git merge` 默认会尝试进行快进合并(fast-forward merge),即如果当前分支的提交历史是目标分支的直接延续,则不会创建新的合并提交,而是直接移动指针[^1]。 ```bash git merge feature-branch ``` `git merge --no-ff` 则会强制创建一个新的合并提交,即使可以进行快进合并。这种方式保留了分支合并的记录,适用于需要明确记录合并操作的场景[^1]。 ```bash git merge --no-ff feature-branch ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值