Git 命令
git --version : 查看git版本
配置 Git 环境
git config --system
git config --global
git config --local
git config 命令带上 --system、 --global、 -- local 不同的选项,意味着将配置文件放置在不同的地方,同时会读写该文件中的配置变量。system 选项配置文件在 /etc/gitconfig,针对系统上每一个用户及他们的仓库都会使用该配置文件,修改的时候需要使用管理员或超级用户权限。global 选项配置文件在 ~/.gitconfig 或 ~/.config/git/config,只针对当前用户下的仓库。local 选项配置文件在当前仓库的 .git/config,只针对该仓库。如果多个级别的配置文件同时存在,则低级别的会覆盖高级别的配置,例如 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
配置用户名和邮件地址
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
查看配置
git config --list : 查看所有配置
git config user.name : 查看用户名的配置
git config --list --show-origin : 查看配置以及他们所在的文件
由于 Git 会从多个文件中读取同一配置变量的不同值,因此你可能会在其中看到意料之外的值而不知道为什么。 此时,你可以查询 Git 中该变量的 原始 值,它会告诉你哪一个配置文件最后设置了该值:
$ git config --show-origin rerere.autoUpdate
file:/home/johndoe/.gitconfig false
获取 Git 仓库
git init : 在已存在目录中初始化仓库
该命令将创建一个名为
.git
的子目录,这个子目录含有你初始化的Git仓库中所有的必须文件。
git remote add <shortname> <url> : 添加远程 Git 仓库,同时指定仓库名称简写
git clone <url> :克隆现有的远程仓库(url是远程仓库地址,clone 命令会自动将其添加为远程仓库并默认以 “origin” 为简写)
git clone <url> <name> :克隆现有的远程仓库的时候,自定义本地仓库的名字(name是指定的新的目录名)
Git 支持多种数据传输协议,可以使用
https://
协议,也可以使用git://
或 SSH 传输协议,比如user@server:path/to/repo.git
文件的状态变化周期
git status : 查看哪些文件处于什么状态
新文件在之前的提交中没有存在,因此新文件处于
未跟踪
的状态;
git add <newfile>
执行
git add
命令开始跟踪一个文件,此时新文件处于暂存
的状态;git add
命令还可以将已跟踪的文件放在暂存区,以及用于合并时把有冲突的文件标记为已解决状态;
git status -s/--short :查看文件状态的简览
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
未跟踪状态的文件前面有
??
标记,"暂存"状态的文件前面有A
标记,修改过的文件前面有M
标记。输出中有两栏,左栏表示暂存区的状态,右栏表示工作区的状态。 例如,上面的状态报告显示:README
文件在工作区已修改但尚未暂存,而lib/simplegit.rb
文件已修改且已暂存。Rakefile
文件已修,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。
配置忽略文件
.gitignore 文件中可以列出要忽略的文件的模式,这样这些文件就无需纳入 Git 的管理。
$ cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以
.o
或.a
结尾的文件。第二行告诉 Git 忽略所有名字以波浪符结尾的文件。
查看已暂存和未暂存的修改
git diff :查看未暂存的文件改动
git diff --staged/--cached :查看已暂存文件与最后一次提交的文件差异
提交更新
git commit
git commit
命令会启动选择的文本编辑器来输入提交说明;启动的编辑器通过git config --global core.editor
命令设置。
git commit -v :编辑器会输出更详细的 diff 信息
git commit -m <commit message> : 将提交信息与命令放在同一行
git commit -a -m <commit message> : 将所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
步骤,要小心的是,有时会把不需要的文件添加到提交中。
移除文件
git rm <file> : 从已跟踪文件清单中移除,并连带从工作目录中删除指定的文件
git rm -f <file> : 从之前修改过或已经放到暂存区的文件中删除
git rm --cached <file> : 把文件保留在磁盘,但不让 Git 继续跟踪。当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。
git rm 命令后面可以列出文件或者目录的名字,也可以使用
glob
模式
移动文件
git mv <file_from> <file_to> : 重命名文件
查看提交历史
git log : 按时间先后顺序列出所有的提交
git log -p/--patch -<n> : 显示每次提交所引入的差异,限制显示的日志条目数量,例如-2
选项显示最近的两次提交
git log --stat : 显示每次提交的简略统计信息(例如所有白修改的文件以及被修改的文件的哪些行被移除或是添加了)
git log --pretty=oneline : 使用不同于默认格式的方式展示提交历史(例如子选项:oneline
会将每个提交放在一行显示,方便浏览大量提交;另外还有short
、full
、fuller
、format
,format
可以定制记录的显示格式)
git log --pretty=format:"%h - %an, %ar : %s";
format 常用的选项可参考附录
git log --pretty=format:"%h %s" --graph:添加 ASCII 字符串形象地展示你的分支、合并分支
git log --since=2.weeks : 显示最近两周的所有提交(--since
与--until
限制时间长度)
该命令可用的格式十分丰富——可以是类似 "2008-01-15" 的具体的某一天,也可以是类似 "2 years 1 day 3 minutes ago" 的相对日期
git log --author=<John> : 过滤显示指定作者为John的提交记录
过滤出匹配指定条件的提交。用
--author
选项显示指定作者的提交,用--grep
选项搜索提交说明中的关键字。你可以指定多个--author
和--grep
搜索条件,这样会只输出 任意 匹配--author
模式和--grep
模式的提交。然而,如果你添加了--all-match
选项, 则只会输出 所有 匹配--grep
模式的提交。
git log -S function_name : 显示那些添加或删除了该字符串的提交
git log -- <path> : 只输出某些文件或者目录的历史提交记录,需要在最后指定
$ git log --pretty="%h - %s" --author='Junio Hamano' --since="2008-10-01" --before="2008-11-01" --no-merges -- t/
//查看 Junio Hamano 在2008年10月期间,除了合并提交之外的哪一个提交修改了测试文件的提交记录
撤销操作
git commit --amend :重新提交,可以修改提交信息,也可以添加漏掉的未添加的文件(需要提前执行git add <file> 操作),第二次提交会代替第一次提交的结果,最终只会有一个提交
修补提交最明显的价值是可以稍微改进你最后的提交,而不会让“啊,忘了添加一个文件”或者 “小修补,修正笔误”这种提交信息弄乱你的仓库历史
git reset HEAD <file> :取消暂存的文件,即将文件的"暂存"状态转换为"已修改未暂存"状态
git checkout -- <file> :撤销文件的修改,即将文件的"已修改"部分放弃,恢复为上次提交时的样子
记住,在 Git 中任何 已提交 的东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用
--amend
选项覆盖的提交也可以恢复 。 然而任何你未提交的东西丢失后很可能再也找不到了。因此除非你确定不想要对那个文件的本地修改,否则不要使用git checkout
这个命令。
查看远程仓库
git remote : 列出你指定的每一个远程服务器的简写,例如 origin 是默认的克隆的仓库服务器的名字
git remote -v : 显示简写与对应的 URL
git remote show <remote> : 查看某一个远程仓库的更多信息
git remote rename <oldname> <newname> :修改一个远程仓库的简写名
git fetch <remote> :拉取远程仓库的最新信息
必须注意
git fetch
命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
如果你的当前分支设置了跟踪远程分支, 那么可以用git pull
命令来自动抓取后合并该远程分支到当前分支。 这或许是个更加简单舒服的工作流程。默认情况下,git clone
命令会自动设置本地 master 分支跟踪克隆的远程仓库的master
分支(或其它名字的默认分支)。 运行git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
git push <remote> <branch> :推送到远程仓库(推送之前需要先抓取别人在你上次拉取之后提交的工作,将其合并进自己的工作才能推送成功,否则会被拒绝)
git remote remove/rm : 移除一个远程仓库
一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
打标签
git tag (-l/--list): 列出已有的标签(-l/--list是可选的)
git tag -l/--list "v1.8.5*" :只列出跟v1.8.5相关的标签
git brach -a : 查看所有分支
git fetch --prune :更新分支
git checkout -b local-branch origin-branch:创建对应于远程分支的本地分支,同时切换至本地分支
查看命令帮助手册
git help <verb>
git <verb> --help
man git-<verb>
如果不需要全面的手册,只需要可用选项的快速参考,可以使用 -h
选项获得更简明的 "help" 输出:
$ git add -h
usage: git add [<options>] [--] <pathspec>...
-n, --dry-run dry run
-v, --verbose be verbose
-i, --interactive interactive picking
-p, --patch select hunks interactively
-e, --edit edit current diff and apply
-f, --force allow adding otherwise ignored files
-u, --update update tracked files
--renormalize renormalize EOL of tracked files (implies -u)
-N, --intent-to-add record only the fact that the path will be added later
-A, --all add changes from all tracked and untracked files
--ignore-removal ignore paths removed in the working tree (same as --no-all)
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of errors
--ignore-missing check if - even missing - files are ignored in dry run
--chmod (+|-)x override the executable bit of the listed files