git基础总结
在工作目录中初始化新仓库:$ git init
将文件添加到git:
格式:$ git add
举例:
$ git add *.c
$ git add README
提交文件到git:
格式:$ git commit [-m '备注']
举例:$ git commit -m 'initial project version'
设置自己喜欢的编辑软件:默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。
git config --global core.editor
从仓库克隆到本地的命令:
格式:$ git clone [url] [folder_path]
举例:$ git clone git://github.com/schacon/grit.git demo_folder
查看分支:
格式:$ git branch [-a]
举例(所有分支):$ git branch -a
举例(本地分支):$ git branch
检查当前文件状态:$ git status
查看具体修改了什么地方:$ git diff
查看已经暂存起来的文件和上次提交时的快照之间的差异:$ git diff --cached
Git>=1.6.1还允许使用(效果是相同的):$ git diff --staged
git获取帮助
格式:$ git help
举例:要学习config命令可以怎么用,运行:$ git help config
格式:$ git --help
举例:$ git config --help
格式:$ man git-
举例:$ man git-config
按q退出
忽略文件
忽略某些文件:创建.gitignore文件
内容举例:
$ cat .gitignore
*.[oa] #告诉 Git 忽略所有以 .o 或 .a 结尾的文件
*~ #告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本
#此为注释 – 将被 Git 忽略
#忽略所有 .a 结尾的文件
*.a
#但 lib.a 除外
!lib.a
#仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
#忽略 build/ 目录下的所有文件
build/
#会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
#忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt
**\通配符从 Git 版本 1.8.2 以上已经可以使用。
跳过使用暂存区域:$ git commit -a -m ''
移除文件
格式:git rm [] [--] ...
查看git rm具体参数,在命令行输入:$ git rm
删除文件:$ rm grit.gemspec
移除git上的文件的操作:$ git rm grit.gemspec
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项-f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。
要移除跟踪但不删除文件:
$ git rm --cached readme.txt
也可以使用glob模式:
举例:$ git rm log/\*.log
解释:此命令删除所有log/目录下扩展名为 .log 的文件。
举例:$ git rm \*~
解释:会递归删除当前目录及其子目录中所有~结尾的文件。
移动文件
在Git中对文件改名:
举例:$ git mv file_from file_to
解释:
其实,运行git mv就相当于运行了下面三条命令:
$ mv file_from file_to
$ git rm file_from
$ git add file_to
查看提交历史
查看提交历史命令:$ git log
常用命令:
举例:$ git log -p -2
解释:常用-p选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新
仅显示简要的增改行数统计:
$ git log --stat
常用命令:
举例:$ git log --pretty=oneline
解释:常用的--pretty选项,可以指定使用完全不同于默认格式的方式展示提交历史。
--pretty的值有:oneline、short、full 、 fuller和format
oneline将每个提交放在一行显示,这在提交数很大时非常有用。
format:可以定制要显示的记录格式,这样的输出便于后期编程提取分析。
举例:$ git log --pretty=format:"%h - %an, %ar : %s"
常用的格式占位符写法及其代表的意义:
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用-date=选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
其他3项展示的信息或多或少有些不同,请自己动手实践一下看看效果如何。
用oneline或 format 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。在我们之前提到的 Grit 项目仓库中可以看到:
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
git log其他常用的选项及其释义:
-p 按补丁格式显示每个更新之间的差异。
--word-diff 按word diff格式显示差异。
--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(后跟指定格式)。
--oneline --pretty=oneline --abbrev-commit的简化用法。
Git在输出所有提交时会自动调用分页程序(less),要看更早的更新只需翻到下页即可。
另外还有按照时间作限制的选项,比如--since和 --until。下面的命令列出所有最近两周内的提交:
举例:$ git log --since=2.weeks
其他常用的类似选项:
-(n) 仅显示最近的n条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用--all-match选项。否则,满足任意一个条件的提交都会被匹配出来:
例子:
$ git log --pretty="%h - %an, %ar : %s" --author=gitster --after="2008-10-01"
--before="2008-11-01" --no-merges -- t/
撤消操作
修改最后一次提交:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
不小心用git add .全加到了暂存区域,取消已经暂存的文件:git status 的命令输出已经告诉了我们该怎么做:
取消暂存文件使用:git reset HEAD ...
$ git reset HEAD benchmarks.rb
取消对文件的修改,回到之前的状态,git status同样提示了具体的撤消方法
在第二个括号中,我们看到了抛弃文件修改的命令(至少在Git 1.6.1以及更高版本中会这样提示,如果你还在用老版本,我们强烈建议你升级,以获取最佳的用户体验),让我们试试看:git checkout -- ...
$ git checkout -- benchmarks.rb
远程仓库的使用
查看当前的远程库
命令:$ git remote
实现:
克隆项目$ git clone git://github.com/schacon/ticgit.git
$ cd ticgit
$ git remote
显示对应的克隆地址:
$ git remote -v
添加远程仓库
运行git remote add [shortname] [url]
$ git remote
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
现在可以用字符串pb指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行 git fetch pb:
$ git fetch pb
从远程仓库抓取数据
$ git fetch [remote-name]
注意:需要记住,fetch命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
常用:
从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
$ git pull
推送数据到远程仓库
命令:git push [remote-name] [branch-name]
例子:
$ git push origin master
或者
$ git push
查看远程仓库信息
命令:git remote show [remote-name]
例子:
$ git remote show origin
* remote origin
URL: git@github.com:defunkt/github.git
Remote branch merged with 'git pull' while on branch issues
issues
Remote branch merged with 'git pull' while on branch master
master
New remote branches (next fetch will store in remotes/origin)
caching
Stale tracking branches (use 'git remote prune')
libwalker
walker2
Tracked remote branches
acl
apiv2
dashboard2
issues
master
postgres
Local branch pushed with 'git push'
master:master
它告诉我们,运行git push时缺省推送的分支是什么(译注:最后两行)。它还显示了有哪些远端分支还没有同步到本地(译注:第六行的 caching 分支),哪些已同步到本地的远端分支在远端服务器上已被删除(译注:Stale tracking branches 下面的两个分支),以及运行 git pull 时将自动合并哪些分支(译注:前四行中列出的 issues 和 master 分支)。
远程仓库的删除和重命名
修改远程仓库在本地的简称:
格式:git remote rename
例子(想把pb改成 paul):
$ git remote rename pb paul
$ git remote
注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的pb/master分支现在成了 paul/master。
删除对应的远端仓库,可以运行git remote rm命令:
$ git remote rm paul
打标签
列显已有的标签:
$ git tag
注意:显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。
筛选标签:
$ git tag -l 'v1.4.2.*'
新建标签
一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
轻量级的(lightweight)
创建标签:
$ git tag v1.4-lw
$ git tag
查看标签版本信息:$ git show v1.4-lw
含附注的(annotated)
创建标签:用-a(译注:取 annotated 的首字母)指定标签名字即可:
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
而-m选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明
查看相应标签的版本信息,并连同显示打标签时的提交对象:
$ git show v1.4
签署标签
如果你有自己的私钥,还可以用GPG来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可:
$ git tag -s v1.5 -m 'my signed 1.5 tag'
查看标签版本信息:$ git show v1.4
验证标签
使用git tag -v [tag-name](译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:
$ git tag -v v1.4.2.1
若是没有签署者的公钥,会报告类似下面这样的错误:
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'
后期加注标签
你甚至可以在后期对早先的某次提交加注标签。比如在下面展示的提交历史中:
$ git log --pretty=oneline
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
在提交“updated rakefile” 后为此项目打上版本号 v1.2
补标签:$ git tag -a v1.2 9fceb02
列显已有的标签:$ git tag
查看相应标签的版本信息,并连同显示打标签时的提交对象:$ git show v1.2
分享标签
运行git push origin [tagname]
描述:
默认情况下,git push并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:
$ git push origin v1.5
要一次推送所有本地新增的标签上去:
$ git push origin --tags
技巧和窍门
自动补全
如果你用的是Bash shell,可以试试看 Git 提供的自动补全脚本。下载 Git 的源代码,进入 contrib/completion 目录,会看到一个 git-completion.bash 文件。将此文件复制到你自己的用户主目录中(译注:按照下面的示例,还应改名加上点:cp git-completion.bash ~/.git-completion.bash),并把下面一行内容添加到你的 .bashrc 文件中:
source ~/.git-completion.bash
也可以为系统上所有用户都设置默认使用此脚本。Mac上将此脚本复制到 /opt/local/etc/bash_completion.d 目录中,Linux 上则复制到 /etc/bash_completion.d/ 目录中。这两处目录中的脚本,都会在 Bash 启动时自动加载。
如果在Windows上安装了 msysGit,默认使用的 Git Bash 就已经配好了这个自动补全脚本,可以直接使用。
实例:
$ git co
commit config
此例中:
linux中键入 git co 然后连按两次 Tab 键,会看到两个相关的建议(命令) commit 和 config。继而输入 m 会自动完成 git commit 命令的输入。
windows中键入 git co 然后连按两次 Tab 键,会看到命令在变,选择相应的命令即可。
实例:
比如运行git log的时候忘了相关选项的名字,可以输入开头的几个字母,然后敲 Tab 键看看有哪些匹配的:
$ git log --s
Git命令别名
取别名
例子:
$ 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 commit只需键入 git ci 即可
比方说取消暂存文件时的输入比较繁琐,可以自己设置一下:
$ git config --global alias.unstage 'reset HEAD --'
这样一来,下面的两条命令完全等同:
$ git unstage fileA
$ git reset HEAD fileA
还经常设置last命令:
$ git config --global alias.last 'log -1 HEAD'
看最后一次的提交信息,就变得简单多了:
$ git last
我们希望运行某个外部命令,而非Git的子命令,这个好办,只需要在命令前加上 ! 就行。如果你自己写了些处理 Git 仓库信息的脚本的话,就可以用这种技术包装起来。作为演示,我们可以设置用 git visual 启动 gitk:
$ git config --global alias.visual '!gitk'