git推荐看廖雪峰的那个教程。入门很快。但是毕竟有些不直观。这时候可以看一下这一篇图解。会有更深的理解。
此页图解git中的最常用命令。如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻。
基本用法
git add files 把工作目录中的文件加入stage缓存git commit 把stage缓存生成一次commit,并加入commit历史git reset -- files 撤销最后一次git add files,你也可以用git reset 撤销所有stage缓存文件git checkout -- files 把文件从stage缓存复制到工作目录,用来丢弃本地修改
你可以用 git reset -p、git checkout -p 或 git add -p进入交互模式,也可以跳过stage缓存直接从commit历史取出文件或者直接提交代码。
git commit -a 相当于运行git add把所有当前目录下的文件加入stage缓存再运行git commit。git commit files 进行一次包含最后一次提交加上工作目录中文件快照的提交,并且文件被添加到stage缓存。git checkout HEAD -- files 回滚到复制最后一次提交。
约定
后文中以下面的形式使用图片:
这张图片里显示最后5次提交,ed4是最新提交。 master分支指向此次提交,另一个maint分支指向祖父提交节点。
命令详解
Diff
有许多种方法查看两次提交之间的变动,下面是其中一些例子。
Commit
提交时,git用stage缓存中的文件创建一个新的提交,并把此时的节点设为父节点。然后把当前分支指向新的提交节点。下图中,当前分支是master。
在运行命令之前,master指向ed4,提交后,master指向新的节点f0cec并以ed4作为父节点。
这样,maint分支就不再是master分支的祖父节点。此时, 或者 是必须的。
Checkout
HEAD标识处于分离状态时的提交操作
当HEAD处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支。你可以认为这是在更新一个匿名分支。 一旦此后你切换到别的分支,比如说master,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了。注意这个命令之后就不会有东西引用2eecb。 但是,如果你想保存这个状态,可以用命令git checkout -b name来创建一个新的分支。
Reset
Merge
merge 命令把不同分支合并起来。合并前,索引必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。
Cherry Pick
cherry-pick命令"复制"一个提交节点并在当前分支做一次完全一样的新提交。
Rebase
rebase是合并命令的另一种选择。合并把两个父分支合并进行一次提交,提交历史不是线性的。rebase在当前分支上重演另一个分支的历史,提交历史是线性的。
本质上,这是线性化的自动的 。 上面的命令都在topic分支中进行,而不是master分支,在master分支上重演,并且把分支指向新的节点。注意旧提交没有被引用,将被回收。
要回滚范围,使用--onto选项。下面的命令在master分支上重演当前分支从169a6以来的最近几个提交,即2c33a。
同样有git rebase --interactive让你更方便的完成一些复杂操作,比如丢弃、重排、修改、合并提交。