Git命令
通用命令
git 提交
add
是从本地工作空间提交到缓冲区,可用git status查看
可用git reset HEAD回退撤销
commit
是从缓冲区提交到本地的仓库,等待与远程仓库同步
push
是从本地仓库,同步到远程仓库。
git下载
clone
git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。git clone [url]
fetch 取来;带来
从远程获取代码库
从远端仓库提取数据并尝试合并到当前分支
pull 远程刷新
下载远程仓库代码并合并
checkout 本地刷新
刷新本地仓库代码并合并
当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。
这个操作很危险,会清除工作区中未添加到暂存区的改动。
git 分支管理
checkout 离开-切换分支
如果你想创建一个新的分支同时切换到新创建的分支的话,可以通过 git checkout -b <your-branch-name> 来实现。
git branch (branchname) //创建分支
git checkout (branchname) //切换分支
git commit
或者一句话
git checkout -b <your-branch-name> //创建+切换
//创建新分支并立即切换到该分支下,从而在该分支中操作
checkout 也改变了分支当前分支的指向
merge 合并,结合
git branch 没有参数时,会列出你在本地的分支。
$ git branch
* master //*代表当前分支。
git merge <branchname>
删除分支命令:
git branch -d (branchname)
合并到branchname分支
Rebase 重新设置基线
Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。将你的当前分支重新设置开始点。这个时候才能知道你当前分支于你需要比较的分支之间的差异。
Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
git rebase master
现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。
注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 master 分支上的 C3 的副本。
切换到了 master 上。把它 rebase 到 bugFix 分支上……由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。
git rebase bugFix
HEAD
我们首先看一下 “HEAD”。 HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 总是指向当前分支上最近一次提交记录 。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看
分离的 HEAD
分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:
git checkout 哈希值(圈内)
想完成此关,从一个 分支中分离出 HEAD 并让其指向一个提交记录。通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。通过指定提交记录哈希值的方式在 Git 中移动不太方便,所以你就不得不用 git log 来查查看提交记录的哈希值。
相对引用
通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!
相对引用非常给力,这里我介绍两个简单的用法:
- 使用
^向上移动 1 个提交记录 - 使用
~<num>向上移动多个提交记录,如~3
git checkout [分支名]^
如果你想在提交树中向上移动很多步的话,敲那么多 ^ 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 ~。
该操作符后面可以跟一个数字(可选,不跟数字时与 ^ 相同,向上移动一次),指定向上移动多少次。咱们还是通过实际操作看一下吧
强制修改分支位置
你现在是相对引用的专家了,现在用它来做点实际事情。
我使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。例如:
git branch -f master HEAD~3
上面的命令会将 master 分支强制指向 HEAD 的第 3 级父提交。
相对引用为我们提供了一种简洁的引用提交记录 C1 的方式, 而 -f 则容许我们将分支强制移动到那个位置。
撤销变更
在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。我们这个应用主要关注的是后者。
主要有两种方法用来撤销变更 —— 一是 git reset,还有就是 git revert。
git reset
git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
git reset HEAD~1
Git 把 master 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。(注:在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。)
git revert
reset“改写历史”的方法对大家一起使用的远程分支是无效的哦!
为了撤销更改并分享给别人,我们需要使用 git revert。来看演示:
git revert HEAD
奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1是相同的。
revert 之后就可以把你的更改推送到远程仓库与别人分享啦。
cherry-pick
git cherry-pick c2 c4
只需要提交记录 C2 和 C4,所以 Git 就将被它们抓过来放到当前分支下了。
交互式的 rebase
交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i
如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。
灵活使用
本地栈式提交
要让 Git 复制一个提交记录
git rebase -igit cherry-pick

浙公网安备 33010602011771号