本速查表基于 git 2.24 书写, 为必填参数, [param] 为选填参数, 使用前建议先看一遍 Pro Git , 请使用ctrl+f进行搜索。
配置
git config --list [–system|–global|–local] 显示当前配置
git config [–system|–global|–local] 设置参数
git config -e [–system|–global|–local] 编辑配置
git config --global alias. “” 创建别名
git 使用别名
git config --global --unset 移除单个变量
git config --global --unset-all 移除所有变量
- 设置例子
1 2 3 4 5 6 7
| git config --global user.name "cheatsheet" git config --global user.email "cheatsheet@cheatsheet.wang"
git config --global core.editor vim
git config --global color.ui auto
|
1 2 3 4
| git config --global alias.co checkout
git co master
|
1 2 3 4 5 6
| <repo>/.git/config
~/.gitconfig
/etc/gitconfig
|
初始化
-
ssh-keygen -t rsa -C “” 生成ssh-key
-
git init [dir] 从本地初始化
-
git init --bare [dir] 创建本地裸库
-
git clone [dir] 从远程仓库初始化
-
git clone [–branch tag-name/branch-name] [dir] 下载并绑定指定分支
-
git clone --bare [dir] 克隆远程仓库裸库
-
git clone --mirror [dir] 创建镜像仓库
-
git remote set-url 修改远程仓库地址
-
本地仓库初始化
1 2 3 4 5 6 7 8
| mkdir example cd example git init git remote add origin git@gitlab.com:trensy/cheatsheet.git
git pull origin master
git push -u origin master
|
1 2 3
| mkdir example.git cd example.git git init --bare .
|
1 2 3
| git clone --bare git@gitlab.com:trensy/cheatsheet.git git remote add origin git@gitlab.com:trensy/cheatsheet_new.git git push --mirror origin
|
1 2 3 4
| git clone --mirror git@gitlab.com:trensy/cheatsheet.git git remote update git remote add origin git@gitlab.com:trensy/cheatsheet_new.git git push --mirror origin
|
1
| git remote set-url origin git@gitlab.com:trensy/cheatsheet.git
|
分支(branch)
git branch -a 查看本地分支和远程分支
git branch 查看本地所有分支
git branch -r 查看远程所有分支
git branch -vv 展示本地分支关联远程仓库的情况
git checkout -b 新建分支并切换至新分支
git checkout -b 从现有的commit创建一个新分支并切换至新分支
git branch [-f] 新建一个分支,但不切换
git branch [branch-name] [commit-id] 新建一个分支,指向指定commit
git branch 在tag的基础上新建一个分支
git branch <-m|-M> 重命名分支
1 2 3 4
| git branch -m old-branch-name new-branch-name
git branch -M old-branch-name new-branch-name
|
git branch <-d|-D> 删除本地分支
1 2 3 4
| git branch -d branch-name
git branch -D branch-name
|
git branch <-d|-D> -r 删除远程分支
git checkout 切换分支
1 2 3
| git branch -d -r branch-name
git push origin :branch-name
|
1
| git push origin --delete branch-name
|
1 2 3 4 5
| git checkout -b test git push -u origin test ...
git push
|
标签(tag)
git tag 查看标签
git tag 创建命名标签
git tag -a -m 添加一个注解标签
git tag -a -m 给过去提交记录创建标签
git push origin 推送标签到远程仓库
git push origin --tags 推送全部标签
git pull origin --tags 远程拉取标签
git tag -d 删除本地标签
git push origin :refs/tags/ 删除远程标签
查看
git status 查看变更
git status -s 查看变更简单模式
git status --ignored 展示忽略的文件
git log 查看日志
git log --oneline 单行查看日志
git log --stat 显示详细commit历史
git reflog 显示当前分支的最近几次提交
git log <-number> [–pretty] [–oneline] 显示过去几次提交
git log --follow [file] 显示文件版本历史
git blame [file] 显示指定文件是什么人在什么时间修改过
git show [–name-only] 显示commit内容变化
git show [commit-id]:[file] 显示某次提交时,某个文件的内容
git log --grep 过滤&搜索
git log --author 指定作者查询
git log --after=‘’ --until=‘’ 通过日期查找
1
| git log --oneline --after="2019-02-20" --until='2020-02-20'
|
- git grep [branch-name|tag-name] 搜索
1 2
| git grep "Hello" git grep "Hello" v2.5
|
git diff 显示暂存区和工作区的差异
git log -p [file] 显示指定文件相关的每一次diff
git diff --cached [file] 显示暂存区和上一个commit的差异
git diff [first-branch] [second-branch] 显示两次提交之间的差异
git diff HEAD 显示工作区与当前分支最新commit之间的差异
git shortlog -sn 显示所有提交过的用户,按提交次数排序
git diff --shortstat “@{0 day ago}” 显示今天你写了多少行代码
git log --graph --decorate --oneline 绘制分支图
本地库文件操作
-
git add … 添加指定文件到暂存区
-
git add 添加指定目录到暂存区,包括子目录
-
git add . 提交所有修改的和新建的数据暂存区
-
git add -u 提交所有被删除和修改的文件到暂存区
-
git add -A 提交所有被删除、被替换、被修改和新增的文件到暂存区
-
git rm … 同时从工作区和暂存区删除文件
-
git rm --cached … 从暂存区删除文件,但是工作区文件还存在
-
git rm -r 删除文件夹
-
git mv 重命名文件,并添加新文件到暂存区
-
git stash 创建新的临时存储
-
git stash save “” 创建新的临时存储并命名
-
git stash -u/–include-untracked 创建新的临时存储(包含未追踪的更改)
-
git stash list 列出所有的临时存储
-
git stash show 浏览临时存储内容
-
git stash show -p 浏览临时存储差异
-
git stash pop 恢复上一个临时存储 (删除临时存储)
-
git stash apply 恢复上一个临时存储 (保留临时存储)
-
git stash apply stash@{n} 将特定的存储恢复到当前分支 (n = stash列表序号)
-
git stash <pop|apply> stash@{n} 应用特定的临时存储 (n = stash列表序号)
-
git stash drop stash@{n} 删除特定的临时存储 (n = stash列表序号)
-
git stash clear 删除所有的临时存储
-
git commit -m 提交暂存区到本地仓库
-
git commit … -m 提交暂存区的指定文件到本地仓库
-
git commit -am 不需要执行git add命令提交暂存区的指定文件到本地仓库,只是对修改和删除文件有效,新文件还是要 git add
-
git commit --amend [-m] [new-message] 修改提交记录
-
git commit -v 显示要添加到本地仓库所有diff信息
-
将未提交的更改从当前分支移动到其他分支
1 2 3
| git stash git checkout branch2 git stash pop
|
撤销&回滚
git checkout . 恢复所有暂存区文件到工作区(用来撤销工作区所有改动)
git checkout 恢复暂存区文件到工作区(用来撤销工作区文件改动)
git checkout 恢复某个commit的文件到暂存区和工作区
git reset [–mixed | soft | hard | merge | keep ]
1 2 3 4 5
| --mixed (默认模式) 仅重设暂存区,并把 HEAD 指向commit,但是不重设工作区,本地文件修改不受影响。(回退到某个版本,只保留源码,回退commit和index信息) --soft 工作区中的内容不作任何改变,HEAD 指向 commit自从 commit 以来的所有改变都会回退到“暂存区”中。(回退到某个版本,只回退了commit的信息。如果还要提交,直接 commit 即可。) --hard 重设暂存区和工作区 ,从commit以来在工作区中的任何改变都被丢弃,并把 HEAD指向commit。(彻底回退到某个版本,本地的源码也会变为上一个版本的内容。) --keep 保留工作区和HEAD之间差异部分,如果回退的内容与保留的修改存在冲突(有相同文件)则命令会失败。(不常用) --merge 保留暂存区和工作区之间的差异,如果回退的内容与保留的修改存在冲突(有相同文件)则命令会失败。(不常用)
|
git reset 重置HEAD,暂存区与上一次commit保持一致;但工作区不变
git reset --soft 重置HEAD与上一次commit保持一致;暂存区和工作区不变
git reset --hard 重置HEAD,暂存区,工作区与上一次commit保持一致
git reset 重置暂存区的指定文件;但工作区不变
git update-ref -d HEAD 也就是把所有的改动都重新放回工作区,并清空所有的 commit,这样就可以重新提交第一个 commit 了
git diff --name-only --diff-filter=U 展示工作区的冲突文件列表
git reset 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变,指定commit之后的commit将抹除
git reset --soft 重置当前分支的HEAD为指定commit与指定commit一致,暂存区和工作区不变,指定commit之后的commit将抹除
git reset --hard 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致,指定commit之后的commit将抹除
git revert -n 新建一个commit,用来撤销指定commit, 保留该目标commit后面的commit
git clean [-f|d|x] -n 显示将要被删除的文件
git clean 删除工作区未跟踪文件
git clean -d 删除工作区未跟踪文件夹
git clean -f [path] 强制删除
git clean -X -f 删除被.gitignore设置忽略的文件
- 恢复到最近一次commit
1 2
| git reset --hard git clean -df
|
1
| git fetch --all && git reset --hard origin/master
|
1 2 3
| git log git reset --hard 551c2aa git push -f origin master
|
1
| git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
|
合并&冲突
-
git merge [branch-name] 合并一个分支到当前分支,会把被合并分支和你当前分支的commit合并在一起,形成一个新的 commit 提交
-
git rebase [branch-name] 合并一个分支到当前分支,把你当前分支的commit放到被合并分支的最后面
-
git rebase -i HEAD~[num] 将最近num个commit合并成一个(这样推送到远程仓库后只有一个commit,避免污染远端的commit)
-
git pull --rebase 相当于 git fetch + git rebase
-
git checkout [–] 从不同分支拉取当个文件
-
git checkout --theirs [file-name] 表示检出另外分支, 即保存另外分支的改动,丢弃当前分支的改动。冲突时直接使用他人的代码
-
git checkout --ours [file-name] 检出当前分支,即保存当前分支的改动,丢弃另外分支的改动。冲突时直接使用自己的代码
-
git cherry-pick … 将指定的一些commit合并到当前分支
-
git cherry-pick 将所选分支的最近一次提交,转移到当前分支
-
一次合并操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| git checkout dev git rebase master
git add .
git rebase --continue
git rebase --abort
|
git merge与git rebase 使用建议
1 2
| 公共分支使用merge,个人分支使用rebase 本地和远端对应同一条分支,优先使用rebase,而不是merge
|
同步
git fetch 更新远程代码到本地仓库,不会自动合并,后续可以对比本地分支与线上分支的差别
git merge / 把远程下载下来的代码合并到本地仓库
git pull : 拉取远程分支更新到本地仓库,并自动merge
1 2 3 4 5 6
|
git fetch origin master
git diff HEAD FETCH_HEAD git merge origin/master
|
git pull --tags 拉取远程标签
git remote -v 显示所有远程仓库
git remote show 显示某个远程仓库的信息
git remote add 增加一个新的远程仓库,并命名
git push 将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push :refs/for/ 删除指定的远程分支1
git push --delete 删除指定的远程分支2
git push 如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
git push 如果当前分支只有一个远程分支,那么主机名都可以省略
git push -u 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
git push --all 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
git push --force 强制推送到远程主机
git push --tags 推送标签
subtree
git subtree add --prefix= master [–squash] 在父仓库中新增子仓库
git subtree pull --prefix= master [–squash] 拉取更新子仓库
git subtree push --prefix= master 推送子仓库
- 给子仓库添加远程仓库,方便复用子仓库git仓库地址
1 2
| git remote add -f <sub-remote-git> <sub-git-url> git subtree add --prefix=<sub-repository-path> <sub-remote-git> master
|
子模块(submodule)
git submodule add 添加子模块
git submodule foreach git pull [remote-host-name] [remote-branch-name] 更新
git clone --recursive clone 主库和子模块
git submodule init 初始化本地配置文件
git submodule update 检出父仓库列出的commit
- 更新整个仓库
1 2 3
| git pull git submodule init && git submodule update // or git submodule update --init --recursive git submodule foreach git pull origin master // 更新代码时使用
|
1 2 3 4
| git rm --cached sub-repo rm -rf sub-repo 删除 .gitmodules 文件 [submodule "sub-repo"] 相关内容 删除 .git/config 文件 [submodule "sub-repo"] 相关内容
|
大文件管理(lfs)
git lfs track “” 跟踪需要处理哪些文件
git lfs ls-files 可以显示当前被lfs追踪的文件列表
git lfs track 查看现有的文件追踪模式
git lfs untrack “*xx.a” 取消git fls对xx.a的追踪管理
git lfs version 查看当前所用git lfs版本
git lfs pull 从远程仓库拉取大文件
- 安装
1 2
| #详细见 https://github.com/git-lfs/git-lfs#downloading
|
其他
1 2
| #详情见官网下载页 https://git-scm.com/downloads
|
git archive --format=zip > <file_name> 打包
1
| git archive --format=zip master > nb.zip
|
1 2
| git help -a git help add
|
1 2 3 4 5 6
| https://fhefh2015.github.io/Fast-GitHub/ https://ghproxy.com/
vi ~/.gitconfig [url "https://ghproxy.com/https://github.com/"] insteadOf = https://github.com/
|
阅读原文