标签 Git 下的文章

Git 的 bisect 工具通过快速识别坏的提交,节省了时间和精力。

你是不是有过这样的经历:发现代码中有 错误 bug ,但不知道这个错误是什么时候引入的。这有可能是因为,某个人提交了一份有错误的代码,但没有在他的 Git 提交 commit 消息中声明它。这个错误可能已经存在了几周、几个月甚至几年,这意味着你需要搜索数百或数千个提交,才能找到问题何时出现的。而 git bisect 命令能够完美地解决这个问题!

git bisect 命令是一个强大的工具。你可以给 git bisect 命令一个范围,一端是一个已知的好状态,另一端是一个已知的坏状态。它会自动地确认当前范围的中点,在这个中点上进行测试,然后要求你确定那次提交是一个 好提交 good commit 还是一个 坏提交 bad commit ,然后它会重复这一“二分查找”的过程,直到你找到首次引入错误的那一次提交。

Image of Zeno's paradox of Achilles.

这个“数学”工具是利用“二分查找”来找到错误之处的。git bisect 命令通过查看中点,然后由你来决定它是提交列表的新起点(即 “坏提交” )还是新终点(即 “好提交”),进而来缩小查找范围,如此在几次查找中你可以就能定位到有错误的提交。即使你有 10,000 个提交要检查,最多只需要 13 次查找,就能很快地定位到首次引入错误的提交。

  1. 提交 1 坏 <> 提交 10,000 好 => 提交 5,000 是坏的
  2. 提交 5,000 坏 <> 提交 10,000 好 => 提交 7,500 是好的
  3. 提交 5,000 坏 <> 提交 7,500 好 => 提交 6,250 是好的
  4. 提交 5,000 坏 <> 提交 6,250 好 => 提交 5,625 是坏的
  5. 提交 5,625 坏 <> 提交 6,250 好 => 提交 5,938 是坏的
  6. 提交 5,938 坏 <> 提交 6,250 好 => 提交 6,094 是好的
  7. 提交 5,938 坏 <> 提交 6,094 好 => 提交 6,016 是坏的
  8. 提交 6,016 坏 <> 提交 6,094 好 => 提交 6,055 是好的
  9. 提交 6,016 坏 <> 提交 6,055 好 => 提交 6,036 是坏的
  10. 提交 6,036 坏 <> 提交 6,055 好 => 提交 6,046 是坏的
  11. 提交 6,046 坏 <> 提交 6,055 好 => 提交 6,050 是坏的
  12. 提交 6,050 坏 <> 提交 6,055 好 => 提交 6,053 是好的
  13. 提交 6,053 坏 <> 提交 6,055 好 => 提交 6,054 是好的

对于上面这个例子,我们能知道 10,000 个提交中的第一个错误提交是第 6053 次提交。对于 git bisect 命令,最多需要几分钟就能完成检索。但是如果要一个一个查找每个提交是否错误,我甚至无法想象需要多长时间。

使用 Git bisect 命令

git bisect 命令使用起来非常简单:

(LCTT 译注:使用 git bisect start 命令来进入 bisect 模式,并且该命令指定了一个检查范围。它会告诉我们一共有多少次提交,大概需要几步就可以定位到具体的提交。)

$ git bisect start
$ git bisect bad        # Git assumes you mean HEAD by default
$ git bisect good <ref> # specify a tag or commit ID for <ref>

Git 检查中间的提交,并等待你声明这次提交是一个好提交还是一个坏提交:

(LCTT 译注:如果某一提交是可以通过的,则使用 git bisect good 命令标记;同样地,如果某一提交不能通过,则使用 git bisect bad 命令标记。)

$ git bisect good

$ git bisect bad

然后,git bisect 工具重复检查好提交和坏提交中间的那次提交,直到你告诉它:

$ git bisect reset

一些高级用户甚至可以自己编写脚本,来确定提交的好坏状态、并在找到特定提交时采取某一补救措施。你可能不会每天都使用 git bisect 命令,但当你需要它来定位首次引入错误的提交时,它会是一个很有用的救星。


