一、Stash 使用
git stash
命令用于临时保存和恢复未完成的工作。
-
保存当前工作状态:
git stash save "stash message"
最新的建议写法:
git stash puth -m "stash message"
这会创建一个新的 stash,你可以提供一个消息来进行描述。
-
查看所有保存的 stash:
git stash list
-
恢复最近的 stash:
git stash pop
这会将最近的 stash 应用到当前分支,并从 stash 列表中删除它。
-
恢复指定的 stash:
git stash apply stash@{n}
其中
n
是你想要应用的 stash 的索引。
该功能我常用于分支间临时更改的切换,例如我在 A 分支更改了很多内容,后面发现这些更改本应在 B 分支进行处理的,此时这个功能就非常有用。
二、Cherry-pick 使用
git cherry-pick
命令用于选择一个或多个提交并应用到当前分支。
-
应用单个提交:
git cherry-pick <commit-hash>
这会将指定的提交应用到当前分支,当然它们的哈希值会不一样。
-
应用多个提交:
git cherry-pick <commit-hash1> <commit-hash2> <commit-hash3>
你可以一次应用多个提交。
-
解决 cherry-pick 冲突:
如果在 cherry-pick 过程中发生冲突,你需要手动解决它们,然后执行以下命令完成 cherry-pick:
git add <冲突文件> git cherry-pick --continue
三、Reflog 使用
git reflog
命令显示当前分支的最近操作日志。
-
查看当前分支的 reflog:
git reflog
这将显示当前分支的提交历史,包括已经被删除的提交。
-
恢复已删除的提交:
如果你想恢复一个已经被删除的提交,你可以使用
git cherry-pick
或者git reset
命令。
四、修改历史提交
有时候你可能需要修改历史提交。
-
修改最近一次提交:
git commit --amend
这会打开编辑器让你修改提交信息,并且可以添加或修改此次提交的文件。
-
修改历史中的多个提交:
git rebase -i <commit-hash>^
在交互式 rebase 界面中,你可以选择要修改的提交,并将其更改为
edit
状态。然后使用git commit --amend
修改提交,接着使用git rebase --continue
继续执行 rebase。看不懂
^
符号的可以去看 【Git 教程】Git 基本使用方法。
五、使用别名
为了提高命令行操作的效率,可以为常用的 Git 命令设置别名(在 【Git 教程】Git 基本使用方法 中我们也已经展示了一下,不过那是通过直接更改配置文件来达到目的的)。
-
设置别名:
git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit
在
.gitconfig
文件中配置这些别名,以便它们在所有仓库中生效。
六、Submodule 使用
git submodule
命令用于管理子模块。
此命令可以达到
svn
的目录权限效果。
-
添加子模块:
git submodule add <repository> <path>
这会在指定的路径下添加子模块。
-
更新子模块:
git submodule update --init --recursive
这会初始化、递归地更新所有子模块。
七、钩子(Hooks)使用
Git 钩子可以在 Git 操作的特定阶段运行自定义脚本。所有钩子均被放置在 Git 目录下的一个特定子目录,即我们通常在大多数项目中看到的 .git/hooks
目录。在通过 git init
命令创建新的版本库的时候,Git 会自动在这个位置部署一些示范脚本。这些脚本不仅具备可执行性,还会展示当它们激活时传递的参数。虽然这些示例脚本主要是用 shell 编写的,部分还包含了 Perl 代码,但实际上,只要脚本命名得当且具备可执行属性,可以使用任何编程语言来编写,无论是 Ruby、Python 或者其他你所擅长的语言皆可。
-
安装钩子:
将自定义脚本放在
.git/hooks
目录下的相应位置。例如,pre-commit
钩子在提交之前运行。 -
示例
pre-commit
钩子:#!/bin/bash # 检查代码风格 if ! git diff-index --cached --name-only HEAD | grep -E '\.jsx\?$' | xargs eslint; then exit 1 fi
在这个例子中,钩子会在提交前运行
ESLint
检查。
八、浅克隆(Shallow Clone)
git clone
命令的 --depth
选项用于创建浅克隆。
-
创建浅克隆:
git clone --depth=1 <repository>
这会克隆仓库的最新一次提交,而不包括完整的历史记录。
九、Bisect 使用
git bisect
命令用于在 Git 历史中查找引入 bug 的提交。(这个功能我自己也少用,没法解说的太详细,大家凑合看看吧。。。)
-
启动 bisect:
git bisect start
-
标记一个已知包含 bug 的提交:
git bisect bad <commit-hash>
-
标记一个已知不包含 bug 的提交:
git bisect good <commit-hash>
-
使用
gitk
查看当前 bisect 过程中剩余的提交信息:git bisect visualize
十、Archive 使用
git archive
命令用于将 Git 仓库打包成一个归档文件。
-
创建归档文件:
git archive --format zip --output archive.zip HEAD
这将创建一个名为
archive.zip
的归档文件,其中包含当前提交(HEAD
)的代码。据我使用经验所知,打包成的归档文件并不会包含
.gitignore
中忽略的文件。
十一、Revert 使用
git revert
命令用于撤销 Git 仓库中的提交。
-
撤销单个提交:
git revert <commit-hash> -m 1
这将撤销指定提交(
<commit-hash>
)的一个父提交。 -
撤销多个提交:
git revert <commit-hash1>..<commit-hash2> -m 1
这将撤销指定提交范围(
<commit-hash1>
到<commit-hash2>
)的一个父提交。 -
撤销提交并保留更改:
git revert -n <commit-hash>
这将撤销指定提交(
<commit-hash>
),但不会提交更改。相反,它会将更改留在工作目录中,以便你进行下一步操作。
十二、Clean 使用
git clean
命令用于删除 Git 仓库中未跟踪的文件。
-
强制删除未跟踪的文件:
git clean -f
这将强制删除所有未跟踪的文件。
-
强制删除未跟踪的目录:
git clean -fd
这将强制删除所有未跟踪的文件和目录。
十三、Grep 使用
git grep
命令用于在 Git 仓库中搜索字符串。
-
搜索当前提交中的字符串:
git grep "string"
这将搜索当前提交中包含指定字符串(
string
)的文件。 -
搜索历史提交中的字符串:
git grep "string" <commit-hash>
这将搜索指定提交(
<commit-hash>
)中包含指定字符串(string
)的文件。
十四、Rm 使用
git rm
命令用于从 Git 仓库中删除文件或目录。
-
删除文件:
git rm <file>
这将删除指定文件(
<file>
)并从 Git 仓库中移除。 -
删除目录:
git rm -r <directory>
这将删除指定目录(
<directory>
)及其所有子目录和文件,并从 Git 仓库中移除。 -
强制删除文件或目录:
git rm -f <file>
这将强制删除指定文件(
<file>
)或目录(<directory>
),而不进行任何确认。 -
从 Git 仓库中删除文件但不删除文件内容
如果你只想从 Git 仓库中删除文件,但不删除文件内容,可以使用
git rm --cached
选项。git rm --cached <file>
这将从 Git 仓库中删除指定文件(
<file>
),但不会删除文件内容。 -
撤销 Git rm 操作
如果你在执行
git rm
后发现误删了文件,可以使用git checkout
命令撤销操作。git checkout -- <file>
这将撤销对指定文件(
<file>
)的删除操作。
十五、.gitignore 相关
-
检查文件是否被 Git 忽略:
git check-ignore <file>
如果想看所有被
.gitignore
匹配到的忽略的文件/目录,可以这样写:git check-ignore *