蚊章汇 - John Sj Anderson
type: channel
link: https://linuxcn.bwsl.wang/author/921/
description: John Sj Anderson
items: 13 个 Git 技巧献给 Git 13 岁生日

13 个 Git 技巧献给 Git 13 岁生日
type: item
date: 2018-04-21T00:24:00+08:00
description: 这 13 个 Git 技巧将使你的版本控制技能 +1、+1、+1……Git 是一个分布式版本控制系统，它已经成为开源世界中源代码控制的默认工具，在 4 月 7 日这天，它 13 岁了。使用 Git 令人沮丧的事情之一是你需要知道更多才能有效地使用 Git。但这也可能是使用 Git 比较美妙的一件事，因为没有什么比发现一个新技巧来简化或提高你的工作流的效率更令人快乐了。为了纪念 Git 的 13 岁生日，这里有 13 条技巧和诀窍来让你的 Git 经验更加有用和强大。从你可能忽略的一些基本知识开始，并扩展到一些真正的高级用户技巧！1、 你的 ~/.gitconfig 文件当你第一次尝试使用 git 命令向仓库提交一个更改时，你可能会收到这样的欢迎信息：*** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. 你可能没有意识到正是这些命令在修改 ~/.gitconfig 的内容，这是 Git 存储全局配置选项的地方。你可以通过 ~/.gitconfig 文件来做大量的事，包括定义别名、永久性打开（或关闭）特定命令选项，以及修改 Git 工作方式（例如，git diff 使用哪个 diff 算法，或者默认使用什么类型的合并策略）。你甚至可以根据仓库的路径有条件地包含其他配置文件！所有细节请参阅 man git-config。2、 你仓库中的 .git/config 文件在之前的技巧中，你可能想知道 git config 命令中 --global 标志是干什么的。它告诉 Git 更新 ~/.gitconfig 中的“全局”配置。当然，有全局配置也意味着会有本地配置，显然，如果你省略 --global 标志，git config 将改为更新仓库特有的配置，该配置存储在 .git/config 中。在 .git/config 文件中设置的选项将覆盖 ~/.gitconfig 文件中的所有设置。因此，例如，如果你需要为特定仓库使用不同的电子邮件地址，则可以运行 git config user.email "also_you@example.com"。然后，该仓库中的任何提交都将使用你单独配置的电子邮件地址。如果你在开源项目中工作，而且希望它们显示自己的电子邮件地址，同时仍然使用自己工作邮箱作为主 Git 配置，这非常有用。几乎任何你可以在 ~/.gitconfig 中设置的东西，你也可以在 .git/config 中进行设置，以使其作用于特定的仓库。在下面的技巧中，当我提到将某些内容添加到 ~/.gitconfig 时，只需记住你也可以在特定仓库的 .git/config 中添加来设置那个选项。3、 别名别名是你可以在 ~/.gitconfig 中做的另一件事。它的工作原理就像命令行中的 shell —— 它们设定一个新的命令名称，可以调用一个或多个其他命令，通常使用一组特定的选项或标志。它们对于那些你经常使用的又长又复杂的命令来说非常有效。你可以使用 git config 命令来定义别名 —— 例如，运行 git config --global --add alias.st status 将使运行 git st 与运行 git status 做同样的事情 —— 但是我在定义别名时发现，直接编辑 ~/.gitconfig 文件通常更容易。如果你选择使用这种方法，你会发现 ~/.gitconfig 文件是一个 INI 文件。INI 是一种带有特定段落的键值对文件格式。当添加一个别名时，你将改变 [alias] 段落。例如，定义上面相同的 git st 别名时，添加如下到文件：[alias] st = status （如果已经有 [alias] 段落，只需将第二行添加到现有部分。）4、 shell 命令中的别名别名不仅仅限于运行其他 Git 子命令 —— 你还可以定义运行其他 shell 命令的别名。这是一个用来处理一个反复发生的、罕见和复杂的任务的很好方式：一旦你确定了如何完成它，就可以在别名下保存该命令。例如，我有一些 复刻 fork 的开源项目的仓库，并进行了一些本地修改。我想跟上项目正在进行的开发工作，并保存我本地的变化。为了实现这个目标，我需要定期将来自上游仓库的更改合并到我复刻的项目中 —— 我通过使用我称之为 upstream-merge 的别名来完成。它是这样定义的：upstream-merge = !"git fetch origin -v && git …