🔖 Git Cheat Sheet
2025-01-22 08:19:30    2.1k 字   
This post is also available in English and alternative languages.

1. Cheat Sheet

👇👇需要科学上网👇👇

👉👉👉 点击跳转 - 需要科学上网


2. Git 飞行规则

什么是"飞行规则"?
这是一篇给宇航员(这里就是指使用Git的程序员们)的指南,用来指导问题出现后的应对之法。

飞行规则(Flight Rules) 是记录在手册上的来之不易的一系列知识,记录了某个事情发生的原因,以及怎样一步一步的进行处理。本质上, 它们是特定场景的非常详细的标准处理流程。 自20世纪60年代初以来,NASA一直在捕捉(capturing)我们的失误,灾难和解决方案, 当时水星时代(Mercury-era)的地面小组首先开始将“经验教训”收集到一个纲要(compendium)中,该纲现在已经有上千个问题情景,从发动机故障到破损的舱口把手到计算机故障,以及它们对应的解决方案。

2.1. 两个 Git 仓库之间 cherry pick

  1. 查看本地项目的远程仓库地址

    1
    2
    3
    git remote

    git remote show
  2. 添加需同步commit的所属远程仓库地址

    1
    2
    3
    4
    git remote add other git@xxxxx.git

    如果 copy 错地址了,使用下面命令修改
    git remote set-url other git@xxx.git
  3. 查看添加地址是否正确

    1
    git remote get-url other
  4. 同步远程仓库信息

    1
    git fetch other
  5. 进行 cherry pick

    1
    git cherry-pick 61ecfaxxxxxxxxxxxxxxxx26233dfb168

    或者在 IDEA 界面上进行 cherry pick 操作。


2.2. 为仓库设置不同的用户名和邮箱

不是用全局设置的用户名和邮箱,针对某个项目单独修改。

命令行进入项目后,如下设置:

1
2
git config user.name "username"
git config user.email "username@email.com"

之后可以打开 .git/config 文件看配置生效如下

1
2
3
[user]
name = username
email = username@email.com

2.3. 本地仓库与远程仓库关联

1
git remote add origin git@github.com:{name}/{projectName}.git

git@github.com:{name}/{projectName}.git 就是远程仓库的地址。


2.4. 修改远程仓库地址,进行本地仓库迁移

新建远端仓库后,在本地的 git 仓库中执行下面命令:

1
2
git remote set-url origin xxx
git push

2.5. 修改分支名称

1
2
3
4
5
6
7
8
1.将本地分支oldBranch切一个分支到本地:
git branch -m [oldbranch] [newbranch]

2.删除远程分支:
git push --delete origin [oldbranch]

3.将本地新分支推送远程:
git push origin [newbranch]

2.6. 取消暂存的文件

场景:不小心执行了git add .将所有待变更文件都提交到了暂存区(新增文件9527-1.txt,修改文件9527.txt)。

目的:9527.txt文件还没有修改完,是误提交,需要取消该文件的暂存。

1
2
3
4
5
6
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: 9527-1.txt
modified: 9527.txt

通过git reset HEAD [file]来取消暂存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git reset head 9527.txt
Unstaged changes after reset:
M 9527.txt

$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: 9527-1.txt

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: 9527.txt

至此,9527.txt文件已经取消暂存了。


2.7. 本地项目关联Github/GitLab

首先将本地项目 git 初始化。

然后在项目根目录下执行命令:

1
git remote add origin [https的git网址]

如果出现fatal:remote origin already exists,输入以下命令:

1
git remote rm origin

然后重新执行第一条命令。


2.8. 中文文件名乱码

使用git add提交时,中文文件名会显示乱码,如下命令可以解决。

1
git config --global core.quotepath false

git乱码解决方案汇总


2.9. 跟踪空目录

使用.gitkeep

  • windows创建

    1
    type null>.gitkeep
  • linux、macos创建

    1
    touch .gitkeep

2.10. 查看git安装路径

1
which -a git

2.11. brew安装git后改变指向

1
brew link git --overwrite

2.12. 撤回 Commit

2.12.1. 方式一:IDEA(Undo Commit)

如果代码没有push,会撤销 Commit 动作(删除)。如果代码已经 push ,线上 commit 记录还会存在。

1.选中要撤回的提交记录
2.选择 Undo Commit
3.撤回
4.之前的commit记录已经没有了

2.12.2. 方式二:IDEA(Revert Commit)

会新增一条 Revert “xxx commit” 的 commit 提交,该提交进行的操作是将"xxx commit"中对代码进行的修改全部撤回掉。

1.选中要撤回的提交记录
2.选择 Revert Commit
3.新增了Revert记录

2.13. cherry-pick

将某个分支上的 commit 移动到另一个分支上。