via: https://opensource.com/article/22/11/git-bisect

作者:Dwayne McDaniel 选题:lkxed 译者:chai001125 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

git log 命令是 Git 中一个很重要的查看提交记录的工具,它也是人们喜欢使用 Git 的原因之一。

git log 命令能够让你了解到更多关于贡献者 提交 commit 的记录。使用 git log 的一种方式是按日期查看提交记录 。要查看在指定日期或日期范围内创建的 Git 存储库中的提交记录,请使用带有选项 --since--until 或者同时使用以上两个选项的 git log 命令。

首先,进入你要查看的分支(例如,main 分支):

$ git checkout main

接下来,你可以使用以下命令,来显示当前日期(即今天)的提交记录:

$ git log --oneline --since="yesterday"

仅显示某一特定用户(例如,用户 Agil)在今天的提交记录:

$ git log --oneline --since="yesterday" --author="Agil"

还可以显示在某一日期范围内的提交记录。使用以下命令,显示在任意两个日期之间(例如,2022 年 4 月 22 日至 2022 年 4 月 24 日)的提交记录:

$ git log --oneline --since="2022-04-22" --until="2022-04-24"

在上面这个例子中,会输出 2022 年 4 月 22 日至 2022 年 4 月 24 日期间,不包括 2022 年 4 月 22 日的所有提交记录。如果你想要包括 2022 年 4 月 22 日的提交记录,请将命令中的 2022-04-22 替换为 2022-04-21

运行以下命令,能够显示某一特定用户(例如,用户 Agil)在两个指定的日期之间的提交记录:

$ git log --oneline --since="2022-04-22" --until="2022-04-24" --author="Agil"

总结

Git 有很多优点,其中一个优点就是 Git 让你能够收集你项目的相关数据。git log 命令是一个重要的查看提交记录的工具,也是人们喜欢使用 Git 的原因之一!


via: https://opensource.com/article/22/10/git-log-command

作者:Agil Antony 选题:lkxed 译者:chai001125 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这份简要指南能够帮助你快速开始使用 Git,以及配置一些选项。

在 Linux 中设置 Git 十分简单,但为了获得完美的配置,我做了以下五件事:

  1. 创建全局配置
  2. 设置默认名称
  3. 设置默认邮箱地址
  4. 设置默认分支名称
  5. 设置默认编辑器

我使用 Git 管理我的代码、命令行脚本以及文档版本。这意味着每次我开始一项新的任务,首先我需要创建一个文件目录并将其添加到 Git 库中:

$ mkdir newproject
$ cd newproject
$ git init

有一些我一直想要的常规设置。不多,但可以避免我每次都进行配置。我喜欢利用 Git 的 全局 配置功能。

Git 提供了进行手动配置的 git config 命令,但这有一些注意事项。例如,通常你会设置邮箱地址。你可以通过运行 git config user.email 你的邮件地址 命令进行设置。然而,这只会在你当前所在的 Git 目录下起作用。

$ git config user.email [email protected]
fatal: not in a git directory

此外,当这个命令在 Git 仓库中运行时,它只会配置特定的一个仓库。在新的仓库中,你不得不重复这个步骤。我可以通过全局配置来避免重复。选项 --global 会指示 Git 将邮箱地址写入全局配置 ~/.gitconfig 文件中,甚至在必要时会创建它:

请记住,波浪线(~)代表你的主文件夹。在我的电脑中它是 /home/alan
$ git config --global user.email [email protected]
$ cat ~/.gitconfig
[user]
        email = [email protected]

这里的缺点是,如果你有大量偏好设置,需要输入很多命令,这将花费大量时间并且很容易出错。Git 提供了更加快捷有效的方式,可以直接编辑你的全局配置文件——这是我列表中的第一项!

1、创建全局配置

如果你刚开始使用 Git,或许你还没有该文件。不用担心,让我们直接开始。只需要用 --edit 选项:

$ git config --global --edit

如果没有该文件,Git 将会创建一个包含以下内容的新文件,并使用你终端的默认编辑器打开它:

# This is Git's per-user configuration file.
[user]
# Please adapt and uncomment the following lines:
#       name = Alan
#       email = alan@hopper
~
~
~
"~/.gitconfig" 5L, 155B                                     1,1           All

现在我们已经打开了编辑器,并且 Git 已经在后台创建了全局配置文件,我们可以继续接下来的设置。

2、设置默认名称

名字是该文件中的首要条目,让我们先从它开始。用命令行设置我的名称是 git config --global user.name "Alan Formy-Duval"。不用在命令行中运行该命令,只需要在配置文件中编辑 name 条目就行:

name = Alan Formy-Duval

3、设置默认邮箱地址

邮箱地址是第二个条目,让我们添加它。默认情况下,Git 使用你的系统提供的名称和邮箱地址。如果不正确或者你想要更改,你可以在配置文件中具体说明。事实上,如果你没有配置这些,Git 在你第一次提交时会友好的提示你:

Committer: Alan <alan@hopper>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate....

在命令行中运行 git config --global user.email "[email protected]" 会设置好我的邮箱。同样,我们在配置文件中编辑 email 条目,提供你的邮箱地址:

email = [email protected]

我喜欢设置的最后两个设置是默认分支名称和默认编辑器。当你仍在编辑器中时,需要添加这些指令。

4、设置默认分支名称

目前有一种趋势,即不再使用 master 作为默认分支名称。事实上,在新存储库初始化时,Git 将通过友好的消息提示更改默认分支名称:

$ git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint:   git config --global init.defaultBranch <name>

这个名为 defaultBranch 的指令需要位于一个名为 init 的新部分中。现在普遍接受的是,许多程序员使用 main 这个词作为他们的默认分支。这是我喜欢使用的。将此部分后跟指令添加到配置中:

[init]
            defaultBranch = main

5、设置默认编辑器

第五个设置是设置默认的编辑器。这是指 Git 将使用的编辑器,用于在你每次将更改提交到存储库时输入你的提交消息。不论是 nanoemacsvi 还是其他编辑器,每个人都有他喜欢的。我喜欢用 vi。添加 core 部分,并设置 editor 指令为你喜欢的编辑器。

[core]
            editor = vi

这是最后一项。退出编辑器。Git 在主目录下保存全局配置文件。如果你再次运行编辑命令,将会看到所有内容。注意配置文件是明文存储的文本文件,因此它可以很容易使用文本工具查看,如 cat 命令。这是我的配置文件内容:

$ cat ~/.gitconfig
[user]
        email = [email protected]
        name = Alan Formy-Duval
[core]
        editor = vi
[init]
        defaultBranch = main

这是一个简单的指南,可以让你快速开始使用 Git 和它的一些配置选项。


via: https://opensource.com/article/22/9/git-configuration-linux

作者:Alan Formy-Duval 选题:lkxed 译者:Donkey-Hao 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

遵循几个简单的步骤来保持 Git 仓库的整洁

在合并一个 GibLab 的合并请求(MR)或 GitHub 的拉取请求(PR)后,你通常需要从远程仓库中删掉这个主题分支来保持仓库的整洁。然而,这只会删掉远程仓库的主题分支。本地 Git 仓库也会从例行清理中收益。

要同步本地仓库和远程仓库的信息,可以执行 git prune 命令来删除本地仓库中远程分支的本地引用。

按照以下三个简单的步骤:

1、检出仓库中的核心分支(比如 main 或者 master):

$ git checkout <central_branch_name>

2、列出所有远程和本地分支:

$ git branch -a

示例输出:

4.10.z
* master
  remotes/mydata/4.9-stage
  remotes/mydata/4.9.z
  remotes/mydata/test-branch

在这个例子中,test-branch 是从远程仓库中删除的主题分支的名字。

3、删除远程分支的本地引用:

首先,列出所有可以从本地仓库中删除的分支:

$ git remote prune origin --dry-run

示例输出:

