1. Git简介
Git的功能不多做介绍。
2. 基本操作
2.1 分支管理
2.1.1 创建新分支
git branch <new_branch>
2.1.2 查看远程分支
git branch -a
或者
git branch -r
加上-a参数可以查看本地和远程分支,远程分支会用红色标识出来;加上-r参数只显示远程分支。
2.1.3 创建并签入分支
从当前master分支上创建v1.0分支,命令如下:
git checkout -b v1.0 master
将本地v1.0分支push到远程
git push origin v1.0:v1.0
2.1.4 删除远程分支
在Git v1.7.0版本之后,可以使用这种语法删除远程分支:
git push origin --delete <branchName>
2.1.5 删除不存在对应远程分支的本地分支
假设这样一种情况:
- 我创建了本地分支b1并push到远程分支origin/b1;
- 其他人在本地使用fetch或pull创建了本地的b1分支;
- 我删除了origin/b1远程分支;
- 其他人再次执行fetch或者pull并不会删除他们的本地b1分支,运行git branch -a也不能看出这个branch被删除了,如何处理?
使用下面的命令查看b1的状态:
git remote show origin
结果如下所示:
* remote origin
Fetch URL: git@github.com:xxx/xxx.git
Push URL: git@github.com:xxx/xxx.git
HEAD branch: master
Remote branches:
master tracked
refs/remotes/origin/b1 stale (use ‘git remote prune’ to remove)
Local branch configured for ‘git pull’:
master merges with remote master
Local ref configured for ‘git push’:
master pushes to master (up to date)
这时候能够看到b1是stale的,使用命令:
git remote prune origin
可以将其从本地的版本库中删除。
更简单的方法是使用这个命令,它在fetch之后删除掉没有与远程分支对应的本地分支:
git fetch -p
2.1.6 重命名远程分支
在Git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。
例如下面的例子中,我们需要把devel分支重命名为develop分支:
git branch -av
* devel 752bb84 Merge pull request #158 from Gwill/devel
master 53b27b8 Merge pull request #138 from tdlrobin/master
zrong 2ae98d8 modify CCFileUtils, export getFileData
remotes/origin/HEAD -> origin/master
remotes/origin/add_build_script d4a8c4f Merge branch ‘master’ into add_build_script
remotes/origin/devel 752bb84 Merge pull request #158 from Gwill/devel
remotes/origin/devel_qt51 62208f1 update .gitignore
remotes/origin/master 53b27b8 Merge pull request #138 from tdlrobin/master
remotes/origin/zrong 2ae98d8 modify CCFileUtils, export getFileData
删除远程分支devel:
git push --delete origin devel
重命名本地分支:
git branch -m devel develop
推送本地分支:
git push origin develop
2.1.7 合并分支
将分支v1.0合并到master,操作如下:
git checkout v1.0
git checkout master
git merge v1.0
在当前为master分支的情况下,执行merge命令即可。
2.2 标签管理
2.2.1 列出现有标签
git tag
这个列表是按照字母顺序给出的,其实排名先后跟重要程度没有直接联系。
当然,也可以按照特定表达式搜索某些标签。比如:
git tag -l v.1.2.*
2.2.2 获取远程标签
git fetch origin tag <tagName>
2.2.3 创建标签
在git中有两种最主要的标签:轻量级标签(lightweight)和带注释的标签(annotated)。轻量级标签跟分支一样,不会改变。它就是针对某个特定提交的指针。然后,带注释的标签是git仓库中的对象。它使一组校验和,包含标签名、email、日期、标签信息、GPG签名和验证。一般情况下,建议创建带注释的标签,这样就会保留这些信息,但是如果你只需要临时性标签或者某些原因你不想在标签中附带上面说的这些信息,lightweight标签更合适些。
在git中创建带注释的标签非常简单,运行如下命令即可:
git tag -a release_v1.0_20140930 -m "version v1.0"
可以使用git show命令查看相应标签的版本信息,并连同现实打标签时的提交对象。
git show release_v1.0_20140930
轻量级标签实际上就是存在一个文件中的提交校验和没有附加任何其他信息。创建轻量级标签的方法就是把上面“-a”,“-s”,“-m”和谐选项都去掉。
git tag v1.1
2.2.4 验证标签
使用命令:
git tag -v release_v1.0_20140930
就可以验证一个签名标签了。这个命令会用到GPG来验证签名。前提是:你必须在密钥环中存放着签名者的公钥。
2.2.5 将本地标签推送到远程
git push --tags
2.2.6 删除远程标签
git push origin --delete tag <tagName>
或者
git tag -d <tagName>
git push origin :refs/tags/<tagName>
2.2.7 查看远程标签列表
git ls-remote
2.3 文件管理
现实文件的每一行是在哪个版本最后修改:
git blame filename.c
显示某个文件的每个版本提交信息:提交日期,提交人员,版本号,提交备注(没有修改细节)
git whatchanged charge.lua
2.4 日志
显示某个版本的修改详情
git show 7aee80cd2afe3202143f379ec671917bc86f9771
或者
git log -p 7aee80cd2afe3202143f379ec671917bc86f9771
显示每个版本都修改了哪些文件:
git log --pretty=oneline
显示某个版本的某个文件修改情况
git log --pretty=oneline charge.lua
或者
git show 5aa1be6674ecf6c36a579521708bf6e5efb6795f charge.lua
2.5 配置
用户的git配置文件为~/.gitconfig,常规配置信息如下:
# 设置user
git config --global user.name "robin"
git config --global user.email "robinhuang83@gmail.com"
# 打开配色
git config --global color.ui true
# 设置alias
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
# 列举所有配置
git config -l
MacOSX下我的配置信息如下:
[user]
name = robin
email = robinhuang83@gmail.com
[core]
excludesfile = /Users/robin/.gitignore_global
[difftool "sourcetree"]
cmd = opendiff \"$LOCAL\" \"$REMOTE\"
path =
[mergetool "sourcetree"]
cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
trustExitCode = true
[alias]
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s [%cn] %Cgreen(%cr)%Creset' --abbrev-commit --date=relative
2.6 创建仓库
mkdir myproject
cd myproject
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://git-source/myproject.git
git push -u origin master
2.7 导出干净代码
$git archive --format zip --output "./output.zip" master -0
2.8 有用的命令
2.8.1 放弃本地修改强制更新
git fetch --all
git reset --hard origin/v1.0
git pull
git fetch只是下载远程的库的内容,不做任何的合并;git reset把HEAD指向刚刚下载的最新的版本。
2.8.2 本地分支强制覆盖master分支
git checkout master
git reset --hard origin/master
git reset --hard develop
git push origin master --force
3.统计
3.1 统计某人的代码提交量,包括增加,删除
git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
3.2 统计代码提交量排行
git shortlog -s|sort -r
3.3 统计代码提交量排行前五
git shortlog -s|sort -r|head -n 5
或者
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
3.4 贡献者统计
git log --pretty='%aN' | sort -u | wc -l
3.5 提交数统计
git log --oneline | wc -l