Git 备忘清单
在的代码管理版本控制工具几乎都是 Git 了,虽然有很多好看好用的 GUI 客户端(推荐 Fork),但常用的命令还是得要了然于心,这里只是列出常用的 Git 命令行指令,以供速查参考。
配置
本地全局配置文件的路径(macOS)为:~/.gitconfig
,本地仓库的配置路径为:[仓库路径]/.git/config
。
查看配置
1 | 显示全局 / 仓库配置,在仓库目录下执行该命令则显示当前仓库的配置,在非仓库目录下则显示为全局配置。 |
使用文本编辑器来编辑配置
1 | 设置默认的文本编辑器,默认使用 `vim` |
用户名和邮箱
添加 --global
参数,则为全局设置;不加则为当前仓库设置,需要在当前仓库目录下执行该命令。(下同)
1 | 全局设置用户名 |
默认提交信息 / 模板
$ git config --global commit.template <template-file-path>
在提交时,编辑器中就会显示模板文件中的信息,这里推荐 Git Commit 日志风格指南 中的模板。
别名
1 | e.g. |
几个特别实用的别名(via @vikingmute):
1 | # 删除最近一个提交,保留文件修改 |
代理
由于众所周知的原因,国内访问 GitHub 都巨慢,配置代理可以加快访问速度。
配置 Git 代理
1 | 查看代理 |
配置 SSH 代理
1 | 修改 ~/.ssh/config 文件 |
删除配置
1 | git config --global --unset <key> |
仓库
创建与克隆
1 | 创建一个新的本地仓库 |
忽略文件
文件 .gitignore
指定了 Git 应该忽略的未跟踪的文件,这里推荐 github/gitignore 模板。
符号 | 规则 |
---|---|
行首 # |
全行注释,不支持行尾类注释 (转义 \# ) |
行首 ! |
否定模式 (转义 \! ) |
** |
匹配任意路径 |
* |
匹配任意多个字符 |
? |
匹配任意一个字符 |
doc/** |
匹配 doc 文件夹下的全部内容 |
doc/**/a |
匹配任意深度路径下的 a 文件或文件夹 |
/ |
表示路径分隔符,不区分操作系统 |
/ 结尾 |
仅会匹配文件夹,否则会匹配文件和文件夹 |
空行 | 不匹配任何文件 |
行尾空格 | 默认被忽略,可使用 \ 进行转义 |
行首空格 | 被正常处理,不会被忽略 |
当前 .gitignore
文件定义规则的优先级高于上级路径 .gitignore
定义规则的优先级;后定义的规则优先级高于前面定义规则的优先级。
远程仓库
1 | 向本地仓库添加一个新的远程仓库 |
同步
1 | 获取远程仓库所有分支 |
观察你的仓库
1 | 显示当前活动分支的提交历史 |
分支
1 | 列出所有本地分支 |
提交
做出改变
1 | 在工作目录中显示修改后的文件,为您的下一次提交暂存 |
临时提交
1 | 保存已修改和分阶段的更改 |
提交到远程仓库
1 | 推送当前分支到默认远程仓库 |
其他常用操作
rebase、merge、reset、revert
git rebase
git rebase
将一个分支上的更改应用到另一个分支的基础之上。它可以保持提交历史的整洁和线性,而不像 git merge
那样生成一个额外的合并提交记录。
示例:
-
更新
feature
分支到主分支的最新状态。1
2
3
4
5
6
7
8
9
101. 切换到 feature 分支:
git checkout feature-branch
2. 更新主分支:
git checkout main
git pull origin main
3. 返回到 feature 分支并执行 rebase:
git checkout feature-branch
git rebase main -
处理冲突
在
rebase
过程中,如果存在冲突,Git 会暂停并提示你解决冲突。解决冲突后,使用以下命令继续rebase
:1
2git add <conflicted-files>
git rebase --continue如果要中止
rebase
操作,可以使用:1
git rebase --abort
-
推送变基后的更改
1
git push --force origin feature-branch
git merge
git merge
用于将两个或多个分支的开发历史合并在一起的命令。与 git rebase
不同的是,merge
保留了整个分支的历史记录,并在目标分支中创建一个新的合并提交。而 rebase
是将一个分支的改动在另一个分支的基础上重新应用。
示例:
-
把
feature-branch
分支合并到main
分支1
2git checkout main
git merge feature-branch -
处理合并冲突
-
继续合并
1
2git add <conflicted-file>
git commit
-
快进合并 (Fast-forward merge)
如果正在合并的分支是直接从目标分支创建的,而且目标分支在此期间没有任何新的提交,Git 会自动执行快进合并,不会创建新的合并提交。
-
禁用快进合并
1
git merge --no-ff feature-branch
-
其他选项
-
--squash
:将所有合并的提交压缩成一个提交。不会生成合并提交记录。1
git merge --squash feature-branch
使用
--squash
合并后,你需要手动提交:1
git commit
-
--no-commit
:合并内容但不自动提交。你可以检查更改后手动提交。1
git merge --no-commit feature-branch
-
--abort
:如果在合并中遇到问题或冲突而不想继续,可以使用该命令终止合并并恢复到合并前的状态。1
git merge --abort
-
git reset
git reset
用于撤销更改、重置头指针位置以及修改暂存区和工作目录。它可以根据不同的模式(--soft
、--mixed
或 --hard
)来改变暂存区和工作目录的状态。
-
--soft
:重置 HEAD 到指定提交,暂存区和工作目录不变。常用于修改最后一次提交。1
git reset --soft HEAD~1
例如,上述命令将当前分支的 HEAD 移动到前一个提交,保留所有更改在暂存区中。你可以进行新的提交或调整提交信息。
1
git commit --amend
-
--mixed
(默认):重置 HEAD 到指定提交,同步更新暂存区,但工作目录不变。常用于撤销提交但保留更改。1
git reset --mixed HEAD~1
-
--hard
:重置 HEAD 到指定提交,同时同步更新暂存区和工作目录。会丢失所有未提交的更改。1
2
3git reset --hard HEAD~1
也可以指定具体的 commit hash
git reset --hard e7a1e7a1
git revert
git revert
用于撤销一个或多个已提交的变更,但与 git reset
不同,它不会改变项目的提交历史。相反,它会创建一个新的提交,这个提交包含了撤销指定提交的更改。这样的操作是“向前”撤销,仍然保留所有的提交记录。
-
单个提交的撤销
1
git revert <commit-hash>
-
多个提交的撤销
1
2撤销最近的三个提交:
git revert HEAD~3..HEAD
放弃更改
-
丢弃工作目录中的更改
-
使用
git checkout
:1
2
3
4恢复单个文件
git checkout -- <path/to/file>
恢复全部文件
git checkout -- . -
使用
git restore
:1
2
3
4恢复单个文件
git restore <file>
恢复全部文件
git restore .
-
-
丢弃暂存区中的更改
1
2
3
4恢复单个文件
git reset path/to/file
恢复全部文件
git reset -
丢弃未提交的文件
1
2
3
4
5
6查看将要被删除的文件
git clean -n
真正执行删除操作
git clean -f
如果目录中有未跟踪的子目录并想同时删除,可以使用 -d 选项
git clean -fd
重命名分支
1 | 1. 重命名为 new |
修改远程 Commit 记录
-
使用
git rebase
修改本地 Commit 记录1
git rebase -i <base-commit> # -i, --interactive
<base-commit>
是想要开始修改历史的位置。例如,如果想修改最后的 3 个提交,可以这样:1
git rebase -i HEAD~3
这会打开一个文本编辑器,显示最近 3 次提交的列表。你可以在列表中选择编辑、压缩、删除等操作。
pick
:按原样保留此提交reword
:保留此提交但编辑提交信息edit
:保留此提交但会暂停变基,使你可以修改此提交squash
:将此提交与前一个提交合并,并编辑提交信息fixup
:将此提交与前一个提交合并,但不保留此提交的信息drop
:完全删除此提交
在编辑器中,可能会看到如下内容:
1
2
3pick abc1234 First commit message
pick def5678 Second commit message
pick ghi9012 Third commit message可以修改成:
1
2
3edit abc1234 First commit message
pick def5678 Second commit message
pick ghi9012 Third commit message然后保存并关闭编辑器。
-
编辑提交
此时 Git 会停止在第一个需要修改的提交。你可以使用以下命令进行修改:
- 修改文件,e.g.
git add <modified-file>
- 使用
git commit --amend
进行提交更改
修改完每个提交后,可以继续下一个提交:
1
git rebase --continue
重复这个过程直到完成所有提交的修改。
- 修改文件,e.g.
-
强制推送到远程仓库
最后,确保没有人提交进行推送,强制推送这些更改到远程仓库。
1
git push -f origin <branch-name>
Worktree
git worktree
用于在同一个 Git 仓库中创建多个工作目录(工作树)。这对于在同一个仓库中的不同分支上进行并行开发特别有用。
1 | 查看目前工作目录 |
Fork 仓库同步上游仓库
1 | 1. 设置上游仓库 |
查看某段代码是谁写的
1 | git blame <file-name> |
提交次数统计
1 | git log --oneline | wc -l |
仓库大小
1 | Git 仓库的总大小 |
展示忽略的文件
1 | git status --ignored |
清除 .gitignore 文件中记录的文件
1 | git clean -X -f |
孤立分支
1 | 创建一个新的孤立分支 |
孤立分支(orphan branch)不包含任何历史提交记录,相当于保存修改,但是重写 commit 历史,从这条分支开始的提交历史是全新的。比如在现有仓库中创建一个全新的项目时特别有用,而不想保留先前项目的历史记录。
修改最后的提交
-
查看最后一次提交的信息
1
git log -1
-
修改最后一次提交
1
2
3
4
5
6修改最后一次提交的作者信息
git commit --amend --author='Author Name <email@address.com>'
重写最后的提交消息
git commit --amend -m "new message"
修改最新的提交而不更改提交消息
git commit --amend --no-edit -
修改提交后,将更改推送到远程仓库
1
git push --force origin <branch-name>
另见
- Pro Git
- Git 备忘清单
- Learn Git Branching
- Git 教程
- 适合初学者的简单 Git 教程
- 深入理解学习 Git 工作流(git-workflow-tutorial)
- Git Tips
- Oh Shit, Git!?!
- GitHub 秘籍
- Git Commit 日志风格指南
- 版本控制 (Git)
- git cheat sheet
- 程序员必会的六条黄金 Git 命令,让你效率提高百分之百
- gitignore.io: Create useful .gitignore files for your project.
- github/gitignore: A collection of useful .gitignore templates.
- matsuyoshi30/gitsu: switch git user easily.
- tiimgreen/github-cheat-sheet: A list of cool features of Git and GitHub.