Pruning origin
URL: [email protected]:myorg/mydata-4.10.git
* [would prune] origin/test-branch

然后,删除远程分支的本地引用:

$ git remote prune origin

示例输出:

Pruning origin
URL: [email protected]:myorg/mydata-4.10.git
* [pruned] origin/test-branch

就是这样!

维护 Git 仓库

保持 Git 仓库的整洁,一开始似乎并不紧急,但是随着仓库规模的增长,删除不必要的数据就变得更为重要。不要让从无用的数据筛选而拖慢你。

经常删除远程分支的本地引用,是维护一个可用的 Git 仓库是一个好方法。


via: https://opensource.com/article/22/8/delete-local-reference-remote-branch-git

作者:Agil Antony 选题:lkxed 译者:Yufei-Yan 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Tig 是审查 Git 仓库的绝佳工具,它鼓励你探索日志,而无需构建冗长且有时复杂的查询。

如果你发现浏览你的 Git 仓库非常复杂,我已经为你准备好了工具,来了解一下 Tig。

Tig 是一个 基于 ncurses 的 Git 文本模式界面,它允许你浏览 Git 仓库中的更改。它还可以充当各种 Git 命令输出的分页器。使用这个工具可以让我很好地了解在哪个提交中发生了哪些更改,最新的提交合并是什么等等。请跟随这个简短的教程,亲自尝试一下。

安装 Tig

在 Linux 上,你可以使用包管理器安装 Tig。例如,在 Fedora 和 Mageia 上:

$ sudo dnf install tig

在 Debian、Linux Mint、Elementary、Pop\_OS 和其他基于 Debian 的发行版上:

$ sud apt install tig

在 macOS 上,使用 MacPortsHomebrew。 Tig 的完整安装指南可在 Tig 手册 中找到。

使用 Tig

Tig 提供了常见 Git 输出的交互式视图。例如,使用 Git,你可以使用命令 git show-ref 查看所有引用:

$ git show-ref
98b108... refs/heads/master
6dae95... refs/remotes/origin/1010-internal-share-partition-format-reflexion
84e1f8... refs/remotes/origin/1015-add-libretro-openlara
e62c7c... refs/remotes/origin/1016-add-support-for-retroarch-project-cd
1c29a8... refs/remotes/origin/1066-add-libretro-mess
ffd3f53... refs/remotes/origin/1155-automatically-generate-assets-for-external-installers
ab4d14... refs/remotes/origin/1160-release-on-bare-metal-servers
28baa9... refs/remotes/origin/1180-ipega-pg-9118
8dff1d... refs/remotes/origin/1181-add-libretro-dosbox-core-s
81a7fe... refs/remotes/origin/1189-allow-manual-build-on-master
[...]

使用 Tig,你可以在可滚动列表中获取该信息以及更多信息,此外还可以使用键盘快捷键来打开其他视图,其中包含每个引用的详细信息。

分页模式

当输入来自标准输入时,Tig 进入分页模式。当指定 show 子命令并给出 --stdin 选项时,标准输入被假定为提交 ID 列表,它被转发到 git-show

$ git rev-list --author=sumantrom HEAD | tig show –stdin

日志和差异视图

当你在 Tig 的日志视图中时,你可以按键盘上的 d 键来显示差异。这将显示提交中更改的文件以及删除和添加的行。

交互式 Git 数据

Tig 是对 Git 的一个很好的补充。它鼓励你探索日志,而无需构建冗长且有时复杂的查询,从而可以轻松查看你的 Git 仓库。

立即将 Tig 添加到你的 Git 工具包中!


via: https://opensource.com/article/22/7/visualize-git-workflow-tig

作者:Sumantro Mukherjee 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

掌握管理本地/远程分支等最常见的 Git 任务。

Git 的主要优势之一就是它能够将工作“分叉”到不同的分支中。

如果只有你一个人在使用某个存储库,分支的好处是有限的。但是,一旦你开始与许多其他贡献者一起工作,分支就变得必不可少。Git 的分支机制允许多人同时处理一个项目,甚至是同一个文件。用户可以引入不同的功能,彼此独立,然后稍后将更改合并回主分支。那些专门为一个目的创建的分支,有时也被称为 主题分支 topic branch ,例如添加新功能或修复已知错误。

