时间 | 更新备注 |
---|---|
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了,如果有冲突的话要在本地解决冲突后,再pus
h。具体做法就是:
1 | git fetch origin |
- 这两步其实可以简化为
1 | git pull origin master |
git-fetch - Download objects and refs from another repository
git-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,常用的命令只需看下面几张图即可: