/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用 git config
时用 --system
选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用 git config
时用 --global
选项,读写的就是这个文件。.git/config
文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config
里的配置会覆盖/etc/gitconfig
中的同名变量。#
开头的行都会被 Git 忽略。/
)说明要忽略的是目录。!
)取反。 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*
)匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9]
表示匹配所有 0 到 9 的数字)。
我们再看一个 .gitignore
文件的例子:
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
|
(远程仓库名)/(分支名)
这样的形式表示远程分支。checkout
出来的本地分支,称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。在跟踪分支里输入 git push
,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样,在这些分支里运行 git pull
会获取所有远程索引,并把它们的数据都合并到本地分支中来。master
的分支来跟踪 origin/master
。这正是 git push
和 git pull
一开始就能正常工作的原因。
git diff
命令git diff
不过是显示还没有暂存起来的改动,而不是这次工作和上次提交之间的差异。所以有时候你一下子暂存了所有更新过的文件后,运行 git diff
后却什么也没有,就是这个原因。-f
(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。 git log -p -2: -p
选项展开显示每次提交的内容差异,用 -2
则仅显示最近的两次更新
git log --stat: 仅显示简要的增改行数统计
git log --pretty=oneline: 将每个提交放在一行显示,这在提交数很大时非常有用。pretty可选值还有short
,full
和 fuller
git log --pretty=format:"%h - %an, %ar : %s": 定制要显示的记录格式,这样的输出便于后期编程提取分析
如下列出了常用的格式占位符写法及其代表的意义。
选项 说明 %H 提交对象(commit)的完整哈希字串 %h 提交对象的简短哈希字串 %T 树对象(tree)的完整哈希字串 %t 树对象的简短哈希字串 %P 父对象(parent)的完整哈希字串 %p 父对象的简短哈希字串 %an 作者(author)的名字 � 作者的电子邮件地址 � 作者修订日期(可以用 -date= 选项定制格式) %ar 作者修订日期,按多久以前的方式显示 %cn 提交者(committer)的名字 � 提交者的电子邮件地址 � 提交日期 %cr 提交日期,按多久以前的方式显示 %s 提交说明
git log --pretty=format:"%h %s" --graph: 用ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况
下表列出了git log一些其他常用的选项及其释义
选项 说明 -p 按补丁格式显示每个更新之间的差异。 --stat 显示每次更新的文件修改统计信息。 --shortstat 只显示 --stat 中最后的行数修改添加移除统计。 --name-only 仅在提交信息后显示已修改的文件清单。 --name-status 显示新增、修改、删除的文件清单。 --abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 --relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。 --graph 显示 ASCII 图形表示的分支合并历史。 --pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 -(n) 仅显示最近的 n 条提交 --since, --after 仅显示指定时间之后的提交。 --until, --before 仅显示指定时间之前的提交。 --author 仅显示指定作者相关的提交。 --committer 仅显示指定提交者相关的提交。
git branch: 给出当前所有分支的清单
git branch -v: 查看各个分支最后一个提交对象的信息
git branch -r: 查看远程分支
git branch --merged: 查看哪些分支已被并入当前分支(译注:也就是说哪些分支是当前分支的直接上游。)
git branch --no-merged: 查看哪些分支还未被并入当前分支。简单地用 git branch -d
删除未合并分支会提示错误,因为那样做会丢失数据。强制删除需要使用git branch -D。
git branch iss53: 创建一个分支,命名为iss53
git checkout -b iss53: 创建一个分支,命名为iss53,并checkout该分支
此命令相当于执行了如下两个命令:
git branch iss53
git checkout iss53
git checkout -b serverfix origin/serverfix: 在远程分支serverfix的基础上分化出一个新的分支serverfix到本地仓库
git checkout --track origin/serverfix: 效果同上,使用远程分支的名字作为本地分支名
git branch -d branch1: 删除branch1这个分支
git push [远程名] [本地分支]:[远程分支]
,如果省略 [本地分支]
,那就等于是在说“在这里提取空白然后把它变成[远程分支]
”。experiment
)后续的历次提交对象,生成一系列文件补丁,然后以基底分支(也就是主干分支master
)最后一个提交对象为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象,从而改写 experiment
的提交历史,使它成为 master
分支的直接下游client
分支,找出 client
分支和 server
分支的共同祖先之后的变化,然后把它们在 master
上重演一遍。 现在可以快进(fast forward) master
分支了: git checkout master
git merge client
衍和的原则:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
cd existing-project
git init
git add --all
git commit -m"first commit"
git remote add origin http://your_host/your_git_path/your_project.git
git push origin master
cd existing-git-project
git remote add origin http://your_host/your_git_path/your_project.git
git push origin master显然,除了origin我们可以维护多个远端仓库,取名和地址不同就可以了
git clone git://github.com/schacon/grit.git
git clone git://github.com/schacon/grit.git mygritgit
git clone类似与svn checkout,clone形象地表达了Git分布式的特性。上面两个命令的区别是第一个默认创建一个grit目录作为本地仓库,第二个命令手动指定了目录名为mygrit。
Git默认使用origin这个名字来标识你所克隆的原始仓库 。默认情况下 git clone
命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)
一般都是用来将原有项目托管到新版本库时才会用到
cd your_git_project
git rm --cached -r ./
rm -r .git
有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend
选项重新提交:
$ git commit --amend
此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。
启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。
如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend
提交:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
git remote add [shortname] [url]
demo: git remote add pb git://github.com/paulboone/ticgit.git
git push
并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行
git push origin [tagname]
即可。
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'
这样一来,下面的两条命令完全等同:
$ git unstage fileA
$ git reset HEAD fileA
$ git config --global alias.last 'log -1 HEAD'
然后要看最后一次的提交信息,就变得简单多了:
$ git last
git config --global alias.stash-unapply '!git stash show -p | git apply -R'
git config --global core.filemode
false
git config --global core.autocrlf
true
第一句是忽略文件权限的改动。
第二句是将文件checkout时自动把LF转成CRLF,check in 时自动把CRLF转成LF
|
git stash
命令。git stash apply
命令时带上一个 --index
的选项来告诉命令重新应用被暂存的变更。git stash pop:
重新应用储藏,同时立刻将其从堆栈中移走