概念篇
基础篇
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 相对引用(^ & ~)
- 解决方案:
使用 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 。
|