Git - 常用命令
git init :初始化项目
在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹
git clone :克隆
获取一个URL对应的远程git repo,创建一个local copy
一般的格式为: git clone [url]
clone下来的repo会以URL最后一个斜线后面的名称命名,创建一个文件夹,如果想要指定特定的名称,可以git clone [url] [newname] 指定
git status :查询repo的状态
-s:表示short ,-s的输出标记会有两列,第一列是对staging区域,第二列是对working目录
git log :显示提交历史和分支
--oneline --number:每条log只显示一行,显示number条数
--oneline --number --graph:可以图形化地表示出分支合并历史
[ branchname ] :可以显示特性分支的log
--oneline branch1 ^branch2 : 查看在分支1,却不在分支2中的提交。^:表示排出这个分支(Windows下 ^branch2要加引号)
--decorate: 显示出tag信息
--author=[author name] :指定作者名的提交历史
--since --before --until --after :根据提交时间筛选log
--no-merges :可以将 merge 的 commits 排除在外
--grep :根据 commit 信息过滤 log :git log --grep=keywords
默认情况下,git log --grep --author 是 or 的关系 :满足一条即被返回,如果你想让他们是and的关系,可以加上 --all-match 的option。
-S <string>:filter by introduced diff.
比如:git log -S methodName (注意S和后面的磁之间没有等号分隔符)
-p :show patch introduced at each commit
每一个提交都是一个快照(snapshot),git 会把每次提交的diff计算出来,作为一个patch显示给你看
另一种方法是 :git show [SHA]
--stat : show diff of changes introduced at each commit
同样是用来看改动的相对信息的,--stat 比 -p 输出更简单些
git add
在提交之前,git 有一个暂存区(staging area),可以放入新添加的文件或加入新的改动。commit时提交的改动是上一次加入到staging area中的改动,而不是我们disk上的改动。
add <文件名(绝对路径或相对路径)> :会递归地添加当前工作目录中的所有文件
git diff
不加参数的git diff :show diff of unstaged changes
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用:git diff --cached命令。
--cached :show diff of staged changes
(git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的)
HEAD :show diff of all staged or unstated changes.
也是比较working directory 和上次提交之间所有的改动。
如果想看自从某个版本之后都改动了什么可以用:git diff [ version tag ] 跟log命令一样,diff也可以加上--stat参数来简化输出
git diff [ branchNameA ] [branchNameB] :可以用来比较两个分支
:他实际上会返回一个由A到B的patch,不是我们想要的结果。
一般我们想要的结果是两个分支分开以后各自的改动都是什么,是由命令:git diff [ branchA ] ... [ branchB ] 给出的。实际上他是:git diff $(git merge-base [branchA] [branchB] ) [branchB]的结果。
git commit :提交已经被add进来的改动
-m :"添加提交信息"
-a : 会先把所有已经 track 的文件的改动add进来,然后提交(有点想SVN的一次提交,不用先暂存)。对于没有 track 的文件,还需要git add一下
-amend :增补提交,会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消。
git rest :撤销更改或提交
这里的HEAD关键字指的是当前分支最末梢最新的一个提交,也就是版本库中该分支上的最新版本。
HEAD :unstage files from index and reset pointer to HEAD
这个命令用来把不小心add进去的文件从staged状态取出来,可以单独针对某一个文件操作 :git reset HEAD --filename (filename前的 -- 也可以不加。)
--soft : 将HEAD移动到特定的提交引用,索引和分段不变。
--hard :unstage的文件并撤消自上次提交以来工作目录中的任何更改。
使用 git reset --hard HEAD <commit 的哈希码>/^HARD 进行一次reset,即上次提交之后,所有staged的改动和工作目录的改动都会消失,还原到上次提交的状态。 这里的HEAD 可以被写成任何一次提交的SHA-1(commit的哈希码)。
不带soft和hard参数的git reset,实际上带的是默认参数mixed。
总结:
--mixed ID :试讲 git 的 HEAD 变了(也就是提交记录变了),但文件并没有改变,(也就是working tree 并没有改变)。取消了commit和add的内容
--soft ID :实际上,是 git reset --mixed ID 后又做了一次git add 。 即取消了commit的内容
--hard ID:是将 git 的 head 变了,文件也变了
改动范围如下:
soft(commit) < mixed (commit + add) < hard (commit + add + local working)
git revert :
反转撤销提交,只要把出错的提交(commit)的名字(reference)作为参数传给命令就可以了。
HEAD :撤销最近的一个提交,git revert 会创建一个反向的新提交,可以通过参数 -n 来告诉git先不要提交
git r m :
file :从 staging 区移除文件,同时也移除工作目录。
--cached :从staging去移除文件,但留在工作目录中。从功能上等同于git reset HEAD,清楚了缓存区,但不动工作目录树。
git clean:从工作目录中移除没有track的文件(没搞懂,最好不用)
-d :表示同时移除目录
-f :表示force,因为在git的配置中,clean.requireForce=true,如果不加-f,clean将会拒绝执行
git mv :(喵喵喵???)
git r m --cached orig;mv orig new;git add new
git stash :把当前的改动压入一个栈。
git stash 将会把当前目录和index中的所有改动(但不包括未track的文件) 压入一个栈,然后留给你一个clean的工作状态,即处于上一次最新提交处
list : 会显示这个栈的list
apply:取出stash中的上一个项目(stash@{0}),并且应用于当前的工作目录。也可以指定别的项目,比如git stash apply stash@{1}。
如果你在应用stash中项目的同时想要删除它,可以用git stash pop
删除stash中的项目:
drop :删除上一个,也可指定参数删除指定的一个项目
clear:删除所有项目
git branch:显示所有分支