我们新建三个分支分别是master、dev、test,之后在dev分支的test.txt文件新建2个提交,在test分支的test.txt文件新建2个提交。
切换到test分支,然后执行git rebase dev 我们要将dev分支的提交应用到test分支:
然后在test分支执行git rebase dev
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 2 $ git rebase dev 3 First, rewinding head to replay your work on top of it... 4 Applying: [test branch] add -test1- in text.txt //将test的第一次提交应用到dev的最后一个节点 5 error: Failed to merge in the changes. 6 Using index info to reconstruct a base tree... 7 M test.txt 8 Falling back to patching base and 3-way merge... 9 Auto-merging test.txt 10 CONFLICT (content): Merge conflict in test.txt 11 Patch failed at 0001 [test branch] add -test1- in text.txt 12 The copy of the patch that failed is found in: .git/rebase-apply/patch 13 14 When you have resolved this problem, run "git rebase --continue". 15 If you prefer to skip this patch, run "git rebase --skip" instead. 16 To check out the original branch and stop rebasing, run "git rebase --abort". 17 18 19 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 20 $ cat test.txt 21 master1 22 <<<<<<< HEAD 23 dev1 24 dev2 25 ======= 26 test1 27 >>>>>>> [test branch] add -test1- in text.txt 28 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 29 $ git status 30 rebase in progress; onto f28df0d 31 You are currently rebasing branch 'test' on 'f28df0d'.//对dev 的'f28df0d'应用补丁。 32 (fix conflicts and then run "git rebase --continue") 33 (use "git rebase --skip" to skip this patch)//使用dev的补丁,废弃test的修改。 34 (use "git rebase --abort" to check out the original branch)//终止rebase过程 35 36 Unmerged paths: 37 (use "git reset HEAD <file>..." to unstage) 38 (use "git add <file>..." to mark resolution) 39 40 both modified: test.txt 41 42 no changes added to commit (use "git add" and/or "git commit -a")
git rebase –abort的意思是终止当前rebase的操作,回到原始状态。
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 2 $ git rebase --abort 3 4 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 5 $ cat test.txt 6 master1 7 test1 8 test2
刚才演示了abort的效果,我们重新rebase回到rebase状态:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 2 $ git rebase dev 3 First, rewinding head to replay your work on top of it... 4 Applying: [test branch] add a line in test.txt 5 error: Failed to merge in the changes. 6 Using index info to reconstruct a base tree... 7 M test.txt 8 Falling back to patching base and 3-way merge... 9 Auto-merging test.txt 10 CONFLICT (content): Merge conflict in test.txt 11 Patch failed at 0001 [test branch] add a line in test.txt 12 The copy of the patch that failed is found in: .git/rebase-apply/patch 13 14 When you have resolved this problem, run "git rebase --continue". 15 If you prefer to skip this patch, run "git rebase --skip" instead. 16 To check out the original branch and stop rebasing, run "git rebase --abort". 17 18 19 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 20 $ cat test.txt 21 master1 22 <<<<<<< HEAD 23 dev1 24 dev2 25 ======= 26 test1 27 >>>>>>> [test branch] add a line in test.txt
test.txt文件里边的冲突部分是dev分支的“dev1 dev2”2行和test分支的“test1”, 即以dev的2次提交为基准,那么如果执行git rebase –skip所做的操作是:
丢弃test的第一次提交的修改,保留dev的修改:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 2 $ git rebase --skip 3 Applying: [test branch] add -test2- in text.txt //应用test的第二次提交。 4 error: Failed to merge in the changes. 5 Using index info to reconstruct a base tree... 6 M test.txt 7 Falling back to patching base and 3-way merge... 8 Auto-merging test.txt 9 CONFLICT (content): Merge conflict in test.txt 10 Patch failed at 0002 [test branch] add -test2- in text.txt 11 The copy of the patch that failed is found in: .git/rebase-apply/patch 12 13 When you have resolved this problem, run "git rebase --continue". 14 If you prefer to skip this patch, run "git rebase --skip" instead. 15 To check out the original branch and stop rebasing, run "git rebase --abort". 16 17 18 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 2/2) 19 $ cat test.txt 20 master1 21 <<<<<<< HEAD 22 dev1 23 dev2 24 ======= 25 test1 26 test2 //test2出现。 27 >>>>>>> [test branch] add -test2- in text.txt
此时如果我们再次执行git rebase –skip 就会将test的第二次提交丢弃,保留dev的修改:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 2/2) 2 $ git rebase --skip 3 4 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 5 $ cat test.txt 6 master1 7 dev1 8 dev2 9 10 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 11 $
可以看到保留的2次的dev出现在文件里边,即“dev1 “和”dev2”这2次提交。
同时我们看一下git log:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 2 $ git log 3 commit f28df0d2c6fcb11d34e7551d5bb9b337aa46b259 (HEAD -> test, dev) 4 Author: ceaser <ceaserwang@outlook.com> 5 Date: Sat Aug 5 20:38:36 2017 +0800 6 7 [dev branch] add -dev2- in test.txt 8 9 commit 9ad27e0c99795978f259af4d2e17b99b77448f91 10 Author: ceaser <ceaserwang@outlook.com> 11 Date: Sat Aug 5 20:38:22 2017 +0800 12 13 [dev branch] add -dev1- in test.txt 14 15 commit 72d9d551a336c1db8976a8d1f595f4d9dbd5569b (master) 16 Author: ceaser <ceaserwang@outlook.com> 17 Date: Sat Aug 5 19:55:40 2017 +0800 18 19 master branch add file test.txt with master1 content 20 21 commit 62046ccba0fea0b8e922697312632972edc8f0f8 22 Author: ceaser <ceaserwang@outlook.com> 23 Date: Sat Aug 5 19:48:49 2017 +0800 24 25 master branch add file test.txt with line master1 commtent
里边有dev的2次提交的commit id验证了我们所说的。
此时我们切换到dev分支,演示出现冲突的一种情况,上边我们演示的是丢弃test的提交,那么我们接下来演示不丢弃test的提交,切换到dev的时候我们 git merge test,进行的是fast forward:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 2 $ git checkout dev 3 Switched to branch 'dev' 4 5 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 6 $ git merge test 7 Already up-to-date.
我们增加dev3和dev4:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 2 $ cat test.txt 3 master1 4 dev1 5 dev2 6 7 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 8 $ echo 'dev3' >> test.txt 9 10 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 11 $ git add test.txt 12 warning: LF will be replaced by CRLF in test.txt. 13 The file will have its original line endings in your working directory. 14 15 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 16 $ git commit -m '[dev branch] add -dev3- in test.txt' 17 [dev f018dc6] [dev branch] add -dev3- in test.txt 18 1 file changed, 1 insertion(+) 19 20 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 21 $ echo 'dev4' >> test.txt 22 23 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 24 $ git add test.txt 25 warning: LF will be replaced by CRLF in test.txt. 26 The file will have its original line endings in your working directory. 27 28 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 29 $ git commit -m '[dev branch] add -dev4- in test.txt' 30 [dev 3d74c2e] [dev branch] add -dev4- in test.txt 31 1 file changed, 1 insertion(+) 32 33 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 34 $ cat test.txt 35 master1 36 dev1 37 dev2 38 dev3 39 dev4 40 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 41 $ git log -3 42 commit 3d74c2ee12b7556cdbd576eb9f6fd9795898ddf6 (HEAD -> dev) 43 Author: ceaser <ceaserwang@outlook.com> 44 Date: Sat Aug 5 21:08:39 2017 +0800 45 46 [dev branch] add -dev4- in test.txt 47 48 commit f018dc6f17d1a9b7c835e43064b695dd4b74e8df 49 Author: ceaser <ceaserwang@outlook.com> 50 Date: Sat Aug 5 21:08:23 2017 +0800 51 52 [dev branch] add -dev3- in test.txt 53 54 commit f28df0d2c6fcb11d34e7551d5bb9b337aa46b259 (test) 55 Author: ceaser <ceaserwang@outlook.com> 56 Date: Sat Aug 5 20:38:36 2017 +0800 57 58 [dev branch] add -dev2- in test.txt
切换到test分支增加test3 和test4:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 2 $ cat test.txt 3 master1 4 dev1 5 dev2 6 7 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 8 $ echo 'test3' >> test.txt 9 10 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 11 $ git add test.txt 12 warning: LF will be replaced by CRLF in test.txt. 13 The file will have its original line endings in your working directory. 14 15 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 16 $ git commit -m '[test branch] add -test3- in test.txt' 17 [test 17794bd] [test branch] add -test3- in test.txt 18 1 file changed, 1 insertion(+) 19 20 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 21 $ echo 'test4' >> test.txt 22 23 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 24 $ git add test.txt 25 warning: LF will be replaced by CRLF in test.txt. 26 The file will have its original line endings in your working directory. 27 28 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 29 $ git commit -m '[test branch] add -test4- in test.txt' 30 [test d5a085e] [test branch] add -test4- in test.txt 31 1 file changed, 1 insertion(+) 32 33 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 34 $ git log -3 35 commit d5a085e27b6f25f354c3292078d0069a3605eeaa (HEAD -> test) 36 Author: ceaser <ceaserwang@outlook.com> 37 Date: Sat Aug 5 21:12:56 2017 +0800 38 39 [test branch] add -test4- in test.txt 40 41 commit 17794bda63b337577ad0da88826c28ef2b17ba67 42 Author: ceaser <ceaserwang@outlook.com> 43 Date: Sat Aug 5 21:12:43 2017 +0800 44 45 [test branch] add -test3- in test.txt 46 47 commit f28df0d2c6fcb11d34e7551d5bb9b337aa46b259 48 Author: ceaser <ceaserwang@outlook.com> 49 Date: Sat Aug 5 20:38:36 2017 +0800 50 51 [dev branch] add -dev2- in test.txt 52 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 53 $ cat test.txt 54 master1 55 dev1 56 dev2 57 test3 58 test4
test分支下执行git rebase dev:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 2 $ git rebase dev 3 First, rewinding head to replay your work on top of it... 4 Applying: [test branch] add -test3- in test.txt 5 error: Failed to merge in the changes. 6 Using index info to reconstruct a base tree... 7 M test.txt 8 Falling back to patching base and 3-way merge... 9 Auto-merging test.txt 10 CONFLICT (content): Merge conflict in test.txt 11 Patch failed at 0001 [test branch] add -test3- in test.txt 12 The copy of the patch that failed is found in: .git/rebase-apply/patch 13 14 When you have resolved this problem, run "git rebase --continue". 15 If you prefer to skip this patch, run "git rebase --skip" instead. 16 To check out the original branch and stop rebasing, run "git rebase --abort". 17 18 19 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 20 $ cat test.txt 21 master1 22 dev1 23 dev2 24 <<<<<<< HEAD 25 dev3 26 dev4 27 ======= 28 test3 29 >>>>>>> [test branch] add -test3- in test.txt
此时出现的冲突我们先保留test3:
vi test.txt 删除456行:
1 $ cat test.txt 2 master1 3 dev1 4 dev2 5 test3
执行git rebase –continue
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 2 $ git add test.txt 3 4 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test|REBASE 1/2) 5 $ git rebase --continue 6 Applying: [test branch] add -test3- in test.txt 7 Applying: [test branch] add -test4- in test.txt 8 9 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) //回到test 10 $
执行之后出现:
Applying: [test branch] add -test3- in test.txt
Applying: [test branch] add -test4- in test.txt
我们保留了test3的提交,test4就是比test3多了一次提交,直接就成功了。
查看文件只保留了test的提交:
1 $ cat test.txt 2 master1 3 dev1 4 dev2 5 test3 6 test4
test的日志:
如果我们在dev分支执行merge test会执行fast forward:
1 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (test) 2 $ git checkout dev 3 Switched to branch 'dev' 4 5 Administrator@CeaserWang MINGW64 /e/Study/git_rebase (dev) 6 $ git merge test 7 Updating 3d74c2e..9dcfcec 8 Fast-forward 9 test.txt | 4 ++-- 10 1 file changed, 2 insertions(+), 2 deletions(-)
我们用gitk看一下提交历史:
他的整个提交历史是一条直线
总的来说rebase的操作是将分叉的情况形成一条直线,但是会修改git的提交历史。
将test的提交应用到dev:
1、git checkout test
2、git rebase dev 以dev为基准将test的提交进行回放,挨个的应用到dev上去,然后test的那些提交就会废弃。
等价于git merge dev
git merge 和git rebase区别:
merge不会修改提交历史,rebase会修改提交历史。
rebase只应用于本地没有提交的代码,如果应用到已经提交到远程的分支不要应用,不然会非常的麻烦,get merge可以应用于远程分支。
转自:https://blog.csdn.net/wzq6578702/article/details/76736008