2.13.1. 命令行方式

  1. 当前在 release 分支,copy 出对应的 commit id,如:7114dcbe7f8557a2f5ff2324ba59ac01d02344b5

  2. 切换到 dev 分支,输入命令:git cherry-pick 7114dcbe7f8557a2f5ff2324ba59ac01d02344b5

    dev 分支查看 git log 已经有对应的记录了。但它是一个新的提交,因此 commit id 会不一样。


2.14. 配置多个 Git 账号

Mac 中配置多个 Git 账号

2.14.1. 清空全局用户配置

如果之前使用过 --global 设置过全局的用户名和邮箱,需要使用下面的命令清空掉。

1
2
git config --global --unset user.name
git config --global --unset user.email

2.14.2. 生成密钥

使用下面的命令生成所需要的各平台密钥:

1
2
3
ssh-keygen -t rsa -C 'Github邮箱' -f ~/.ssh/id_rsa_github
ssh-keygen -t rsa -C 'Gitlab邮箱' -f ~/.ssh/id_rsa_gitlab
ssh-keygen -t rsa -C 'Gitee邮箱' -f ~/.ssh/id_rsa_gitee

进入到 .ssh 文件中就能看到新生成的这几个密钥文件了。

生成密钥(图片来源:https://liubing.me/article/git/configuring-multiple-git-accounts-in-mac.html)

2.14.3. 配置秘钥


2.14.4. 配置 Config

.ssh 中新建一个 config 文件。

1
2
3
cd ~/.ssh
touch config
vim config

通过 vim 编辑该文件,填入以下配置内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Host github.com
HostName github.com
User github邮箱
IdentityFile ~/.ssh/id_rsa_github

Host gitlab.com
HostName gitlab.com
User gitlab邮箱
IdentityFile ~/.ssh/id_rsa_gitlab

Host gitee.com
HostName gitee.com
User gitee邮箱
IdentityFile ~/.ssh/id_rsa_gitee

2.14.5. 测试连通性

1
2
3
ssh -T git@github.com
ssh -T git@gitlab.com
ssh -T git@gitee.com

以 Github 为例,首次输入 ssh -T git@github.com 后会提示 Are you sure you want to continue connecting,输入 yes 后如果看到 successfully 字样说明就成功了,如果出现 Permission denied 说明失败,需要检查密钥是否配置以及是否复制有误。

测试连通性(图片来源:https://liubing.me/article/git/configuring-multiple-git-accounts-in-mac.html)

3. Git submodule

git 子模块功能,作用不赘述。

3.1. 创建

先在gitlab、github上创建好子项目,然后创建父项目,使用 submodule add 添加进来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1. 创建父项目:parent

2. 拉取父项目到本地
git clone https://github.com/Simba-cheng/parent.git

3. 用 git bash,cd 到parent项目/目录中

4. 添加子模块
git submodule add "https://github.com/***/module-A.git" "module/module-A"
git submodule add "https://github.com/***/module-B.git" "module/module-B"
git submodule add "https://github.com/***/common-module-c.git" "commons/common-module-c"
git submodule add "https://github.com/***/common-module-d.git" "commons/common-module-d"

5. 初始化
git submodule init

6. 拉取项目
git submodule update
命令含义
git submodule foreach git pull origin master为所有子模块循环执行命令:git pull origin master
git submodule foreach git pull --all为所有子模块循环执行命令:git pull --all

4. 规范编写Git Commit Message

Commit Message 格式分为三个部分:Header、Body、Footer;(Header是必填,Body、Footer非必填)

1
2
3
4
5
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

header部分只有一行,包含三个必须的字段:type(必填)、scope(非必填)、subject(必填)

  • type

    说明commit类别,可以使用下面七个标识

    1. feat:新功能(feature)
    2. fix:修补bug
    3. docs:文档(documentation)
    4. style: 格式(不影响代码运行的变动,空格,格式化,等)
    5. refactor:重构(即不是新增功能,也不是修改bug的代码变动)
    6. perf: 性能 (提高代码性能的改变)
    7. test:增加测试
    8. build: 影响构建系统或外部依赖项的更改(maven,gradle,npm等)
    9. ci:对CI配置文件和脚本的更改
    10. chore:对非 src 和 test 目录的修改
    11. revert: Revert a commit
  • scope

    scope用于说明commit影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

  • subject

    subjectcommit目的的简短描述,不超过50个字符。


4.2. Body

Body部分是对本次commit的详细描述,可以分成多行。


Footer 部分只用于两种情况。

  • 不兼容变动
  • 关闭 Issue

4.4. 插件

推荐IDEA 插件:Git Commit Template


5. cheat sheet

git-cheat-sheet

5.1. Git Workflow

GitWorkflow(来源见水印, 新标签页中打开可放大图片)



5.2. Git Commands

Git Commands(来源见水印, 新标签页中打开可放大图片)



5.3. Useful Git Commands Cheatsheet

Useful Git Commands Cheatsheet(来源见水印, 新标签页中打开可放大图片)



5.4. Git Merge vs Git Rebase

Git Merge vs Git Rebase(来源见水印, 新标签页中打开可放大图片)