目录

  • 实际是测验真谛的唯一标准

    • git merge 合并代码

      • 创立分支和提交记录
      • 进行合并
      • 解决抵触
      • 回滚代码
      • 补充操作
    • 再来看看应用 git rebase 合并分支

      • 创立分支和提交记录
      • 进行合并
      • 解决抵触
      • 版本回滚
    • git rebase 还有什么优化的空间吗?

      • 为什么要对版本进行合并?
      • 如何对代码进行合并呢?
  • git merge VS. git rebase 总结

    • 雷同的中央
    • 不同的中央
  • 为什么要举荐应用 git rebase 呢?
  • 这里还有几点重要的阐明

咱们当初分支合并想到最多的就是git merge,还有一个合并代码的命令git rebase,而这个命令在工作中优先被举荐应用,上面先通过两个例子领会一下两个命令合并代码的差异:

实际是测验真谛的唯一标准

git merge 合并分支

创立分支和提交记录
  1. master分支创立一个merge1分支,进行第一次提交
git checkout mastergit checkout -b merge1git add .git commit -m 'merge1'
  1. master分支创立一个merge2分支,批改代码,进行第一次提交
git checkout mastergit checkout -b merge2git add .git commit -m 'merge2'
  1. 切换到merge1分支,批改代码,进行第二次提交
git checkout merge1git add .git commit -m 'merge1-2'
  1. 切换到merge2分支,批改代码,进行第二次提交
git checkout merge2git add .git commit -m 'merge2-2'
进行合并

5.将merge2分支mergemerge1分支中,解决抵触之后会有一个新的 mergecommit 分支。

git checkout merge1git merge merge2

  1. 如果想勾销合并,间接应用git merge --abort
git merge --abort
解决抵触
  1. 解决抵触之后(这里抉择保留单方更改),这里抉择间接提交代码
git add .git commit -m 'merge1 merge merge2'

回滚代码
  1. 如果想要回到merge1-2,执行操作git reset

补充操作
  1. 在第7步的时候,如果间接应用git merge --continue会进入面板,能够批改提交分支的信息
git merge --continue

这个时候i插入,批改merge1 merge merge2 continue之后按ESC键,而后按:wq保留,能够看出,这边还是会新保留一个commit

  1. 9步之后想要回到merge1-2,操作git reset
git reset <commitID>

再来看看应用 git rebase 合并分支

创立分支和提交记录
  1. master分支创立一个merge1分支,进行第一次提交
git checkout mastergit checkout -b merge1git add .git commit -m 'merge1'
  1. master分支创立一个merge2分支,批改代码,进行第一次提交
git checkout mastergit checkout -b merge2git add .git commit -m 'merge2'
  1. 切换到merge1分支,批改代码,进行第二次提交
git checkout merge1git add .git commit -m 'merge1-2'
  1. 切换到merge2分支,批改代码,进行第二次提交
git checkout merge2git add .git commit -m 'merge2-2'
进行合并
  1. 切换到merge1分支,进行rebase操作git rebse merge2
git checkout merge1git rebase merge2

首先这里能够看到要和两个提交进行rebase

  1. 此时想要退出合并,写git rebase --abort
git rebase --abort
解决抵触
  1. 咱们要手动批改第一个提交,因为这个提交不是最初一个提交,所以内容能够不保留,抉择采纳以后更改

  1. 而后提交批改,这里先应用git add .,而后应用git rebase --continue时说没有批改,是否强制应用git rebase --skip跳过
git add .git rebase --skip

  1. 这个胜利之后进入下一个提交,这里能够看到,这里与merge的以后更改和传入更改的地位是有扭转的,传入的更改反而是merge1,这个时候抉择保留单方更改。

  1. 而后提交批改
git add .git rebase --continue

  1. 此时查看git log,发现合并后的log展现
  • 并没有再生成新的提交记录
  • 这里的log程序和merge不同
  • 因为方才咱们应用skip跳过了一个commit,所以这里并没有merge1

版本回滚
  1. 此时要回滚到merge1-2的时候,即没有rebase之前,是无奈回退的,因为咱们的版本树外面,曾经找不到合并之前的两次提交了,这个时候须要应用git reflog操作日志进行回滚,这里应用第几步能够回滚的更好。

git rebase 还有什么优化的空间吗?

个别应用git rebase的时候,都会将以后的版本进行commit合并。

为什么要对版本进行合并?

方才试验的时候,其实咱们曾经看到了,git rebase的流程是,将merge2的代码拉到merge1中,而后和merge1中提交的代码一次一次进行diff,然而个别状况下,咱们个别会将merge1中最初一次提交的代码视为最终代码,并不需要再和之前的代码进行diff,这个时候就须要先将之前的版本合并,而后再与merge2进行diff,此时只须要diff一次即可。

如何对代码进行合并呢?

请看这篇博客:办法二:合并须要的commit

git merge VS. git rebase 总结

雷同的中央

对git版本进行治理,性能是合并代码,都须要手动解决抵触。

不同的中央

比拟git mergegit rebase
原理git merge是两个分支最新commit进行diff比拟,解决抵触之后生成一个新的commit记录git rebase是将指标分支拉取,并与以后分支的每一个提交逐个进行diff,将以后分支合并到指标分支代码的前面,解决抵触之后更新commitID,以后分支原来的commitID不保留在log记录中
查看logcommit记录依照版本提交工夫进行排列,并不是版本的实在程序。<br/>依照合并程序进行排列,理论版本的实在程序<br/>
原理图这个是分支存在的实在结构图<br/>这个图形容了,merge1的rebase操作,是将merge2代码拉过来之后将本人合并到其前面<br/>

为什么要举荐应用 git rebase 呢?

  1. 防止在总分支上手动解决抵触的危险操作

咱们理论开发的时候,都会有一个总的dev分支,和一个本人的分支work,正确的操作是咱们应该先将dev的分支拉过来,而后将咱们的代码合并下来,首先在咱们本人的work代码中,有一个解决完抵触的最新代码,其次再去dev分支merge咱们的work分支,这样,就不会呈现在dev分支上手动解决分支的危险操作。

# 在work分支git rebase dev# 解决完分支,切换到dev分支git checkout dev# 合并work分支的代码git merge work
  1. 失去一个洁净整洁的版本树

通过下面的原理图咱们能够看到,在分支存储的时候,两个分支的内容还是理论还是离开的,而rebase之后的版本树,是一条实在洁净的版本树。这个对当前正式版本的保护是很可的一件事,也是举荐大家用的。

这里还有几点重要的阐明

  1. 千万不要用dev分支去rebase咱们本人的分支。
  2. rebase dev的时候,尽量先将本人所有的commit合并成1个,而后再进行rebase操作。
  3. 对于dev分支来说,应用rebase更好一些。如果进行回滚操作了,那么以后分支批改之后还须要再次与dev 进行一次merge操作。如果是rebase,间接能够在最新的代码中进行批改。
  4. 重重重要的阐明! 重重重要的阐明! 重重重要的阐明!有些人会说rebase的操作简单,而且回滚操作很不不便,咱们都晓得合并是一件很谨慎的事件,所以咱们在进行合并操作的时候,也要进行谨慎思考。之前也有遇到过,有同时滥用merge将他人代码冲掉的状况,所以对于开发来说,上线的货色质量保证是很重要的。