git rebase

不解释了,直接练:)

练习

1,我们的项目是一本 git-book,现在我们要去添加一个新文档,介绍一下 Git 的 “仓库”。创建一个分支,执行:

git checkout -b repo-doc

在 git checkout 命令里用了 -b 选项,这样如果要查看的分支不存在,就会给我们创建一个。查看分支,显示当前是在 repo-doc 这个分支上。

  master
* repo-doc

在项目下面新建一个 Markdown 文件:

touch repository.md

做一次提交:

git add .
git commit -m '添加介绍 Git 仓库的文档'

打开 repository.md,在文档里添加一个标题:

# 仓库

再做一次提交:

git commit -am '添加仓库文档的大标题'

2,现在假设项目有个突发状况,可能是一个要立即修复的 bug,或者添加一个功能。不管是什么吧,反正是要立即完成的事儿。先切换回 master 分支:

git checkout master

为修复的 bug,或添加的功能创建一个分支:

git checkout -b 'add-bottom-text'

打开项目下的 resources.md,把文档修改成这样:

# 相关资源 :)
* 宁皓网《Git》课程包

---
by ninghao.net

执行一次提交:

git commit -am '为 resouces.md 添加底部文字'

把 add-bottom-text 合并到 master:

git checkout master
git merge add-bottom-text

再把 add-bottom-text 删除掉:

git branch -d add-bottom-text

现在 master 分支上会有一个来自 add-bottom-text 的提交:

→ git log --oneline --graph

* 40670e5 为 resouces.md 添加底部文字
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

3,修复了 bug,切换回 repo-doc,继续完成仓库文档的编写:

git checkout repo-doc

打开 repository.md,把文档修改成这样:

# 仓库
Repository,仓库,简称 Repo。

做一次提交:

git commit -am '为仓库文档添加一段描述'

查看历史,现在 repo-doc 的历史应该是这样:

 → git log --oneline --graph

* 5db5973 为仓库文档添加一段描述
* 9908ffb 添加仓库文档的大标题
* e8204c5 添加介绍 Git 仓库的文档
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

里面没有刚才合并到 master 上的 add-bottom-text 分支里做的提交:

40670e5 为 resouces.md 添加底部文字

现在,假设仓库文件已经写完了,我们要把它合并到 master 分支上。执行:

git checkout master
git merge repo-doc

合并以后,查看 master 的历史,应该像这样:

→ git log --oneline --graph

*   cee6891 Merge branch 'repo-doc'
|\  
| * 5db5973 为仓库文档添加一段描述
| * 9908ffb 添加仓库文档的大标题
| * e8204c5 添加介绍 Git 仓库的文档
* | 40670e5 为 resouces.md 添加底部文字
|/  
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

4,git reflog

→ git reflog

cee6891 HEAD@{0}: merge repo-doc: Merge made by the 'recursive' strategy.
40670e5 HEAD@{1}: checkout: moving from repo-doc to master
5db5973 HEAD@{2}: checkout: moving from master to repo-doc
40670e5 HEAD@{3}: checkout: moving from repo-doc to master
5db5973 HEAD@{4}: commit: 为仓库文档添加一段描述
9908ffb HEAD@{5}: checkout: moving from master to repo-doc
40670e5 HEAD@{6}: merge add-bottom-text: Fast-forward
8d26980 HEAD@{7}: checkout: moving from add-bottom-text to master
40670e5 HEAD@{8}: commit: 为 resouces.md 添加底部文字
8d26980 HEAD@{9}: checkout: moving from master to add-bottom-text
8d26980 HEAD@{10}: checkout: moving from repo-doc to master
9908ffb HEAD@{11}: commit: 添加仓库文档的大标题
e8204c5 HEAD@{12}: commit: 添加介绍 Git 仓库的文档
8d26980 HEAD@{13}: checkout: moving from master to repo-doc

重置到这个状态:

40670e5 HEAD@{6}: merge add-bottom-text: Fast-forward

执行:

git reset 40670e5 --hard

查看 master 上的历史:

 → git log --oneline --graph

* 40670e5 为 resouces.md 添加底部文字
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

又回到了合并 add-bottom-text 分支以后的样子了。

5,git rebase。切换到 repo-doc:

git checkout repo-doc

查看历史:

→ git log --oneline --graph
* 5db5973 为仓库文档添加一段描述
* 9908ffb 添加仓库文档的大标题
* e8204c5 添加介绍 Git 仓库的文档
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

执行:

git rebase master

返回:

First, rewinding head to replay your work on top of it...
Applying: 添加介绍 Git 仓库的文档
Applying: 添加仓库文档的大标题
Applying: 为仓库文档添加一段描述

再查看一下历史:

→ git log --oneline --graph

* e0efae3 为仓库文档添加一段描述
* 2d49d40 添加仓库文档的大标题
* 35e1941 添加介绍 Git 仓库的文档
* 40670e5 为 resouces.md 添加底部文字
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

观察历史跟之前的区别,“为 resouces.md 添加底部文字” 这个提交在 repo-doc 的历史中出现了,我们在 repod-doc 上做的提交都会在这个 “为 resouces.md 添加底部文字” 之上出现。这就是 git rebase 做的事情。

6,合并。再切换到 master 分支,然后执行合并:

git checkout master
git merge repo-doc

返回:

Updating 40670e5..e0efae3
Fast-forward
repository.md | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 repository.md

这回合并是一次 Fast-forward 合并。查看 master 的历史:

→ git log --oneline --graph

* e0efae3 为仓库文档添加一段描述
* 2d49d40 添加仓库文档的大标题
* 35e1941 添加介绍 Git 仓库的文档
* 40670e5 为 resouces.md 添加底部文字
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

对比一下之前我们没在 repo-doc 里做 rebase ,然后直接合并 master 以后的历史:

*   cee6891 Merge branch 'repo-doc'
|\  
| * 5db5973 为仓库文档添加一段描述
| * 9908ffb 添加仓库文档的大标题
| * e8204c5 添加介绍 Git 仓库的文档
* | 40670e5 为 resouces.md 添加底部文字
|/  
*   8d26980 Merge branch 'smiley-face'
|\  
| * 546fc18 在文档中添加笑脸符号
* | 907acdc 在说明文档底部添加内容作者
|/  
* 2b9a260 去掉文档中的笑脸符号

results matching ""

    No results matching ""