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