http://files.cnblogs.com/lbsx/git-cheat-sheet-large.png.zip


一:综述

    网络上GIT的教材不计其数,CheatSheet也很多。但其编辑思路都是对命令的讲解。一直想要这样一篇CheatSheet:日常使用GIT中,我会遇到哪些Use Case,这些Use Case的优先权是什么,应该用什么GIT命令。出于这个思路,编辑此文.

    本文的目标读者是了解GIT基本概念,但使用GIT还不久 (半年以下),记不得如此多命令,该做事情时不知道该用哪个命令,需要一本速查表的用户。

二:Use Case及命令

所有Use Case按照priority分类排列,但和branch相干的Use Case单列

级别  用例  命令及样例  注释
 P0  复制远端Repository git clone git://git.xxx.com/xxx/xxx.git  也就是下载代码的意思
 P0  下载远端Repository的更新 git fetch 和其他版本管理工具不同,git 中下载的代码在workspace中是看不见的,要merge或rebase后才看的见

P0

 将已经下载的远端repository的更新和本地更新合并 git rebase 或 git merge  建议使用git rebase,因为这样代码历史记录是线性的看的清楚。只有一些特殊情况建议用git merge,比如发生了代码冲突,并且你暂时没有计划向远端repository上传代码
 P0 同时执行下载远端更新及本地合并 git pull 或 git pull --rebase  git pull  = git fetch + git merge
 git pull -- rebase = git fetch + git rebase
 P0  Staging  新建或修改后的代码 git add  git add . 可以staging本目录及子目录下所有改动
 P0  提交代码到本地repository git commit  -m ""  和其他版本管理工具不同,git 中commit的代码只在本地提交,别人是看不见的,要再执行git push后别人才看的见
 P0  上传本地repository的代码到远端repository git push  一般省略参数,亦即推送本branch的代码到origin repository的同名branch
 P0  解决代码合并冲突    建议在 Tortoise Git 或 EGit plugin等工具的图形界面解决,命令行比较复杂
 P0 git 常用全局配置 git config --global user.name 'xxxxx'
 git config --global user.email 'xxxxx'
 git config --global core.autocrlf input
 git config --global push.default upstream
 git config --global branch.autosetuprebase always
 git config --global core.editor vi
 git config --global credential.helper cache
详尽清单请参阅 https://git-scm.com/docs/git-config

如果你想在不同的项目用不同的用户名和邮箱,去掉 --global选项

In Windows platform, use 
git config --global credential.helper wincred
 P1  通知GIT准备删除文件 git rm  
 P1  撤销本地的改动1 git reset [--hard] <文件名> 撤销本地文件的staging状态,变成modified状态,但代码改变仍保留在工作区
 P1  撤销本地的改动2 git checkout --force 撤销本地文件的staging状态,并撤销代码在工作区的改变。
 P1  撤销本地的改动3 git clean -dn  删除本地untraced file。结合git checkout --force,完美撤销本地全部改动
 P1  查看所有更改的代码(文件级别) git status  
 P1  查看所有更改的代码(代码行级别)  git diff  git diff 的结果是标准的diff文件格式
 P2  查看代码更改历史记录  git log  
 P2  查看各分支HEAD的历史记录  git reflog  git reflog可以看见被删除的commit,而git log 不能
 


 P2  配置文本文件回车换行转换模式  git config core.autocrlf=  仅在windows平台下需要配置,Linux平台无需配置。windows平台建议false(需要一个支持linux格式文本的编辑器)
 P3 设定某文件不提交git repository  编辑.gitignore文件  注意:已经在repository的文件会忽略.gitignore文件
 P3 如果某文件已经在git repository,通知git强行忽略对该文件的修改   git update-index --assume-unchanged  
 P3  通知git恢复跟踪对该文件的修改   git update-index --no-assume-unchanged  
 P3  设定pull默认用 rebase 方式  修改 .git/config, 增加 rebase = true   或修改 ~/.gitconfig 增加 autosetuprebase = always  
 P3  查看历史上某次提交的细节  git show  
 P3  创建新的空的repository  git init --bare  
 P3  打标签  git tag  
 P3 查看某行代码的最后作者(即blame)  git blame <-L linea,lineb>
 
 P4  二分法定位引入错误的commit  git bisect

 一般用法

git bisect start
git bisect
git bisect good

 Br  列出所有的本地branch  git branch  "master" branch为主branch, 标*的为当前branch
 Br  列出所有的本地和远端branch  git branch -a  
 Br  切换到某branch开发  git checkout 一般是切换到本地branch
 Br  创建远端branch  三步
git branch
git checkout
git push origin
 
 Br  基于远端branch创建本地branch  git checkout  本命令其实是 git checkout -b --track /的缩写
 Br  删除远端branch  git push origin :  
 Br  合并分支  git merge  
 Br  查看本分支的直接上游分支  git branch --merged  
 Br  查看两个branch之间的变动  git show branchA..branchB  
 Br  查看两个branch之间的变动2  git whatchanged  
 Br  对于https协议的远端repository,缓存密码 git config [--global] credential.helper cache  
 Br  从一个branch中挑一个commit合并到本branch  git cherry-pick  

 

三:工作组通常的代码修改流程(简单提交模型)

 1. 编辑源代码
 2. 建议经常运行 git add 和 git commit 提交代码(一天通常提交几次到十几次)
 3. 手动测试已经提交的代码,直到测试通过。
 4. 运行 git pull. 如果有代码冲突,解决代码冲突,解决完毕再次运行git pull
 5. 提交reviewboard,并且根据反馈修改代码。
 6. 运行pre-commit hudson task,坚持没有break build.
 7. 再次运行git pull,确认在第5到第6步执行阶段没有新的代码冲突产生。
 8. 运行 git push,完成代码的上传。

 

四:标识一个或多个revision

 1. 使用revision的SHA-1值,例 734713bc047d87bf7eac9674765ae793478c50d3
 2. 使用review的SHA-1的一部分,前提是没有歧义  例 724713
 3. HEAD 是一个指向你当前所在分支的引用标识符
 4. HEAD 在五次前的值    HEAD@{5}
 5. HEAD在两个月前的值   HEAD@{2.months.ago}
 6. HEAD的父提交             HEAD^ 或 HEAD~  
 7. HEAD的干爹提交       HEAD^2   //HEAD由A和B merge而成,当时的工作branch为 A上,则HEAD^为A,HEAD^2为B
 8. HEAD的亲爷爷             HEAD~2
 9. 所有在feather上但不在master上的提交         master..feather
 10. 所有在feather或master上之中一个branch存在而另一个branch不存在的提交   master...feather
 11. refspec        在.git/config中有一行 fetch = +refs/heads/*:refs/remotes/origin/*

  * +告诉 Git 在即使不能快速演进的情况下,也去强制更新它
  * 在远端提取 refs/heads下所有内容,写入本地的refs/remotes/origin/
  * 这时,以下三个命令是一致的

  * $ git log origin/master
  * $ git log remotes/origin/master
  * $ git log refs/remotes/origin/master

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