Git----Git命令merge和rebase的区别

简介: Git----Git命令merge和rebase的区别

一、git merge 的流程

如下,首先在一个目录中初始化仓库,然后在master分支创建master_1和master_2两个文件,并两次提交,此时拉出dev分支,然后在master分支继续创建master_3和master_4,然后在dev分支创建dev_5和dev_6,每个文件分别提交,此时在dev分支中使用git merge master,把master分支的代码合入到dev分支,整个过程如下,最后可以看出使用merge合并分支,会在merge的时候,将master分支再在此期间的提交合并到当前分支的默认,然后再默认在增加一次merge的提交,在日常工作中,通常此时会继续将dev的分支merge到master分支,从而完成一次向主分支的提交,此时master分支合dev分支的提交顺序是完全一样了

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo
$ git init
Initialized empty Git repository in D:/src/git_demo/.git/

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ touch master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git add .

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git commit -m "add master_1"
[master (root-commit) 9b881da] add master_1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ touch master_2

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git add .

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git commit -m "add master_2"
[master aeacaa2] add master_2
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 master_2

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git checkout -b dev
Switched to a new branch 'dev'

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git checkout master
Switched to branch 'master'

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ touch master_3

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git add .

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git commit -m "add master_3"
[master 11ec7c0] add master_3
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 master_3

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ touch master_4

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git add .

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git commit -m "add master_4"
[master 62f1f81] add master_4
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 master_4

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git checkout dev
Switched to branch 'dev'

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ touch dev_5

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git add .

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git commit -m "add dev_5"
[dev 5610f83] add dev_5
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dev_5

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ touch dev_6

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git add .

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git commit -m "add dev_6"
[dev d961705] add dev_6
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dev_6

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git log --graph --pretty=oneline --abbrev-commit
* d961705 (HEAD -> dev) add dev_6
* 5610f83 add dev_5
* aeacaa2 add master_2
* 9b881da add master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git merge master
Merge made by the 'ort' strategy.
 master_3 | 0
 master_4 | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 master_3
 create mode 100644 master_4

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git log --graph --pretty=oneline --abbrev-commit
*   282d544 (HEAD -> dev) Merge branch 'master' into dev
|\
| * 62f1f81 (master) add master_4
| * 11ec7c0 add master_3
* | d961705 add dev_6
* | 5610f83 add dev_5
|/
* aeacaa2 add master_2
* 9b881da add master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git checkout master
Switched to branch 'master'

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git log --graph --pretty=oneline --abbrev-commit
* 62f1f81 (HEAD -> master) add master_4
* 11ec7c0 add master_3
* aeacaa2 add master_2
* 9b881da add master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git merge dev
Updating 62f1f81..282d544
Fast-forward
 dev_5 | 0
 dev_6 | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dev_5
 create mode 100644 dev_6

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git log --graph --pretty=oneline --abbrev-commit
*   282d544 (HEAD -> master, dev) Merge branch 'master' into dev
|\
| * 62f1f81 add master_4
| * 11ec7c0 add master_3
* | d961705 add dev_6
* | 5610f83 add dev_5
|/
* aeacaa2 add master_2
* 9b881da add master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$

二、git rebase的流程

可以使用git reset 先将上述回退到merge之前,比如在master分支

$ git log --graph --pretty=oneline --abbrev-commit
*   282d544 (HEAD -> master, dev) Merge branch 'master' into dev
|\
| * 62f1f81 add master_4
| * 11ec7c0 add master_3
* | d961705 add dev_6
* | 5610f83 add dev_5
|/
* aeacaa2 add master_2
* 9b881da add master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git reset --hard 62f1f81
HEAD is now at 62f1f81 add master_4

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git log --graph --pretty=oneline --abbrev-commit
* 62f1f81 (HEAD -> master) add master_4
* 11ec7c0 add master_3
* aeacaa2 add master_2
* 9b881da add master_1

在dev分支

$ git checkout dev
Switched to branch 'dev'

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git log --graph --pretty=oneline --abbrev-commit
*   282d544 (HEAD -> dev) Merge branch 'master' into dev
|\
| * 62f1f81 (master) add master_4
| * 11ec7c0 add master_3
* | d961705 add dev_6
* | 5610f83 add dev_5
|/
* aeacaa2 add master_2
* 9b881da add master_1

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git reset d961705 --hard
HEAD is now at d961705 add dev_6

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git log --graph --pretty=oneline --abbrev-commit
* d961705 (HEAD -> dev) add dev_6
* 5610f83 add dev_5
* aeacaa2 add master_2
* 9b881da add master_1

此时在dev分支执行rebase命令,git rebase 是首先将master分支的合并进来,然后将本分支加到master分支提交记录的后面,此外可以看到此时提交记录就简洁的多了,则就是rebase和merge的主要优势

