Git常用命令汇总

关于

这里汇集了git常用命令和用法,便于速查,不定期更新。

提交

打tag

将当前版本添加tag<tagname>

git tag <tagname>

列出标签

$ git tag
v0.1
v1.3

$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4

将tag推送到远程服务器,参见[1-2],推送所有的tags

git push --tags

只推送单个tag

git push origin <tagname>
  1. http://stackoverflow.com/a/5195913/4349983
  2. https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE

分支

## 创建dev分支
git branch dev
## 切换到dev分支
git checkout dev
## 上述两条命令也可以合并为一条
git checkout -b dev

## 在dev分支作修改后,再切换回master分支
git checkout master
## 还可以创建多个其他分支
git checkout -b issu35
git checkout -b issu37
## 在master分支中,合并dev分支
## 可与选择只合并某一个分支
git merge issu35  
## 合并后,可以删除issu35分支
git branch -d issu35
## 如果合并分支时,发生冲突,解决冲突后再合并
## 可以通过命令查看冲突的地方
git status

.gitignore文件

文件 .gitignore 的格式规范如下:

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。

我们再看一个 .gitignore 文件的例子:

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt

A **/ pattern is available in Git since version 1.8.2.

如果不小心把文件加到缓存区,可以先通过如下命令删除,然后再将模式加到.gitignore文件中。
使用git rm--cached参数。后面可以列出文件或者目录的名字,也可以使用 glob 模式。

git rm --cached readme.txt
git rm log/\*.log

注意到星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。类似的比如:

$ git rm \*~

会递归删除当前目录及其子目录中所有 ~ 结尾的文件。

强大的分支

创建分支

创建dev分支:

git branch dev

git的分支实际上是一个指针,指向一个提交的对象!
git有一个HEAD指针,指向当前分支指针的指针!
可以通过git checkout dev命令将HEAD指针指向dev分支。

可以合并创建和切换分支为一条指令git checkout -b dev.

由于git创建分支非常快,只是写入42字节到文件!所以可以频繁地使用分支!

分支合并

使用git merge other-branch 合并分支:

fast-forward模式:如果其中当前分支是另一个分支的上游,那么git会简单的将当前分支对应的指针移动到另一个分支所指向的commit对象!
非常快!

正常合并:当前分支不是另一个分支的祖先,那么git会将当前分支快照和另一个分支的快照,以及两者最近共同祖先,进行三方合并!
最后创建一个新的快照,将当前分支指针指向它!

合并冲突:手动修复冲突后,重新提交!

分之合并的图形化工具:git mergetool

删除分支

分支的删除:git branch -d one-branch

分支管理

远程分支

Hook

.git/hooks/ 目录下的可执行脚本,支持bash, ruby, python等。

常见案例汇总

  1. 已经在本地有个仓库了,怎么关联到远程仓库地址 git@github.com:xxxx/xx.git
git remote add origin  git@github.com:xxxx/xx.git

这里 origin 代表远程仓库的名字

  1. 如何合并远程分支 branch1 到本地分支 branch2
$git fetch origin branch1
From github.com:tracholar/wiki
 * branch            master     -> FETCH_HEAD

$git merge FETCH_HEAD

FETCH_HEAD 是一个特殊的临时分支,这两个操作可以合并到一个操作

git pull origin branch1

注意,以上操作都是在本地分支 branch2 上操作!

  1. 远程仓库太大,只想获取master分支最后一次提交的代码,怎么操作?
git clone git@github.com:xxxx/xx.git  --depth=1 --branch=master --single-branch

--depth=1 表示克隆深度为1,即只克隆最后一次提交的结果, --branch=master 表示克隆主分支, 还要加上 --single-branch 参数,才会只克隆单一分支!

但是, 在 git 1.7.10之前的版本不支持 --single-branch 选项,可以采用如下方式(参考so上问题How do I clone a single branch in Git?)

# 创建一个用于存放代码的目录
mkdir code_dir
cd code_dir

# 初始化一个空的本地git仓库
git init .

# 将本地仓库关联上远程仓库
git remote add origin git@git.xx.xx

# 拉取远程分支 branch1 到本地分支 branch1 
git fetch origin branch1:branch1 

# 如果你只需要最后一次提交的结果,同样可以加上 --depth=1 这个参数
git fetch origin branch1:branch1 --depth=1
  1. 回滚远程代码
# 回滚本地代码到特定commit
git reset --hard <commit_id>
# 强制推送到远程
git push -f origin <branch>