即使每天都使用Git,也无法记住很多命令,所以记录下来方便查阅。

一般来说,只要记住下图中的 6 个命令就能满足日常使用。但是,但是熟练使用,恐怕要记住 60 到 100 个命令。

常用的6个git

Git相关术语

使用Git不可避免会遇到下面几个术语,想要更好地理解Git,就要先熟悉它们。

  • 工作区(Working Directory)
  • 暂存区(Stage/Index)
  • 本地历史仓库(Repository)
  • 远程仓库(Remote)

Git术语

工作区

我们写代码的地方就是工作区,就是在电脑里能看到的目录,我们当前的工作空间。

暂存区

暂存区(stage)就是每次 git add 时,文件的修改存放的地方。

git commit 时就是一次性把暂存区所有修改提交到分支。

本地仓库

我们可以把暂存区的内容提交到我们的本地仓库,又名版本库(Repository),可将其理解成一个目录,该目录下的所有文件都会被 git 管理起来,每个文件的修改、删除、git 都能跟踪,以便随时追踪历史,和还原。

.git 隐藏目录就是 git 的版本库,里面存了很多东西,最重要的就是 stage(index) 暂存区,还有第一个分支 master,以及指向 master 的 HEAD 指针。

工作区和版本库

远程仓库

远程仓库其实就是找一台电脑充当服务器的角色,每天 24 小时开机,其他每个人都从这个远程仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

比如,GitHub、Gitlab 等都属于远程仓库。


下面,举一个形象化的例子来帮助大家理解上面几个概念:

比如我们在逛着某宝:

1、看到了心仪的物品,我们可以把商品添加到购物车(暂存区),我们可能会频繁的添加商品(add)或者移除商品(checkout),在这个过程中我们可以随便嗨,反正还没给钱;

2、接着我们挑的七七八八了,接着我们就要提交我们的订单了,点击提交订单(commit),接着会生成一个商品的订单列表(快照),我们还可以在提交的时候添加点备注信息,比如要什么颜色(commit -m “颜色”),好的,此时订单提交了,但是我们还没支付(Push),我们可以在自己的账户未支付订单列表(本地仓库)中找到我们的这个订单订单(快照),也可以看到自己以前的一些订单记录;

3、再接着我们选择这个还没付款的订单,进行支付(Push),付款完成后,商家(远程仓库)就会收到这个订单,然后发货…

其他重要概念

HEAD 就是当前活跃分支的游标,你现在在哪儿,HEAD 就指向哪儿。

HEAD 是一个指针,总是指向当前分支。仓库版本的回退和追踪都是通过操作 HEAD 指针来完成。

不过 HEAD 并非只能指向分支的最顶端(时间节点距今最近的那个),实际上它可以指向任何一个节点,它就是 Git 内部用来追踪当前位置的东东。

标签

有了 commit id 为什么还要tag?因为 commit id 不好找,tag 是有意义的名字,它与 commit 绑在一起。

其他要点

1、每一次 git commit,都会生成一个 commit id 记录该次提交,Git 都会将它们串成一条时间线,这条时间线就是一个分支。
2、因为创建、合并、删除分支都很快,所以 git 鼓励你使用分支完成某个任务,合并后再删除分支。过程比直接在 master 分支工作更安全,且效果一样。
3、分支策略:master 分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活,干活都在 dev 分支,dev 是不稳定的,到 1.0 发布时,再将 dev 合并到 master 上,由 master 发布新版本。

Git常用命令

1. 仓库相关

新建一个仓库

1
2
3
4
5
# 在当前目录新建一个 Git 仓库
$ git init

# 新建一个目录,并将其初始化为 Git 仓库
$ git init [project-name]

克隆一个仓库

1
2
3
4
5
# 从本地服务器克隆一个仓库
$ git clone /path/to/repository

# 从远程服务器上克隆一个仓库
$ git clone <项目地址> #例如:git clone git@github.com:xxx/xxx.git

查找一个仓库

1
$ git grep "repository"

与远程仓库连接

1
2
3
4
5
# 与远程仓库连接
$ git remote add origin <项目地址>

# 检查所有配置的远程服务器
$ git remote -v

与远程仓库断开连接

1
$ git remote remove origin

2. 配置

Git 的配置文件是 .gitconfig,可以放在用户的主目录(全局配置)下或项目目录下(项目配置)。

显示当前的 Git 配置

1
$ git config --list

编辑 Git 配置

1
$ git config -e [--global]

设置用来提交代码的用户信息

1
2
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

3. 文件操作

添加文件

