1、提交:
git commit
git commit
最终,master 指向C3,如下图所示:
2、新建分支:
创建一个名为newImage的分支,树形结构变为:
git branch newImage
现在往新建的分支中提交一次记录:
git checkout newImage
git commit
状态变化:
3、分支与合并:
在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”,对应两种方式:
1) git merge
将bugFix 合并到 master 上:
从图上可以看出,当新建一个分支的时候,并不会出现分支,只有当master和bugFix分支都有自己修改并进行提交了后,才会在新建分支节点(C1)出现分支。
另外,git merge branch-name: 将branch-name分支修改合并到当前分支(master),bugFix分支不会变动。
2) git rebase
Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。Rebase 的优势就是可以创造更线性的提交历史。
在执行完:git rebase master 后,分支变成了一个更线性的结构,提交记录C3 依然存在,C3’ ** 是我们rebase 到master 分支上C3的副本,而master是还没更新的。(将bugFix rebase 到master 分支上,将master 修改合并到当前分支)
切换到主分支,然后将master 分支更新到最只需要:git rebase bugFix(将master分支rebase到bugFix,将bugFix分支修改合并到master分支) 就可以同步了。由于BugFix 继承master,所以Git只需要简单的把master 分支的引用向前移动到bugFix就行,无需在复制**。
总结:
- 无论使用哪种方式,含义:git rebase/merge branch-name 都是合并分支,只不过两者树形结构不一致,git reabse branch-x: 是将当前分支合并到branch-x上,branc-x指向不变,当前分支会指向合并的最新位置 git rebase 更加线性点;git merge branch-x: 是将branch -x合并到当前分支,当前分支指向合并的最新位置,branch-x指向位置不改变。 这两者从树形结构上看刚好相反。
4、在提交树上移动:
HEAD: 是一个对当前检出记录的符号引用 ---- 也就是指向你正在其基础上进行工作的提交记录。其总是指向当前分支上最近一次提交记录。 大多数修改提交树的Git命令都是从修改HEAD的指向开始的。HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。
cat .git/HEAD # 查看HEAD的指向 引用或者Commit ID
git symbolic-ref HEAD # 若上面查出的是指向引用(分支名),还可以使用此命令指向的Commit ID
1) 分离HEAD:
2) 相对引用:
通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!,介绍以下两种方式:
a 使用^向上移动1个提交记录
b 使用~<num>向上移动多个提交记录,如~3
3) 强制修改分支位置:
git branch -f 分支名 HEAD~x # 强制将master指向HEAD的前x次提交最初位置。
4) 撤销变更:
方式很多,这里主要介绍两种:
a、 git reset
通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样(重置一样,本地仓库是没有C2这条记录的,但是C2所做的变更还在,只是处于未加入暂存区状态,远程不影响)。(适合本地个人分支)
b、git revert
虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!为了撤销更改并分享给别人,我们需要使用 git revert。来看演示:
NOTE: 在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2’ 的状态与 C1 是相同的。(适合远程分支)
4) 整理提交分支:
1、git cherry-picj <提交号>.... # 将一些提交复制到当前所在的位置(HEAD)下面;
2、git rebase -i (--interactive) HEAD~x # 相当于打开一个UI截面,可以做三件事:
> 调整提交记录的顺序(通过鼠标拖放来完成)
> 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
> 合并提交。