概念篇
基础篇
1.提交命令
git commit
:暂存仓库(索引仓库)提交到本地仓库的命令
2.合并命令
2.1 创建切换分支
git branch <分支名>
: 创建分支git checkout <分支名>
: 切换到分支git checkout -b <分支名>
:创建新的节点并切换到新的节点- 使用~^使HEAD进行快速移动
-
~选择第几代
-
^选择哪个父记录
-
之后
git commit
时就是提交到分支,如果没有切换分支,就会在master上提交,mater节点就会变成刚刚提交的
2.2 合并分支(merge)
- 场景:当有两个分支时,都是不同的修改内容,此时需要进行合并修改。
git merge <branchname>
:将当前分支合并到branchname
上
- 创建分支并切换提交到新的分支上,
git checkout -b bugFix
git commit
- 切换回原来的分支并进行提交
git checkout master
git commit
- 合并分支
git merge bugFix
2.3 合并分支(rebase)
- 场景:新建的分支经过复制再进行提交,好处是版本提交历史更加清楚
git rebase<branchname>
:将当前分支进行复制并合并到branchname
- 多次rebase使提交记录有序时:从最后一个提交记录开始rebase
- 新建分支并提交
git checkout -b bugFix
git commit
- 切换回master分支并提交
git checkout master
git commit
- 使用rebase命令对“bugFix”进行复制并合并到master
git rebase bugFix
高级篇
3.分离HEAD(项目树上的前后移动)
- 场景:HEAD默认指向分支名,我们使用checkout的命令使HEAD指向某个提交记录
查看HEAD指向:
cat .git/HEAD
HEAD指向一个引用,使用如下命令查看它的指向:git symbolic-ref HEAD
- 切换到某个分支名,并进行checkout某个提交记录
假如现在有一个“bugFix分支,下面有一个叫c4的提交记录”
git checkout c4
4.相对引用
- 场景:相对引用的出现是针对HEAD指向。当真实项目出现的某个提交记录是hash值,hash值过于长。
4.1 相对引用(^ & ~)
- 解决方案:
- 我们只需要输入hash值的前几位就可以。
使用
git checkout <分支名>^
进行向上的移动
使用git checkout HEAD^
进行向上的移动
使用git checkout HEAD^^^
进行向上的三次移动
使用git checkout HEAD ~3
进行向上的三次移动
5.强制分支移动 -f
- 命令解读:
git branch -f master HEAD~3
- 让master强制指向HEAD向上移动3的位置(分支名同理)
6.撤销变更
撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。
6.1 变更一:git reset
通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset
向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!为了撤销更改并分享给别人,我们需要使用 git revert。
命令:
git reset <branch or hash or HEAD>~1
:回退1步;
6.2 变更二:git revert
在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2’ 的状态与 C1 是相同的。
命令:
git revert <branch or hash or HEAD>
移动提交记录
7.整理提交记录
有计划的提交。
7.1 Git Cherry-pick
命令:
git cherry-pick <hash>
: 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上。
注: 只适用于知道hash名
7.2 可交互式的rebase
使用带参数 –interactive 的 rebase 命令, 简写为 -i。如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。
命令:
git rebase -i HEAD~3
对向上三个提交记录进行交互
提交技巧
8.提交技巧
背景: 我们提交了多次记录,如c2,c3。此时我们想修改c2。c3保持不变。
解决:
方案一: 使用 rebase -i
将需要修改记录提出来,对c2进行分离:使用git commit --amend
,之后再使用rebase -i
进行排序。
方案二: 使用git commit --amend
对c2进行分离,再使用git cherry-pick c2' c3
进行分支合并。
9.永久标记(标签)
背景:分支会移动,使用git tag <tag name><branch>
可以永久标记。当有重大版本时可以进行使用。此时HEAD转变成分离状态,不能直接commit。
10.锚点
由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来描述离你最近的锚点(也就是标签),它就是 git describe!
Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。
命令:
git describe <ref>
<ref>
可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。
输出结果:
<tag>_<numCommits>_g<hash>
tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
当 ref 提交记录上有某个标签时,则只输出标签名称
命令解析:
git describe master
输出离master最近的标签和步数、hash。
输出解析:v0_2_gc2
v0为最近的标签,2为与master相差的记录数,hash为最近标签的hash值前几位。
远程命令
11.远程仓库
git clone
命令在真实的环境下的作用是在本地创建一个远程仓库的拷贝(比如从 github.com)。
12.远程分支
在我们的本地仓库多了一个名为 o/master 的分支, 这种类型的分支就叫远程分支。由于远程分支的特性导致其拥有一些特殊属性。远程分支反映了远程仓库(在你上次和它通信时)的状态。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步。
远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在**别的地方(本地仓库)**完成你的工作。更新了远程分支之后)再用远程分享你的工作成果。
<remote name>/<branch name>
:远程仓库默认为 origin,简写为 o 。