git在安装之后,需要掌握一些基本指令用于对git的使用。本文开始记录一些git的基本常见指令。
查看哪些文件处于什么状态
git status
如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
$ git status
On branch master
Your branch is up-to-date with ‘origin/master’.
nothing to commit, working directory clean
现在的工作目录相当干净。当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。
在工作区所做的修改,添加之类的操作,结束之后向暂存区提交,需要使用指令:
git add 文件路径
将文件添加到暂存区,可以就可以对该文件进行跟踪。也可以将一个目录添加到暂存区,使用指令
git add 目录路径
git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
尚未暂存的文件更新了哪些部分,不加参数直接输入:
git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
尚未暂存的文件,指只在工作区做了修改,没有通过git add指令来向暂存区添加的文件。
若文件已经添加到暂存区,可以用 :
git diff --staged
git diff --cached
这两条命令将比对已暂存文件与最后一次提交的文件差异。–staged 和 --cached 是同义词。
请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件,运行 git diff 后却什么也没有,就是这个原因。
这里的git diff后面也可以跟文件名或者完整的文件路径名。
git diff 文件名或者文件路径名
git diff 文件名或者文件路径名 -staged #不知这个写法对不对,有待尝试
git diff 文件名或者文件路径名 --cached #不知这个写法对不对,有待尝试
现在的暂存区已经准备就绪,可以提交了。 在此之前,请务必确认还有什么已修改或新建的文件还没有 git add 过(向暂存区添加文件), 否则提交的时候不会记录这些尚未暂存的变化。 这些已修改但未暂存的文件只会保留在本地磁盘(没有执行git add指令的便没有被暂存)。 所以,每次准备提交前,先用 git status 看下,你所需要的文件是不是都已暂存起来了, 然后再运行提交命令 git commit:
git commit -m “描述信息”
这里采用将提交信息与指令放在同一行。
提交变动时,需要先将修改添加到暂存区,然后提交到本地仓库,分两步进行,即:
git add -A
git commit -m “描述信息”
但现在可以将者两部合并为一步来实现:
git commit -a -m ‘描述信息’
这样就跳过了使用暂存区域。这是因为 -a 选项使本次提交包含了所有修改过的文件。 这很方便,但是要小心,有时这个选项会将不需要的文件添加到提交中。
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
git rm 文件名或者文件路径名
文件会从暂存区移除,同时在工作目录中也会被删除。
如果把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中,可以使用:
git rm --cached 文件名或者文件路径名
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。下面是一个例子:
$ cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略所有名字以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。
要养成一开始就为你的新仓库设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore 的格式规范如下:
1.所有空行或者以 # 开头的行都会被 Git 忽略。
2.可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
3.匹配模式可以以(/)开头防止递归。
4.匹配模式可以以(/)结尾指定目录。
5.要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号()表示匹配任意中间目录,比如 a//z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
下面是一些例子:
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
将git暂存区的文件进行重命名,可以使用:
git mv 原文件名 新文件名
使用指令:
git blame -L 起始行,终止行 文件的绝对路径