git-cheetsheet
# cheetsheet
入门级别的git 基础操作,仅仅收录理解了的,常用的命令。负责的命令,在附录的大全里面可以找到
# git config
Git 有三层的配置文件
- 仓库级的配置文件:在仓库的
.git/config
目录下,只对本仓库有效 - 全局级的配置文件:Mac在
~/.gitconfig
目录 - 系统级的配置文件:在Git 的 安装目录下 (经过查找,我的目录为/usr/local/Cellar/git/2.23.0_1/.bottle/etc)
# --local: 仓库级 , --glocal: 全局级 , --system: 系统级
# 添加配置
$ git config --global user.name "Name" # 添加用户名 --global 代表配置的全局的参数
$ git config --global user.email "email@example.com" # 添加邮箱
# 查看配置
$ git config --list/ -l # 查看全部git配置
$ git config --get user.name/user.email # 查看单个配置
# 删除配置
$ git config --unset user.name
# 编辑配置
$ git config -e --global
# 添加别名,对于一些比较长的别名,可以简化
# 也可以通过git config
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
$ git config --global alias.graph "log --graph --oneline"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# git init
$ git init # 创建空的git代码库
$ git init Myfolder # 创建文件夹Myfolder,并创建git代码库
1
2
2
# 文件(增删改提)
# git add 增
# 把指定的文件添加到暂存区中
$ git add <文件路径>
# 添加所有修改、已删除的文件到暂存区中
$ git add -u [<文件路径>]
$ git add --update [<文件路径>]
# 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -A [<文件路径>]
$ git add --all [<文件路径>]
$ git add . # 当前目录(递归子目录)
# 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
$ git add -i [<文件路径>]
$ git add --interactive [<文件路径>]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# git commit 提交
# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息
$ git commit
# 把暂存区中的文件提交到本地仓库中并添加描述信息
$ git commit -m "<提交的描述信息>"
# 把所有修改、已删除的文件提交到本地仓库中
# 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"
# 修改上次提交的描述信息
$ git commit --amend -m "desc"
# 拿372a* 提交的信息(作者、提交者、注释、时间戳等)来提交当前修改
$ git commit -c 372a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# git reset 还原
# 重置暂存区,但文件不受影响
# 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件
# 没有指定 commit ID 则默认为当前 HEAD
# 丢弃暂存区中的所有文件的修改(工作区不受影响)
$ git reset
$ git reset --mixed
$ git reset <文件路径,commit ID>
$ git reset --mixed <文件路径,commit ID>
$ git reset --hard HEAD^ # 回到上一个版本(HEAD: 当前版本,HEAD^: 上一个版本,HEAD~100: 往上100个版本)
$ git reset --hard 1234567 # 回到指定版本号commit id(此处:commit id 假设为1234567******,Git会根据commit id的前几位自动寻找对应的版本)
$ git reset --soft HEAD~ # hard 和 soft 的区别在与 soft(暂存区和工作区中的所有文件的修改都不丢弃)
$ git reset --merge <commit> // 在被污染的工作区中回滚merge或者
$ git reflog # 查看命令历史
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# git revert 反做
# 生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。
$ git revert <commit ID>
1
2
2
比较一下 git revert 和 git reset 的区别:
git reset是把HEAD向后移动来删除提交,而git revert是用一次新的提交来回滚之前的提交(HEAD会继续前进)。下面一幅图比较形象生动。
关于git 的版本回退的问题,廖雪峰的博客:时光穿梭机 (opens new window)已经讲的很好了,我们可以通过git log
查看“当前”版本库的状态,但是如何查看“未来”的版本库呢?可以通过git reflog
查看。
# git remove 删除
$ git rm <文件路径> # 删除工作区文件,若文件在工作区或缓存区中有修改,会失败。有两种解决方式:1、强制删除 2、只删除暂存区的文件
$ git rm -f <文件路径> # 1.无论有没有在工作区或暂存区修改,强制删除
$ git rm --cached <文件路径> # 2.移除暂存区的文件,在本地仓库的文件夹中保留该文件
$ git rm -r <文件夹路径> # 移除文件夹
1
2
3
4
2
3
4
# git diff
# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改
$ git diff
# 比较暂存区中的文件和上次提交时的差异
$ git diff --cached
$ git diff --staged
# 比较当前文件和上次提交时的差异
$ git diff HEAD
# 查看从指定的版本之后改动的内容
$ git diff <commit ID>
# 比较两个分支之间的差异
$ git diff <分支名称> <分支名称>
# 查看两个分支分开后各自的改动内容
$ git diff <分支名称>...<分支名称>
# 可以使用 Beyond Compare4 软件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# * git checkout 恢复
# 当在暂存区中有修改时,使用暂存区中的修改覆盖工作区中的 <文件路径>
# 当不在暂存区中时,使用本地版本库中的HEAD指针处的修改覆盖工作区中的<文件路径>
$ git checkout -- <文件路径>
# 用本地版本库中 HEAD处提交的文件,覆盖 暂存区和工作区的文件
$ git checkout HEAD <文件路径>
# 用本地版本库中 93ef处提交的文件,覆盖 暂存区和工作区的文件
$ git checkout 93ef <文件路径>
# 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响
$ git checkout <文件路径>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
恢复文件举例
a 文件被修改过,checkout 去除修改
$ cat a
Hello world
orphan`
$ git checkout a
Updated 1 path from the index
$ cat a
Hello world
add a line
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# git 日志与文件状态
# git status 状态
# 查看当前所处的分支暂存区和工作区的文件(会显示当前所处分支)
# 注1:处于暂存区的文件状态::staged(已暂存);处于工作区的文件状态::untrack(未跟踪)、modified(已修改)
# 注2:工作区中的空目录不会被git追踪
$ git status
$ git status <branch name>
# 以简短模式查看暂存区和工作区的文件
# 会显示两列,第一列是文件的状态,第二列是对应的文件
# 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中
$ git status -s
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# git log 日志
# 打印所有的提交记录
$ git log
# 打印从第一次提交到指定的提交的记录
$ git log <commit ID>
$ git log -- <文件>
# 打印指定数量的最新提交的记录
$ git log -<指定的数量>
# 高级功能
# 记不住可以设置别名
$ git log -p <文件> # 显示出每次修改的内容
$ --graph # 图形化的方式显示
$ --graph --oneline # 图形化简洁模式
$ --graph --oneline --name-only # 图像化简洁模式(只显示文件名清单)
$ --author = leon # 限定作者leon
$ --grep = "test" # 限定注释
$ --since="2018-10-7" --until='2019-10-12'
# since,until 标记对和 after,before 标记对是等价的
$ --after="2018-10-7" --before='2018-10-12'
$ --since=2.weeks # 最近2周的提交记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# git show 显示修改
# 统计各个提交者的次数
$ git shortlog -sn
# 显示修改内容(详细)
$ git show 3a6c
$ git show HEAD
# 显示最近一次提交的修改内容(不显示具体的修改内容)
$ git show --name-only HEAD
1
2
3
4
5
6
7
2
3
4
5
6
7
# 分支管理
# git branch
# 列出本地的所有分支,当前所在分支以 "*" 标出
$ git branch
# 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出
$ git branch -v
$ git branch -r # 列出所有远程分支 cache
$ git branch -a # 列出所有本地分支和远程分支cache
$ git branch -av # 列出所有本地分支和远程分支cache(含简单说明)
$ git branch -vv # 查看本地分支和远程分支cache的追踪关系
# 创建新分支,新的分支基于上一次提交建立
$ git branch <分支名>
# 修改分支名称
# 如果不指定原分支名称则为当前所在分支
$ git branch -m [<原分支名称>] <新的分支名称>
# 强制修改分支名称
$ git branch -M [<原分支名称>] <新的分支名称>
# 删除指定的本地分支
# 删除的时候需要从被删除的分区切换出去
$ git branch -d <分支名称>
# 强制删除指定的本地分支
$ git branch -D <分支名称>
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream hexo origin:hexo ??
# 如果在本地新建了分支,远程没有分支的情况
$ git branch --set-upstream origin master # 建立联系
$ git branch -vv # 查看本地和远程的追踪关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# git checkout 分支切换
# git 提交流程 工作区-> 暂存区 -> 版本库
$ git checkout <分支名称> # 切换分支
$ git checkout -- <file> # 撤销修改:1. 文件在添加到缓存区前修改,则回退到原工作区状态;2. 文件在添加到缓存区后修改,则回退到原缓存区状态。也即是将<file>撤回到最近一次git add或git commit状态(注:--表示在当前分支,如果没有,则切换到另一个分支)
$ git checkout -b <分支名称> # 创建并切换
$ git checkout --orphan <分支名称># 创建并切换到指定的分支,删除所有的提交记录
$ git checkout -# 切换到上一次分支
1
2
3
4
5
6
2
3
4
5
6
# git merge/rebase 分支合并
# 把指定的分支合并到当前所在的分支下
$ git merge <分支名称> # 无冲突时会直接提交
$ git merge --no-commit <分支名称> # 不自动提交
$ git merge --no-ff -m "merge with no-ff" <name> # 合并后的分支有历史记录,而Fast-Forward合并之后,分支没有历史记录
# Fast-Forwar 的合并的方法是指针的移动。
$ git rebase <分支名称> # rebase 能保持清晰的提交记录,但是合并的操作没有记录下来(merge 则是会新建一个提交)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# git tag 标签
在正式版本发布的时候,需要对某一commit做标记📌,使用tag来区分正式发行版本与开发版本
$ git tag -a v1.5.26 -m 'add compress rate' # 新建本地tag
$ git tag # 查看所有tag
$ git show v.1.5.26 # 查看特定 tag
$ git push origin --tags # 提交远端tag
$ git tag -d v1.5.26 # 删除tag
$ git push origin :ref/tags/v1.5.26 #推送空的同名版本到线上,用以删除线上标签
$ git fetch origin tag v1.5.26
1
2
3
4
5
6
7
2
3
4
5
6
7
# git cherry-pick 剪切
git cherry-pick 一般用于切换分支时用到,直接剪切别的分支commit 到本分支上
- [ ] TODO 补充图
$ git cherry-pick (commitID1...commitID2] # 左开右闭
1
# 远程操作
# git clone 克隆
# 克隆文件
# Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快,https 每次推送都必须输入口令。
git clone https://github.com/XXX/learngit.git Yourfilepath # https
git clone git@github.com:XXX/learngit.git ./lesson01 # ssh(推荐)
# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下
$ git clone <远程仓库的网址>
# 指定本地仓库的目录
$ git clone <远程仓库的网址> <本地目录>
# -b 指定要克隆的分支,默认是master分支
$ git clone -b <分支名称> <远程仓库的网址> <本地目录>
# -o 设置远程仓库为origin
$ git clone -o <orgin name> https://github.com/kekec/Test.git
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# git remote
# 列出已经存在的远程仓库
$ git remote
origin
# 列出远程仓库的详细信息,在别名后面列出URL地址
$ git remote -v
$ git remote --verbose
origin https://github.com/kekec/Test.git (fetch)
origin https://github.com/kekec/Test.git (push)
# 添加远程仓库
$ git remote add <远程仓库的别名> <远程仓库的URL地址>
# 修改远程仓库的别名
$ git remote rename <原远程仓库的别名> <新的别名>
# 删除指定名称的远程仓库
$ git remote remove/rm <远程仓库的别名>
# 修改/显示远程仓库的 URL 地址
$ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>
$ git remoter get-url <远程仓库的别名>
# 显示远程仓库的信息(举例)
$ git remote show origin
* remote origin
Fetch URL: https://github.com/kekec/Test.git
Push URL: https://github.com/kekec/Test.git
HEAD branch: master
Remote branches:
master tracked
v3.1 tracked
Local branch configured for 'git pull':
master merges with remote master
Local refs configured for 'git push':
master pushes to master (fast-forwardable)
v3.1 pushes to v3.1 (up to date)
# 可以查看 git pull 和 git push 的具体信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# git fetch
从远程仓库获取最新的版本到本地分支上
# 将远程仓库所有分支的最新版本全部取回到本地
$ git fetch origin
# 将远程仓库指定分支的最新版本取回到本地
$ git fetch orgin master/dev
1
2
3
4
5
2
3
4
5
# * git pull
git pull <远程仓库名> <远程分支名>:<本地分支名>
从远程仓库获取最新版本并合并到本地。
首先会执行 git fetch
,然后执行 git merge
,把获取的分支的 HEAD 合并到当前分支。
# 先执行fetch,然后将远程origin/master分支merge合并到当前分支(最后会更新origin/master, origin/HEAD指针到最新提交)
$ git pull origin master
$ git pull -r origin master # 先执行fetch,然后将远程origin/master分支rebase合并到master分支
$ git pull origin master:dev # 先执行fetch,然后将远程origin/master 分支merge合并到本地dev分支
1
2
3
4
2
3
4
# * git push
把本地仓库的提交推送到远程仓库。
git push <远程仓库的别名> <本地分支名>:<远程分支名>
# 将本地仓库的修改push到origin所指向的远程仓库URL的master分支上,并在.git/config文件中记录当前分支与远程分支master的对应关系
$ git push -u origin master # -u 在第一次push的时候使用即可
$ git push origin -f # 当合入对应的远端仓库有冲突的时候,使用当前分支更新
$ git push origin --all # 推送本地的所有的分支到各自的远端分支
# 删除指定的远程仓库的分支
$ git push <远程仓库的别名> :<远程分支名>
$ git push <远程仓库的别名> --delete/-d <远程分支名>
$ git push origin:dev # 删除远端分支 dev
$ git push origin -d dev # 效果同上
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 存储文件的区块
# 贮藏区 git stash
$ git stash # 将工作区中所有文件的修改备份压栈到储藏区,然后丢弃工作区与暂存区的所有文件的修改。
# 经过试验,git stash 会丢弃已有文件的修改的,不会删除新建的文件。
$ git stash pop # 恢复工作区,并将贮藏区的备份删除
$ git stash list # 查看贮藏区
stash@{0}: WIP on master: 30e5191 add a
$ git stash show -p stash@{0} # 查看栈顶文件的修改
diff --git a/a b/a
index 11817a2..399e9b0 100644
--- a/a
+++ b/a
@@ -1,3 +1,4 @@
Hello world
add a line
+add a line
$ git stash drop # 直接移除储藏区的栈顶处备份(不用于恢复当前分支的工作区)
$ git stash clear # 清除储藏区栈列表
$ git stash apply stash@{0} # 使用stash@{0}来恢复当前分支的工作区,但不移除储藏区中任何备份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 工作区 git clean
$ git clean -nd # 探测工作区中有哪些未追踪状态的文件和目录
$ git clean -fd # 删除工作区中未追踪状态的文件和目录
1
2
2
# 暂存区 git ls-files
$ git ls-files # 查询暂存区中的文件列表(递归子目录)
# 下面是抄的
$ git ls-files -s // 查看暂存区中所有文件的blob数据块信息
$ git ls-files -s -- README.md // 查看暂存区中的README.md文件的blob数据块信息
1
2
3
4
2
3
4
# 打包 git archive
# 将当前master分支所有文件使用zip压缩方式打包到d:/file.zip
$ git archive --format zip --output ./file.zip master
1
2
2
团队合作分支
# TO DO LIST
- [ ] 看完教程git 教程 (opens new window) 补充
# 参考资料
编辑 (opens new window)
上次更新: 2022/04/06, 15:04:00