Git 之一 Git 常用命令

Git 的四个工作区域

ad

Git 初始化本仓库

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
# 创建本地测试库的目录
$ mkdir test_repo
$ cd test_repo

# 初始化本地库
$ git init

# 初始化后的目录结构
$ tree -al ../test_repo
test_repo/
└── .git
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
├── heads
└── tags

Git 配置签名(本地库)

这里的签名仅仅是为了方便标识提交代码的作者身份,并不用于 Git 远程库(Github)的身份认证(例如 Github 登录)

  • 局部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cd git_test

# 查看命令帮助手册
$ git config --help

# 配置仓库级别签名,仅在当前本地库范围内有效
$ git config user.name peter
$ git config user.email peter@gmail.com

# 仓库级别签名配置信息的保存位置
$ cat .git/config
[user]
name = peter
email = peter@gmail.com

# 查看当前仓库级别签名
$ git config --get user.name
$ git config --get user.email

# 重置当前仓库级别签名
$ git config --unset user.name
$ git config --unset user.email
  • 全局
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 配置系统用户级别签名(全局有效)
$ git config --global user.name peter_glb
$ git config --global user.email peter@gmail.com

# 系统用户级别签名配置信息的保存位置
$ cat ~/.gitconfig
[user]
name = peter_glb
email = peter@gmail.com

# 查看系统用户级别签名
$ git config --global --get user.name
$ git config --global --get user.email

# 重置系统用户级别签名
$ git config --global --unset user.name
$ git config --global --unset user.email

# 签名级别优先级说明
# 就近原则,仓库级别签名优先于系统用户级别签名,二者都有时采用仓库级别签名
# 如果只存在系统用户级别签名,则以系统用户级别签名为准
# 二者不允许同时为空

Git 操作新建的文件(本地库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 显示工作区和暂存区的状态
$ git status

# 添加新文件到暂存区,建立文件跟踪
$ git add api.json

# 将新文件从暂存区撤出,取消文件跟踪
$ git rm --cached api.json

# 批量将新文件添加到暂存区
$ git add --all

# 将新文件从暂存区提交到本地库,并指定提交的备注信息
$ git commit api.json -m 'create message'

# 或者批量将新文件从暂存区提交到本地库,并指定提交的备注信息
$ git commit -am "create message"

Git 操作修改过的文件(本地库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 将已提交到本地库,且在本地修改过的文件(未提交到暂存区),直接丢弃工作区的改动还原为修改前的内容
$ git checkout -- api.json

# 将已提交到本地库,且在本地修改过的文件再次提交到暂存区
# 这里可以执行“git commit”直接提交到本地库,省略"git add"操作,但这样就不能从暂存区撤回修改前的内容
$ git add api.json

# 将已提交到本地库,且在本地修改过与提交到暂存区的文件,从暂存区撤出
$ git reset HEAD api.json

# 批量将已提交到本地库,且在本地修改过的文件再次提交到暂存区
# 这里可以执行“git commit”直接提交到本地库,省略"git add"操作,但这样以后就不能从暂存区恢复数据,强烈不建议使用
$ git add --all

# 将已提交到本地库,且在本地修改过与提交到暂存区的文件,再次提交到本地库
$ git commit api.json -m 'update message'

# 批量将已提交到本地库,且在本地修改过与提交到暂存区的文件,再次提交到本地库
$ git commit -am "update message"

Git 忽略追踪已提交过的文件与文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建.gitignore文件
$ touch .gitignore

# 编辑.gitignore文件,然后添加需要被忽略提交的文件或者文件夹的路径
$ vim .gitignore

# .gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中(即已经被commit过),那么通过.gitignore文件是无法实现忽略提交的
# 此时需要先把本地缓存删除(改变成未追踪状态)再重新提交,如文件或者文件夹删除不掉,可以加上 -f 参数强制删除,但是一定要加上 --cached 表示只删除缓冲文件
# 若忽略提交的是文件夹,必须可以加上 -r 参数,表示忽略提交文件夹下的所有文件
$ git rm --cached shop.cpp
$ git rm -f --cached shop.cpp
$ git rm -r -f --cached store/

# 提交
$ git add --all && git commit -am 'Cancel tracking file'

Git 设置代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置当前仓库的HTTP代理
$ git config http.proxy http://192.168.1.122:1080

# 设置全局的HTTP代理
$ git config --global http.proxy 192.168.1.122:1080

#设置当前仓库的Socks5代理
$ git config http.proxy socks5://192.168.1.122:1081

#设置全局的Socks5代理
$ git config --global http.proxy socks5://192.168.1.122:1081

# 取消当前仓库的代理
$ git config --unset http.proxy

# 取消全局的代理
$ git config --global --unset http.proxy

Git 设置用户名、邮箱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看当前仓库的配置信息
$ git config --list

# 查看全局的配置信息
$ git config --list --global

# 设置当前仓库的用户名、邮箱
$ git config user.name clay
$ git config user.email example@qq.com

# 设置全局的用户名、邮箱
$ git config --global user.name clay
$ git config --global user.email example@qq.com

# 取消设置全局的用户名、邮箱
$ git config --global --unset user.name
$ git config --global --unset user.email

Git 更改最后一次提交的信息

1
2
3
4
5
6
7
8
# 更改最后一次提交的备注信息
$ git commit --amend

# 更改最后一次提交的用户名,这里相当于指定 "user.name"
$ git commit --amend --author=clay

# 更改最后一次提交的日期,第一个日期是提交日期,第二个日期是作者日期
$ GIT_COMMITTER_DATE="2021-02-04T12:32:03" git commit --amend --date="2021-02-04T12:32:03"

Git 撤销提交并清除痕迹

1
2
3
4
5
6
7
8
9
10
11
12
# 撤销最近前4次的提交,其中4表示撤销最近前几次提交
$ git reset --hard HEAD~4

# 也可以指定commit_id,表示撤销某次提交(6ddd44e)之前的所有提交
$ git reflog
$ git reset --hard 6ddd44e

# 强制更新远程的提交历史
$ git push -f

# 或者强制更新特定分支的提交历史
$ git push origin master -f