| 时间 | 更新备注 |
|---|---|
| 2018-02-28 | 新建文章 |
| 2018-06-08 | 整理补充 |
| 2019-01-18 | 更新链接 |
目录
- Git 笔记系列(一)—— Git简介
- Git 笔记系列(二)—— Git工作流程
- Git 笔记系列(三)—— Git常用命令-一览
- Git 笔记系列(四)—— Git常用命令-Checkout
- Git 笔记系列(五)—— Git常用命令-Branch
- Git 笔记系列(六)—— Git常用命令-Reset
- Git 笔记系列(七)—— Git常用命令-Rebase
- Git 笔记系列(八)—— Git常用命令-Stash等
- Git 笔记系列(九)—— Git进阶
命令

- workspace: 本地的工作目录。(记作A)
- index:缓存区域,临时保存本地改动。(记作B)
- local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
- remote repository:远程仓库。(记作D)
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。
Git 命令图解

初始化
1 | git init //创建 |
操作
1 | git add <file> // 文件添加,A → B |
撤销操作
1 | git reset <file>//某个文件索引会回滚到最后一次提交, C → B |
分支
1 | git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去 |
冲突处理
1 | git diff //对比workspace与index |
git reset
详细见Git 笔记系列(五)—— Git常用命令-Reset
重置命令(git reset)是Git最常用的命令之一,也是最危险,最容易误用的命令。来看看git reset命令的用法。
用法一:git reset [-q] [<commit>] [--] <paths>...
用法二:git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
上面列出了两个用法,其中<commit>都是可选项,可以使用引用或者提交ID,如果省略 <commit> 则相当于使用了HEAD的指向作为提交ID。
上面列出的两种用法的区别在于,第一种用法在命令中包含路径<paths>。为了避免路径和引用(或者提交ID)同名而冲突,可以在<paths>前用两个连续的短线(减号)作为分隔。
第一种用法(包含了路径<paths>的用法)不会重置引用,更不会改变工作区,而是用指定提交状态(<commit>)下的文件(<paths>)替换掉暂存区中的文件。例如命令git reset HEAD <paths>相当于取消之前执行的git add <paths>命令时改变的暂存区。
第二种用法(不使用路径
git reflog
如果没有记下重置前master分支指向的提交ID,想要重置回原来的提交真的是一件麻烦的事情(去对象库中一个一个地找)。幸好Git提供了一个挽救机制,通过.git/logs目录下日志文件记录了分支的变更。默认非裸版本库(带有工作区)都提供分支日志功能,这是因为带有工作区的版本库都有如下设置:
1 | git config core.logallrefupdates |
查看一下master分支的日志文件.git/logs/refs/heads/master中的内容。下面命令显示了该文件的最后几行。为了排版的需要,还将输出中的40位的SHA1提交ID缩短形式。
1 | tail -5 .git/logs/refs/heads/master |
可以看出这个文件记录了master分支指向的变迁,最新的改变追加到文件的末尾因此最后出现。最后一行可以看出因为执行了git reset –hard命令,指向的提交ID由e695606改变为9e8a761。Git提供了一个git reflog命令,对这个文件进行操作。使用show子命令可以显示此文件的内容。
1 | git reflog show master | head -5 |
使用git reflog的输出和直接查看日志文件最大的不同在于显示顺序的不同,即最新改变放在了最前面显示,而且只显示每次改变的最终的SHA1哈希值。还有个重要的区别在于使用git reflog的输出中还提供一个方便易记的表达式:<refname>@{<n>}。这个表达式的含义是引用<refname>之前第<n>次改变时的SHA1哈希值。
那么将引用master切换到两次变更之前的值,可以使用下面的命令。
重置master为两次改变之前的值。
1 | git reset --hard master@{2} |
HEAD is now at 4902dc3 does master follow this new commit?
重置后工作区中文件new-commit.txt又回来了。
1 | ls |
提交历史也回来了。
1 | git log --oneline |
此时如果再用git reflog查看,会看到恢复master的操作也记录在日志中了。
1 | git reflog show master | head -5 |
git remote
- 添加远程库:
$ git remote add origin - 移除远程库:
$ git remote remove (OrignName) - 查看远程库:
$ git remote -v(–verbose)
git grep查找
git grep -n "要查找的字符串"
- -W 查找函数上下文
- 使用 –count 参数, 只会显示在哪个文件里有几个要查找的字符串, 如下:
git grep --count "(defun format "
src/format.lisp:1
可以使用 $ git help grep 来查看帮助
Git 其他常用命令
Git undo撤销方法
git revert <SHA>git commit --amend -m "Modify last add message"- 撤销本地的修改
git checkout -- <bad filename> - 重置本地的修改
git reset <last good SHA>
Git Merge
使用Xcode的FileMerge合并代码
1 | Tell system when Xcode utilities live: |
- 代码冲突
! [rejected] master -> master (non-fast-forward)的原因以及解决办法:
1 | ! [rejected] master -> master (non-fast-forward) |
操作命令:
- 正确的做法是,在
push之前git fetch origin,将github上的新代码拉下来,然后在本地merge,如果没有冲突就可以push了,如果有冲突的话要在本地解决冲突后,再push。具体做法就是:
1 | git fetch origin |
- 这两步其实可以简化为
1 | git pull origin master |
git-fetch - Download objects and refs from another repositorygit-merge - Join two or more development histories together
Git log
1 | Table 3. 限制 git log 输出的选项 |
- 显示每次提交的diff:
1 | git log -p |
- 按成员的提交历史
1 | git shortlog |
- 在提交的历史改动中查找关键字,
-p代表显示log提交的改动
1 | git log -S"searchKeyWord" -p |
5, 搜索提交的注释
1 | git log --grep=“keyWord” |
- 搜索某个用户的提交
1 | git log --author=“authorName” |
Git diff
通过使用不同的参数调用git diff命令,可以对工作区、暂存区、HEAD中的内容两两比较。下面的这个图,展示了不同的git diff命令的作用范围。


diff: 分支点之间的变化
分支点的继承
当add了change后, git diff是不会显示已经add后的change的,可以制定stage的diff
1 | git diff --staged |
Git 比较不同版本文件差异的常用命令格式:
1 |
|
Git config
Git的配置
- 列出
Git全局配置列表
1 | git config --global --list |
- 列出
Git本地仓库配置列表
1 | git config --local --list |
- 设置用户名,邮箱密码等
1 | git config --global user.name "John Doe" |
- 设置编辑器
1 | git config --global core.editor emacs |
设置git命令 别名
1 | git config --global alias.st status |
Git命令的别名
有些Git的命令很长,如果经常输入就很繁琐,通过设置Git的别名,可以简化输入,提交效率,这里推荐一个Git的别名库,方便使用各种Git命令。
git-extras/Commands.md at master · tj/git-extrasGIT utilities – repo summary, repl, changelog population, author commit percentages and more
Cheatsheet · robbyrussell/oh-my-zsh Wiki
| Alias | Command |
|---|---|
| g | git |
| ga | git add |
| gau | git add -u |
| gaa | git add –all |
| gapa | git add –patch |
| gb | git branch |
| gba | git branch -a |
| gbd | git branch -d |
| gbl | git blame -b -w |
| gbnm | git branch –no-merged |
| gbr | git branch –remote |
| gbs | git bisect |
| gbsb | git bisect bad |
| gbsg | git bisect good |
| gbsr | git bisect reset |
| gbss | git bisect start |
| gc | git commit -v |
| gc! | git commit -v –amend |
| gca | git commit -v -a |
| gca! | git commit -v -a –amend |
| gcan! | git commit -v -a –no-edit –amend |
| gcans! | git commit -v -a -s –no-edit –amend |
| gcam | git commit -a -m |
| gcsm | git commit -s -m |
| gcb | git checkout -b |
| gcf | git config –list |
| gcl | git clone –recursive |
| gclean | git clean -fd |
| gpristine | git reset –hard && git clean -dfx |
| gcm | git checkout master |
| gcd | git checkout develop |
| gcmsg | git commit -m |
| gco | git checkout |
| gcount | git shortlog -sn |
| gcp | git cherry-pick |
| gcpa | git cherry-pick –abort |
| gcpc | git cherry-pick –continue |
| gcs | git commit -S |
| gd | git diff |
| gdca | git diff –cached |
| gdct | git describe –tags git rev-list --tags --max-count=1 |
| gdt | git diff-tree –no-commit-id –name-only -r |
| gdw | git diff –word-diff |
| gf | git fetch |
| gfa | git fetch –all –prune |
| gfo | git fetch origin |
| gg | git gui citool |
| gga | git gui citool –amend |
| ggpnp | git pull origin $(current_branch) && git push origin $(current_branch) |
| ggpull | git pull origin $(current_branch) |
| ggl | git pull origin $(current_branch) |
| ggpur | git pull –rebase origin $(current_branch) |
| glum | git pull upstream master |
| ggpush | git push origin $(current_branch) |
| ggp | git push origin $(current_branch) |
| ggfl | git push –force-with-lease origin |
| ggsup | git branch –set-upstream-to=origin/$(current_branch) |
| gpsup | git push –set-upstream origin $(current_branch) |
| gignore | git update-index –assume-unchanged |
| gignored | git ls-files -v |
| git-svn-dcommit-push | git svn dcommit && git push github master:svntrunk |
| gk | gitk –all –branches |
| gl | git pull |
| glg | git log –stat –max-count = 10 |
| glgg | git log –graph –max-count = 10 |
| glgga | git log –graph –decorate –all |
| glo | git log –oneline –decorate –color |
| glog | git log –oneline –decorate –color –graph |
| glp | _git_log_prettily (git log –pretty=$1) |
| gm | git merge |
| gma | git merge –abort |
| gmt | git mergetool –no-prompt |
| gp | git push |
| gpoat | git push origin –all && git push origin –tags |
| gr | git remote |
| grb | git rebase |
| grba | git rebase –abort |
| grbc | git rebase –continue |
| grbd | git rebase develop |
| grbm | git rebase master |
| grbs | git rebase –skip |
| grbi | git rebase -i |
| grh | git reset HEAD |
| grhh | git reset HEAD –hard |
| grmv | git remote rename |
| grrm | git remote remove |
| grset | git remote set-url |
| grt | cd $(git rev-parse –show-toplevel |
| grup | git remote update |
| grv | git remote -v |
| gsd | git svn dcommit |
| gsps | git show –pretty = short –show-signature |
| gsr | git svn rebase |
| gss | git status -s |
| gst | git status |
| gsta | git stash save |
| gstaa | git stash apply |
| gstd | git stash drop |
| gstl | git stash list |
| gstp | git stash pop |
| gsts | git stash show –text |
| gsu | git submodule update |
| gts | git tag -s |
| gunignore | git update-index –no-assume-unchanged |
| gunwip | git log -n 1 |
| gup | git pull –rebase |
| gvt | git verify-tag |
| gwch | git whatchanged -p –abbrev-commit –pretty = medium |
| gwip | git add -A; git ls-files –deleted -z |
同一台电脑可以有2个git账号(不同网站的)
这种情况下,需要几点注意
1.remote pull push的时候有问题,因为要设置邮箱问题了 pull的时候识别的是邮箱,2个github账号,2个邮箱,我们自然不能使用global的user.email了
1.取消global
1 | git config --global --unset user.name |
2.设置每个项目repo的自己的user.email
1 | git config user.email "xxxx@xx.com" |
之后push pull就木有问题了
备注
生成ssh key
ssh-keygen -m rsa -C "your mail (当前目录) 然后可以命名默认id_rsa或者id_rsa_second 把对应的pub放到公共服务器上。
其他
1 | gitk //开灯图形化git |
Githug
Githug is designed to give you a practical way of learning git. It has a series of levels, each requiring you to use git commands to arrive at a correct answer.
Gazler/githug: Git your game on!
常见命令菜单
Git Cheat Sheet Part1
看了前面那么多命令,是不是有点多了?ㄟ( ▔, ▔ )ㄏ平时开发用的到那么多命令吗?Don`t worry,常用的命令只需看下面几张图即可:

Git Cheet Sheet Part2