1
2
3
4
5
6
7
8
9
10
11
12
# 将指定文件添加到暂存区中
$ git add [file1] [file2] ...

# 将指定目录添加到暂存区中,包括子目录
$ git add [dir]

# 将当前目录中的所有文件添加到暂存区中
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

删除文件

1
2
3
4
5
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

改名文件

1
2
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

文件状态

1
2
# 检查文件状态 (那些将要提交或者添加的文件)
$ git status

4. 代码提交

1
2
3
4
5
6
7
8
9
10
11
# 提交暂存区到本地仓库区HEAD但不提交到远程仓库
$ git commit -m "message"

# 提交暂存区的 指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v
1
2
3
4
5
6
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

5. 分支相关

列出分支

1
2
3
4
5
6
7
8
# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

创建新分支

1
2
3
4
5
6
7
8
9
10
11
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

切换分支

1
2
3
4
5
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

删除分支

1
2
3
4
5
6
# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

合并分支

1
2
3
4
5
# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

其他

1
2
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

6. 标签操作

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
# 列出所有tag
$ git tag

# 新建一个tag在当前commit
$ git tag [tag]

# 新建一个tag在指定commit
$ git tag [tag] [commit]

# 删除本地tag
$ git tag -d [tag]

# 删除远程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

7. 查看信息

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

# 显示当前分支的最近几次提交
$ git reflog

8. 远程同步

下载远程仓库的所有变动

1
2
# 下载远程仓库的所有变动
$ git fetch [remote]

显示所有远程仓库

1
2
# 显示所有连接的远程仓库
$ git remote -v

显示某个远程仓库的信息

1
2
# 显示某个远程仓库的信息
$ git remote show [remote]

增加远程仓库

1
2
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

pull

1
2
# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch] # 例如 git pull origin master

push

1
2
3
4
5
6
7
8
# 上传本地指定分支到远程仓库 (推送对该[reomote]仓库[branch]分支所做的变更)
$ git push [remote] [branch] # 例如 git push origin master

# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

# 推送所有分支到远程仓库
$ git push [remote] --all

$ git push origin master中:
origin指的就是远程仓库,也就是本地的代码库托管在Github上的版本

如果字面上理解不了,回顾远程仓库的创建命令

1
2
# 创建远程仓库后,会让git记录远程仓库叫origin
$ git remote add origin https://github.com/xxx/test.git

master只是这个repository中默认创建的第一个branch,可以把 master 换成你想要推送的任何分支。

9. 撤销操作

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
# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

10. 其他

1
2
# 生成用于发布的存档
$ git archive

Github 实例教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 初始化仓库
$ git init

# README.md 文件添加到版本控制
$ git add README.md

# 提交文件到本地缓存,并添加说明
$ git commit -m "first commit"

# 连接远程仓库
$ git remote add origin https://github.com/xxx/test.git

# 将本地仓库缓存的文件提交到远程仓库中
$ git push -u origin master

# 如果你没有配置ssh ,那么在这里需要输入你的github 账户的用户名和密码
  • 如果本地仓库已经绑定别的远程仓库,我们可以用以下命令将其删除相应的仓库信息
1
2
# 该命令是移除本地缓存已有的remote信息
$ git remote remove origin
  • 如果我们remote repo (即远端仓库已经存在了),那么我们只需要执行以下命令就OK了
1
$ git clone https://github.com/xxx/test.git  "you path"

比如我们想储存在 G://test 目录下,那么我们可以输入一下命令

1
$ git clone https://github.com/xxx/test.git  D://test

Github 配置SSH连接

1. 检查是否已经有SSH Key。

1
$ cd ~/.ssh

2. 生成一个新的SSH

1
$ ssh-keygen -t rsa -C "email@github.com" #github注册的邮箱

之后直接回车,不用填写东西。之后会让你输入密码(可以不输入密码,直接为空,这样更新代码不用每次输入 id_rsa 密码了)。然后就生成一个目录.ssh ,里面有两个文件:id_rsa , id_rsa.pub(id_rsa中保存的是私钥,id_rsa.pub中保存的是公钥)

3. 添加ssh key到GitHub/GitLab

在GitHub/GitLab上找到关于SSH keys->add key把id_rsa.pub公钥的内容复制进去就可以了。


参考文档

The Most Basic Git Command List: https://www.tutorialdocs.com/article/git-basic-command-list.html

git概念及工作流程详解: https://www.cnblogs.com/tsingke/p/7350490.html

廖雪峰的git教程: https://www.liaoxuefeng.com/wiki/896043488029600