git merge
用法一:用于从一个分支到另一个分支的合并
A–B–C----E foo
|
|----D bar
当前分支为foo分支,可使用git checkout foo切换到foo分支,使用git branch查看分支。
git merge bar // 会在当前分支(即foo分支)下生成一个新的commit节点F,从而实现分支的合并。
A–B–C----E—F foo
\ /
----D----
bar
git rebase
用法一:从两个分支分叉位置开始执行合并
A----B----C-----D master分支
|
|----E----F 某个特性分支feature1
我们假设feature1和master是一个项目的两个分支,master当然是主分支,而feature1是旁路分支。在软件开发的大部分情况中,旁路分支是要遵 从主分支的。所以说,现在feature1分支想将master分支开发的最新代码导入到feature1分支中,而且要求此动作不影响master主分支的开发,也 就是说要暗中完成。git-rebase上场了:
git checkout feature1 // 切换到feature1分支
git rebase master // 把master分支从B开始之后的C、D merge合入到feature1分支。
如果提示:
Cannot rebase: You have unstaged changes.
Please commit or stash them.
则执行 git checkout .
如果提示冲突,vi编辑冲突文件 搜索<<< 或>>>编辑消除冲突,执行git add 冲突文件路径. 执行git rebase --continue,解决完冲突后,最后执行git push -f (带上分支名)
rebase操作的合并过程,它先是会暂存当前分支上从分叉开始之后commit节点(E、F),然后回退到分叉开始的节点B。接着master分支上的所有commit(C、D)被移动到feature1分支上,最后再合并之前暂存的节点(E、F)。 最后feature1分支commit顺序为为A----B----E----F----C----D。
可以执行多次,将源分支最近修改给当前分支rebase。
用法二:将某一段commit合入到另外一个分支上
建议用git rebase 分支名1,把当前分支的修改基于分支名1 重新rebase一次。
命令格式:
git rebase [startpoint] [endpoint] --onto [branchName]
[startpoint] [endpoint] 指定了一个编辑区间(前开后闭)
使用方法:
当前分支为develop分支,将develop分支的90bc0045b~5de0da9f2的commit合入到master分支。
git rebase 90bc0045b^ 5de0da9f2 --onto master
如果提示:
Cannot rebase: You have unstaged changes.
Please commit or stash them.
则执行 git checkout .
提示冲突,则vi修改冲突,git add冲突文件路径,git rebase --continue。
git checkout master // 从develop分支切换到master分支
git reset --hard 0c72364 // 将master所指向的提交id设置为当前HEAD所指向的提交id,0c72364为执行git rebase后,master分支最后一次commit的SHA-1值(git checkout master执行后显示最上面一行的hash码)。
git push -f 把git rebase修改 提交到远端master分支(春妙 说要指定分支)。
用法三:合并多次commit为一个完整的commit
当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。
git rebase -i [startpoint] [endpoint]
-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作
[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
git rebase -i 36224db // 从36224db往后的commit,不包含36224db
git rebase -i HEAD~3 // 最近3此提交合并为一次提交
将最后两次提交 pick修改为s
编辑完成后保存后,完成commit合并。
git rebase -i 后 多次提交 顺序可以移动,第一次提交 pick不能修改为f。用户名变更。某次提交的用户名没法修改。