当你开始使用分支,了解如何管理它们会很有帮助。以下是开发者在现实世界中使用 Git 分支执行的最常见任务。

重命名分支

有时候,你或许会错误地命名了一个分支,或者你会想要在内容合并到主分支后,使用同一个分支在不同的错误或任务之间切换。在这种情况下,重命名主题分支就会很有帮助。

重命名本地分支

1、重命名本地分支:

$ git branch -m <old_branch_name> <new_branch_name>

当然,这只会重命名你的分支副本。如果远程 Git 服务器上存在该分支,请继续执行后续步骤。

2、推送这个新分支,从而创建一个新的远程分支:

$ git push origin <new_branch_name>

3、删除旧的远程分支:

$ git push origin -d -f <old_branch_name>

重命名当前分支

当你要重命名的分支恰好是当前分支时,你不需要指定旧的分支名称。

1、重命名当前分支:

$ git branch -m <new_branch_name>

2、推送新分支,从而创建一个新的远程分支:

$ git push origin <new_branch_name>

3、删除旧的远程分支:

$ git push origin -d -f <old_branch_name>

使用 Git 删除本地和远程分支

为了保持存储库的整洁,通常建议你在确保已将内容合并到主分支后,删除临时分支。

删除本地分支

删除本地分支只会删除系统上存在的该分支的副本。如果分支已经被推送到远程存储库,它仍然可供使用该存储库的每个人使用。

1、签出存储库的主分支(例如 mainmaster):

$ git checkout <central_branch_name>

2、列出所有分支(本地和远程):

$ git branch -a

3、删除本地分支:

$ git branch -d <name_of_the_branch>

要删除所有本地主题分支并仅保留 main 分支:

$ git branch | grep -v main | xargs git branch -d

删除远程分支

删除远程分支只会删除远程服务器上存在的该分支的副本。如果你想撤销删除,也可以将其重新推送到远程(例如 GitHub),只要你还有本地副本即可。

1、签出存储库的主分支(通常是 mainmaster):

$ git checkout <central_branch_name>

2、列出所有分支(本地和远程):

$ git branch -a

3、删除远程分支:

$ git push origin -d <name_of_the_branch>

查看远程主题分支的作者

如果你是存储库管理员,你可能会有这个需求,以便通知未使用分支的作者它将被删除。

1、签出存储库的主分支(例如 mainmaster):

$ git checkout <central_branch_name>

2、删除不存在的远程分支的分支引用:

$ git remote prune origin

3、列出存储库中所有远程主题分支的作者,使用 --format 选项,并配合特殊的选择器来只打印你想要的信息(在本例中,%(authorname)%(refname) 分别代表作者名字和分支名称):

$ git for-each-ref --sort=authordate --format='%(authorname) %(refname)' refs/remotes

示例输出:

tux  refs/remotes/origin/dev
agil refs/remotes/origin/main

你可以添加更多格式,包括颜色编码和字符串操作,以便于阅读:

$ git for-each-ref --sort=authordate \
    --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)%(align:25,left)%(color:yellow) %(authorname)%(end)%(color:reset)%(refname:strip=3)' \
    refs/remotes

示例输出:

01/16/2019 03:18 PM tux      dev
05/15/2022 10:35 PM agil     main

你可以使用 grep 获取特定远程主题分支的作者:

$ git for-each-ref --sort=authordate \
    --format='%(authorname) %(refname)' \
    refs/remotes | grep <topic_branch_name>

熟练运用分支

Git 分支的工作方式存在细微差别,具体取决于你想要分叉代码库的位置、存储库维护者如何管理分支、 压扁 squashing 变基 rebasing 等。若想进一步了解该主题,你可以阅读下面这三篇文章:


via: https://opensource.com/article/22/5/git-branch-rename-delete-find-author

作者:Agil Antony 选题:lkxed 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出