常用Git命令

常用Git命令

1. 基本Git操作指令

1.1 创建仓库

1
2
3
4
5
6
7
8
# 将当前目录初始化为 Git 仓库
git init

# 在当前目录下创建一个新的目录,并新目录初始化为 Git 仓库
git init [new dir]

# 从远程仓库克隆到本地
git clone [url]

1.2 查看仓库配置

Git 配置分为全局配置、以及各个仓库自己的局部配置,仓库的局部配置会与全局配置合并去重,重复的配置项以仓库局部配置为准。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看全局 Git 配置
# 全局 Git 配置保存在 ~/.gitconfig
git config --global --list

# 查看当前目录下仓库的 Git 局部配置
# 当前仓库的 Git 配置保存在 [仓库目录]/.git/config
git config --list

# 查看接的远程仓库
git remote

# 查看连接的远程仓库的地址
git remote -v

1.3 分支管理

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
# 从远程连接仓库拉取最新数据到本地仓库
git fetch [name]

# 查看所有本地分支
git branch

# 查看所有远程分支
git branch -r

# 查看所有本地以及远程的分支
git branch -a

# 新建一个分支,但不切换
git branch [new branch name]

# 切换到新的分支,并更新工作区文件(切换到新分支的改动记录)
git checkout [branch name]

# 新建一个分支,并切换到该新分支,同时更新工作区文件
git checkout -b [new branch name]

# 将指定的本地分支连接到远程分支
git branch --set-upstream [local branch name] [remote branch name]

# 删除一个本地分支
git branch -d [branch name]

# 同时从本地和远程删除一个分支
git branch -dr [remote/branch]

# 将另一个本地分支的改动合并到当前分支
git merge [branch name]

# 将当前仓库下的某个改动提交记录同步到当前分支
git cherry-pick [commit id]

# 将当前仓库下多个改动提交记录同时同步到当前分支
git cherry-pick [commit id1] [commit id2]

# 将当前仓库下一段连续的改动提交记录同步到当前分支,范围左开右闭(即不包括 id1)
git cherry-pick [commit id1]..[commit id5]

# 将当前仓库下一段连续的改动提交记录同步到当前分支,范围左闭右闭(包括 id1)
git cherry-pick [commit id1]^..[commit id5]

1.4 提交变更

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 将改动文件提交到暂存区
git add [file1] [file2]

# 将某个目录下所有改动文件提交到暂存区
git add [dir]

# 将当前目录下所有改动文件提交到暂存区
git add .

# 将暂存区的所有改动提交到仓库
git commit -a

# 提交暂存区并同时显示每个改动的 Diff
git commit -v

# 查看所有文件变更状态
git status

# 查看当前分支的历史提交记录
git log

# 查看当前分支的历史提交记录,并显示每次提交时发生变更的文件
git log --stat

2. 常见的跨仓库设置

2.1 同时Push到多个仓库

通过 git remote -v 可以查看当前仓库拉取(fetch)和推送(push)的远程仓库的链接:

1
2
origin https://XXX.git (fetch)
origin https://XXX.git (push)

如果想同时 Push 到多个仓库可以通过如下方式添加多个目标仓库地址:

1
git remote set-url --add [name] [url]

其中,[name] 对应的是远程仓库的别名,例如上述的 origin

1
git remote set-url --add origin https://new-push-url.git

设置后再次用 git remote -v 查看远程仓库链接,即可看到已经有两个 Push 地址:

1
2
3
origin https://XXX.git (fetch)
origin https://XXX.git (push)
origin https://new-push-url.git (push)

实际上也可以通过直接修改当前仓库的局部配置文件添加,修改 仓库目录/.git/config 文件,在 [remote] 部分内添加一个 url 配置:

1
2
3
4
5
6
7
8
[core]
......
[remote "origin"]
url = https://XXX.git
fetch = +refs/heads/*:refs/remotes/origin/*
url = https://new-push-url.git
[branch "master"]
......

2.2 同时连接到多个远程仓库

假如有一个本地仓库,出于容灾、备份、等目的,同时推送到了两个远程托管平台,以 GitHub 和 Coding 为例:

  • 假设 GitHub 上的远程仓库地址为 https://XXX.github.git
  • 假设 Coding 上的远程仓库地址为 https://XXX.coding.git

而其他人分别基于不同的平台各自推送了特性分支,此时两个远程仓库的分支列表分别为:

1
2
3
4
5
6
7
# GitHub 的分支列表:
* develop
main

# Coding 的分支列表:
* release
main

假设基于 GitHub 的远程仓库克隆了本地仓库,此时如果直接在 develop 分支上尝试合并 release 分支,会因为找不到 release 分支而失败:

1
merge: release - not something we can merge

想要对这两个来自不同平台的独立的分支做合并,就需要让本地仓库同时连接多个远程仓库了。

通过 git remote -v 查看本地仓库当前的远程连接地址:

1
2
origin https://XXX.github.git (fetch)
origin https://XXX.github.git (push)

给本地仓库再添加 Coding 的远程仓库连接地址,为了方便区分将新的远程仓库命名为 coding,则对应命令为:

1
2
# git remote add <option> [name] [url]
git remote add coding https://XXX.coding.git

再次通过 git remote -v 即可看到该本地仓库已经同时连接到了两个远程仓库:

1
2
3
4
origin http://XXX.github.git (fetch)
origin http://XXX.github.git (push)
coding https://XXX.coding.git (fetch)
coding https://XXX.coding.git (push)

接下来同时把两个远程仓库的数据都拉取下来:

1
2
3
4
5
# 拉取名为 origin 的仓库,即 GitHub 上的
git fetch origin

# 拉取名为 coding 的仓库,即 Coding 上的
git fetch coding

再次尝试在 develop 分支上合并 release 分支即可正常合并,当然如果有冲突也会进入常规流程:

1
2
3
4
5
# 切换到 develop 分支
git checkout develop

# 合并 release 分支
git merge release

2.3 跨仓库Cherry-Pick

通常来说 Cherry-Pick 发生在仓库内的不同分支,用于将其他分支的改动同步到当前分支。

如果一个仓库 GitHub 想要在 Cherry-Pick 另一个仓库 Coding 的提交(例如 commit123fromsource),就会报错:

1
fatal: bad revision 'commit123fromsource'

但如果这两个仓库是 Fork 的关系,或者只是同一个仓库在不同托管平台的备份,本质上它们是同源的,想要互相支持 Cherry-Pick 的话就需要通过上文 2.2 中的方法,给本地仓库同时添加两份远程仓库的连接,然后就能随意 Cherry-Pick 了,当然如果发生冲突也会进入常规流程。

实际上,一个本地仓库可以随意添加多个远程仓库的地址,然后就能随意操作其他仓库的分支或 Commit,但是 Cherry-Pick 需要满足一定的条件,例如涉及到的改动文件具有同源的改动记录,否则就会失败,只能从最开始文件创建的时候开始 Cherry-Pick 才行。