$ git rebase master
Successfully rebased and updated refs/heads/dev.

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git log --graph --pretty=oneline --abbrev-commit
* 3e4ae24 (HEAD -> dev) add dev_6
* 9ac0d04 add dev_5
* 62f1f81 (master) add master_4
* 11ec7c0 add master_3
* aeacaa2 add master_2
* 9b881da add master_1

此时切回到master分支需要使用merge

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev)
$ git checkout master
Switched to branch 'master'

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git merge dev
Updating 62f1f81..3e4ae24
Fast-forward
 dev_5 | 0
 dev_6 | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dev_5
 create mode 100644 dev_6

hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master)
$ git log --graph --pretty=oneline --abbrev-commit
* 3e4ae24 (HEAD -> master, dev) add dev_6
* 9ac0d04 add dev_5
* 62f1f81 add master_4
* 11ec7c0 add master_3
* aeacaa2 add master_2
* 9b881da add master_1

三、git rebase 和 git merge区别总结

(1)git meerge 是将当前分支的提交放在merge分支的前面,而git rebase是将当前分支的提交放到reabse分支的后面

(2)git merge 会在最后增加一个merge的提交记录,而git rebase 不会额外增加提交记录

(3)git merge 合并之后提交记录是非常复杂的,而使用git rebase合并之后提交记录是线性的

(4)使用git merge 合并之后就不能再回退自己的提交代码了,如果回退则会降merge的内容一同回退了,而git rebase在合并之后可以继续回退自己的提交,而从rebase合进来的代码不受影响

(4)很明显,dev开发分支适合使用git rebase,而master主分支则非常适合git merge

(5)master主分支如果使用git rebase的后果是改变了提交历史,比如多人合作时后使用rebase的必须将前面使用过rebase的代码合到自己的前面,导致跟拉出来分支的时候提交历史不一样了,从而会带来各种比较痛苦的提交体验

目录
相关文章
|
1月前
|
安全 开发工具 git
git的常用操作命令
git的常用操作命令
232 57
|
2月前
|
存储 项目管理 开发工具
Git常用命令及操作技巧
以上是Git的常用命令及操作技巧,尽管看起来有些繁琐,但实际上只要花费一些时间进行实践,您将很快熟练掌握。随着使用熟练度的提高,您会发现Git对项目管理和协同工作的强大帮助。
82 20
|
5月前
|
开发工具 git
git fetch和 pull的区别
`git fetch`和 `git pull`在Git中扮演着不同的角色,了解它们的区别和使用场景对于高效管理代码库至关重要。通过合理使用这两个命令,可以更好地控制代码合并过程,减少冲突,提高团队协作效率。
400 97
|
4月前
|
人工智能 前端开发 Java
用git rebase命令合并开发阶段中多条commit提交记录
通过 `git rebase`,可以合并多个提交记录,使开发历史更简洁清晰。操作分为 6 步:查看提交历史 (`git log --oneline`)、设置需合并的提交数 (`git rebase -i HEAD~N`)、修改动作标识为 `s`(squash)、保存退出编辑、调整提交信息、强制推送至远程仓库 (`git push -f`)。此方法适合清理本地无关提交,但若有团队协作或冲突风险,需谨慎使用以避免问题。
232 60
|
3月前
|
Linux 开发工具 git
版本控制工具:Git的安装和基本命令使用指南。
结束这段探险,掌握了Git你就等于掌握了一个宝藏,随时可以瞥见你的编程历程,轻松面对日后的挑战。Git,无疑是编程者的强大武器,开始你的Git探险之旅吧!
147 28
|
4月前
|
存储 安全 开发工具
Git 对比 SVN 的区别和优势
Git和SVN各有优劣,选择哪种工具取决于项目的具体需求和团队的协作模式。Git适合大型、复杂、需要频繁分支和合并操作的项目,而SVN则更适合小型项目和集中式团队协作。通过本文的对比分析,开发者可以更好地理解两者
343 13
|
5月前
|
开发工具 git
git fetch和 pull的区别
通过这些内容和示例,您可以系统地理解 `git fetch`和 `git pull`的区别,并在实际工作中灵活应用这两个命令,提高版本控制的效率。希望这些内容对您的学习和工作有所帮助。
181 24
|
5月前
|
开发工具 git
git的rebase和merge的区别
通过这些内容和示例,您可以深入理解Git的 `rebase`和 `merge`操作及其区别,选择合适的方法进行分支管理,提高版本控制的效率和规范性。希望这些内容对您的学习和工作有所帮助。
384 5
|
开发工具 git
Git常用命令
Git常用命令
227 0
Git常用命令
|
存储 人工智能 安全
Git: 常用命令
Git: 常用命令
Git: 常用命令