1. GIT原理
- 分布式版本控制
 - 直接记录快照,而非差异比较
 - 五个工作区域:工作区,暂存区、本地代码库、本地远程代码库、远程远程代码库
 - 四种文件状态:未修改,已修改、已暂存、已提交,已推送(已推送=未修改)
 
2. GIT操作
2.1 全局配置
| 命令 | 说明 | 
|---|---|
git config -l | 
查看全局配置 | 
git config --global user.name [name] | 
修改用户名 | 
git config --global user.email [email] | 
修改邮箱地址 | 
git config --global core.editor vim | 
修改编译器为 vim | 
git config --global alias.st status | 
status 缩写为 st | 
git config --global alias.co checkout | 
checkout 缩写为 co | 
git config --global alias.br branch | 
branch 缩写为 br | 
git config --global alias.ci commit | 
commit 缩写为 ci | 
2.2 创建代码库
| 命令 | 说明 | 
|---|---|
git init | 
初始化本地代码库 | 
git clone <url> | 
克隆远程代码库 | 
2.3 修改和提交
| 命令 | 说明 | 
|---|---|
git status | 
查看所有文件状态 | 
git status [FILE] | 
查看指定文件状态 | 
git add . | 
提交当前目录所有文件到暂存区 | 
git add [FILE] | 
提交指定文件到暂存区 | 
git commit -m [message] | 
提交暂存区到本地代码库,message代表说明信息 | 
git commit --amend | 
提交暂存区到本地代码库,覆盖上一次提交 | 
git diff | 
查看变更内容,对比工作目录与暂存区 | 
git diff --cached | 
查看变更内容,对比暂存区与本地代码库 | 
git diff master origin/master | 
查看变更内容,对比本地代码库与本地远程代码库,origin代表远程的意思 | 
git mv [old] [new] | 
文件改名 | 
git rm [FILE] | 
删除文件 | 
git rm --cached [FILE] | 
停止跟踪文件但不删除 | 
2.4 查看提交历史
| 命令 | 说明 | 
|---|---|
git log | 
查看代码库日志 | 
git log -p | 
查看代码库日志,同时显示具体修改 | 
git log -2 | 
查看代码库最近两次提交的日志 | 
git log [FILE] | 
查看指定文件的代码库日志 | 
git log --graph --pretty=oneline --abbrev-commit -20 | 
查看代码库日志,简洁有图 | 
git reflog | 
查看操作记录 | 
2.5 版本回撤
| 命令 | 说明 | 
|---|---|
git reset HEAD | 
将文件从暂存区中回退到工作区,git add的反操作 | 
git reset 版本号(前七位) | 
回撤到指定版本 | 
git reset --soft HEAD | 
只改变提交点,工作目录与暂存区中内容都不改变 | 
git reset --hard HEAD | 
回撤到当前版本,撤销工作目录与暂存区中的所有内容 | 
git reset --hard HEAD^ | 
回撤到上一个版本 | 
git reset --hard HEAD^^ | 
回撤到上上一个版本 | 
git reset --hard HEAD~2 | 
回撤到上上一个版本 | 
git chechout [FILE] | 
撤销某一个文件当前的修改 | 
git revert [CommitID] | 
撤销指定的commit,会新增一个commit,将版本改回修改前 | 
git clean -xfd | 
清除所有非GIT跟踪文件,例如编译生成的内容 | 
2.6 分支branch操作
| 命令 | 说明 | 
|---|---|
git branch | 
查看本地分支 | 
git branch -r | 
查看远程分支 | 
git branch -a | 
查看所有分支 | 
git branch [branch-name] | 
新建本地分支,注意不会自动切换,依然停留在当前分支 | 
git branch -d [branch-name] | 
删除分支,注意只能删除已经合并过的分支 | 
git checkout [branch/tag] | 
切换到指定分支,并更新工作区 | 
git checkout -b [branch-name] | 
新建本地分支,并切换到该分支 | 
git tag | 
查看所有本地标签 | 
git tag [tagname] | 
创建标签,基于最新版本提交 | 
git tag -a [tagname] -m [message] | 
创建标签,基于最新版本提交,附带注释信息 | 
git tag -a [tagname] -m [message] [CommitID] | 
创建标签,基于指定的Commit,附带注释信息 | 
git tag -d [tagname] | 
删除标签 | 
git show [tagname] | 
查看指定标签信息 | 
git push origin [tagname]:refs/tags/[tagname] | 
配合Gerrit使用 | 
2.7 合并与衍合
| 命令 | 说明 | 
|---|---|
git merge [branch] | 
合并指定分支到当前分支 | 
git rebase [branch] | 
合并指定分支到当前分支,将当前分支的修改连接在指定分支之后 | 
git fetch [branch] | 
将远程远程库的代码更新到本地远程库 | 
2.8 远程操作
| 命令 | 说明 | 
|---|---|
git remote -v | 
查看远程版本库信息 | 
git remote show [remote] | 
查看指定远程版本库信息 | 
git remote add [remote] [url] | 
添加远程版本库 | 
git fetch [remote] | 
从远程远程库获取代码到本地远程库 | 
git pull [remote] [branch] | 
下载代码及快速合并 | 
git push [remote] [branch] | 
上传代码及快速合并,把所有文件从本地仓库推送进远程仓库 | 
git push [remote]:[branch/tag-name] | 
删除远程分支或标签 | 
git push --tags | 
上传所有标签 | 
3. Gerrit日常开发
- master 常驻分支,要求常驻分支时刻可用
 - feature-XXX 功能分支,新建分支用于开发新功能
 - bugfix-XXX 问题分支,新建分支用于修改问题
 
- 下载版本 BASE_IPC_HI3518EV200_SPC040
git clone & scp - 新建分支
git checkout -b feature-XXX master - 在新分支上完成功能修改和测试验证
git addgit commit -m "XXX" - 将功能合并到master
 
git checkout master切换到master分支git pull --rebase更新代码- 合并操作有如下四种方式:
git merge --no-ff -m "XXXX" feature-XXX/bugfix-XXX
合并修改到master并commit,在master中可以查看到分支的log历史。如果产生冲突,通过git status查看冲突文件,手动解决冲突后git add,git commitgit merge --squash -m "XXXX" feature-XXX/bugfix-XXX
合并修改到master分支并commit,分支的所有修改一次commit到master,无法在master中查看分支的log历史,需要稍后手动git commitgit rebase feature-XXX/bugfix-XXX
合并修改到master分支,master的修改和commit将接在分支修改的末端,合并后log中无法查看到分支的存在git cherry-pick [Commit-ID]....
合并指定的修改到master分支,分支修改会合并到master历史log的末端,如果发生冲突,手动解决冲突后git add,git cherry-pick --continue -m "XXXX"
 git branch -d feature-XXX/bugfix-XXX
删除指定分支
- 上传远程服务器
git push origin master:refs/for/master
上传审核,审核通过后合并到版本机 
常用命令
git log --graph --pretty=oneline --abbrev-commit -20git push origin master:refs/for/master