前言
今天发现了一个特别好的网站:Learn Git Branch
接下来,我将通过这个网站继续学习。
一、分支创建与切换
1.1 git commit -m “< your_message >” 从当前分支提交下一记录。
git commit -m "my first commit!"
1.2 git branch < your_branch_name > 在当前位置创建一个新的分支指针。
git bransh newImage
git commit -m "my first branch"
1.3 git checkout < your_branch_name >切换当前分支指针
git checkout newImage
git commit -m "my first other branch commit"
1.4 git checkout -b < your-branch-name >创建一个新的分支同时切换到此分支
git checkout -b bugFix
二、分支的合并
我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。
2.1 git marge < your_branch_name> 合并两个分支时会产生一个有两个父节点的提交记录。
git marge bugFix
git checkout bugFix
git marge main
2.2 git rebase < your_branch_name> 从最近父节点逐个复制版本到另一个分支。
git rebase main
git checkout main
git reabase bugFix
由于 bugFix 继承自 main,所以 Git 只是简单的把 main 分支的引用向前移动了一下而已。
三、指针的移动和分支的修改
在接触 Git 更高级功能之前,我们有必要先学习在你项目的提交树上前后移动的几种方法。
3.1 git checkout < space_Hash> 分离HEAD
指针指向目标Hash值的记录
- HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 默认指向当前分支上最近一次提交记录。- 分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。
在命令执行之前的状态如下所示:
HEAD -> main -> C1
HEAD 指向 main, main 指向 C1
git checkout C1
分离了HEAD指针:HEAD->C1
3.2 git checkout < space+^/~(number)> 使HEAD指向space的相对位置的记录
通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,也并没有可视化提交树供参考,所以不得不用 git log 来查查看提交记录的哈希值。并且哈希值在真实的 Git 世界中也会更长(基于 SHA-1,共 40 位。Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可)
使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。
相对引用非常给力,这里我介绍两个简单的用法:
- 使用 ^ 向上移动 1 个提交记录
- 使用 ~ 向上移动多个提交记录,如 ~3
git checkout main^
git checkout C3
git checkout HEAD^
git checkout HEAD^
git checkout HEAD^
//git check HEAD~3
3.3 git branch -f < your_branch_name> <to_space> 强制修改分支位置
git brach -f main HEAD~3
3.4 git reset < space > 通过回退记录来实现撤销本地代码改动。
git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
git reset HEAD^
Git 把 main 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。
(在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。)
虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!
3.5 git revert < space > 通过添加新版本来换源远程代码的改动
git revert HEAD^
在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2’ 的状态与 C1 是相同的。
总结
命令 | 含义 |
---|---|
git commit -m "<your_message>" | 从当前位置提交下一记录。 |
git branch <your_branch_name> | 在当前位置创建一个新的分支。 |
git checkout -b <your-branch-name> | 创建一个新的分支同时切换到此分支 |
git marge <your_branch_name> | 合并两个分支时会产生一个有两个父节点的提交记录。 |
git rebase <your_branch_name> | 从最近父节点逐个复制版本到另一个分支。 |
git checkout <your_branch_name> | 使HEAD 指针指向当前分支指针 |
git checkout <space_Hash> | 分离HEAD 指针指向目标Hash值的记录 |
git checkout <space+^/~(number)> | 使HEAD 指针指向space的相对位置的记录 |
git branch -f <your_branch_name> <to_space> | 强制修改分支位置 |
git reset <space> | 通过回退记录来实现撤销本地代码改动 |
git revert <space> | 通过添加新版本来换源远程代码的改动 |