Git指令学习
1. 主要命令
1. 基础篇
1. Git Commit
#提交记录:提交项目修改内容
git commit "message"
Git提交message格式:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
大致分为三个部分:
- 标题行: 必填, 描述主要修改类型和内容
- 主题内容: 描述为什么修改, 做了什么样的修改, 以及开发的思路等等
- 页脚注释: 放 Breaking Changes 或 Closed Issues
构成:
- type: commit 的类型
- feat: 新特性
- fix: 修改问题
- refactor: 代码重构
- docs: 文档修改
- style: 代码格式修改, 注意不是 css 修改
- test: 测试用例修改
- chore: 其他修改, 比如构建流程, 依赖管理.
- scope: commit 影响的范围, 比如: route, component, utils, build…
- subject: commit 的概述, 建议符合 50/72 formatting
- body: commit 具体修改内容, 可以分为多行, 建议符合 50/72 formatting
- footer: 一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接
#例如
git commit "feat add new"
git commit "fix test error"
2. Git Branch
Git分支:简单的指向某个提交记录
创建分支并不会造成储存或内存上的开销
用于将分支和提交记录结合起来
#新建分支
git branch newBranch
#切换分支
git checkout newBranch
#新建分支并切换
git checkout -b newBranch
3. 分支与合并
#在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”
#没有参数的情况下,merge 是 fast-forward的(Git将 master 分支的指针直接移到 newBranch 的最前方)
#把 newBranch 合并到 master 里
git checkout master
git merge newBranch
#再把 master 分支合并到 newBranch
git checkout newBranch
git merge master
4. Git Rebase
#Rebase:取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去
#创建更线性的提交记录,提交历史异常清晰
#把 newBranch 分支里的工作直接移到 master 分支
git checkout newBranch
git rebase master
#此时原来 newBranch 的提交记录依然存在,而刚才的记录是 Rebase 到 master 分支的副本
#更新master
git checkout master
git rebase newBranch
2. 高级篇
1. 分离HEAD
#HEAD 是一个对当前检出记录的符号引用——也就是指向你正在其基础上进行工作的提交记录。
#HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
#HEAD 通常情况下是指向分支名的(如 newBranch)。在你提交时,改变了 newBranch 的状态,这一变化通过 HEAD 变得可见。
#查看HEAD指向
cat .git/HEAD
#如果HEAD指向的是一个引用
git symbolic-ref HEAD
#从 newBranch 分支中分离出 HEAD 并让其指向一个提交记录。
#通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。
#此处假如 newBranch 分支下的提交记录的哈希值为 X
git checkout X
2. 相对引用
之前的移动方式:
- 通过指定提交记录哈希值的方式在 Git 中移动不太方便,在实际应用时,并没有可视化提交树供其参考
- 所以就不得不用 git log 来查查看提交记录的哈希值
- 哈希值在真是的 Git 世界中会很长(基于 SHA-1,共40位)
- Git 对哈希的处理很智能,只需要提供能够唯一标识提交记录的前几个字符即可
更好的解决办法:相对引用
- 使用
^向上移动 1 个提交记录 - 使用
~<num>向上移动多个提交记录,如~3
1. 操作符(^)
#切换到master的父节点
git checkout master^
#切换到master的第二个父节点
git checkout master^^
将HEAD作为相对引用的参照:
#用HEAD在提交记录中移动
# X 为某个提交记录的哈希值
git checkout X
#此时HEAD在哈希值为 X 的提交记录处
git checkout HEAD^
#此时HEAD在前一个记录的第 1 级父节点处
git checkout HEAD^
#此时HEAD在前一个记录的第 2 级父节点处
git checkout HEAD^
#此时HEAD在前一个记录的第 3 级父节点处
实际用例:
#将HEAD移动到newBranch的第一个父节点
git checkout newBranch^
2. 操作符(~)
在提交树中向上移动多步:~<num>
#HEAD向上移动3步
git checkout HEAD~3
强制修改分支位置:
#使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交
#将 master 分支强制指向 HEAD 的第 3 级父提交
git branch -f master HEAD~3
#也可以通过哈希值强制指向
#将 master 分支强制指向哈希值为 X 的提交
git branch -f master X
3. 撤销变更
在 Git里面撤销变更的方法有很多,和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过那种方法被撤销的)组成
主要的撤销变更方法:
- git reset
- git revert
1. Git Reset
git reset 通过把分支记录回退几个提交记录来实现撤销变更(改写历史)
git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样(跟之前的移动完全不同,之前的移动并不会删除原来的提交记录)(穿越时空,回到过去)
#撤销一次更改
git reset HEAD^
2. Git Revert
使用 git reset 这种 改写历史 的方法对大家一起使用的 远程分支 是无效的
为了撤销更改并分享给别人,需要使用 git revert
#撤销一次更改
git revert HEAD
#这是会多一个新的提交,这个新的提交的更改就是用来撤销之前的更改的,此时的状态与撤销更改的那个提交的上一个住那状态一样
#上面的解释有点绕口,换一种说法:
#假设当前状态为 C2 ,上一个状态为 C1
git revert HEAD
#执行之后出现新的提交C2‘,此时的 C2’ 与 C1 是一样的
3. 移动提交记录
自由修改提交树
1. 整理提交记录
#命令格式
git cherry-pick <提交号>...
#复制其他分支的提交记录:C2和C4到master分支
git checkout master
git cherry-pick C2 C4
2. 交互式的 rebase
-
当知道所需的提交记录和提交记录的哈希值时:用 cherry-pick
-
如果不知道的话,就可以采用交互式 rebase——使用带参数 –interactive 的rebase命令,简写为 -i
-
如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改
-
在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。 考虑到课程的初衷,我弄了一个对话框来模拟这些操作
当 rebase UI界面打开时, 你能做3件事:
- 调整提交记录的顺序(通过鼠标拖放来完成)
- 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
- 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。
#对 HEAD 开始的往前的4个提交进行操作,在 UI 界面中删除、调整顺序
git rebase -i HEAD~4
4. 杂项
Git 技术、技巧与贴士大集合
1. 本地栈式提交
#快速合并分支
#没有参数的情况下,merge 是 fast-forward的(Git将master分支的指针直接移到dev的最前方)
git rebase -i
git cherry-pick
#将其他分支的提交记录(哈希值为C4)合并到 master 分支
git checkout master
git cherry-pick C4
2. 提交的技巧
场景描述:
在 newImage 分支上进行了一次提交,然后又基于它创建了 caption 分支,然后又提交了一次。
此时你想对的某个以前的提交记录进行一些小小的调整
通过下面的方法来克服困难:
- 先用
git rebase -i将提交重新排序,然后把我们想要修改的提交记录挪到最前 - 然后用
git commit --amend来进行一些小修改 - 接着再用
git rebase -i来将他们调回原来的顺序 - 最后我们把 master 移到修改的最前端
git rebase -i HEAD~2
#调整C2和C3的顺序,使C2到最前面
#对C2进行修改
git commit --amend
git rebase -i HEDA~2
#恢复之前C2和C3的顺序
git checkout master
#把master移到修改的最前端(caption)
git rebase caption


