已经会用Git了?不会这十招怎么行
创始人
2024-03-01 13:04:57
0

之前我们发了一些教程让你熟悉Git基础在团队合作环境中使用Git.我们讨论的这些Git命令足够让一个开发者在Git的世界里生存下去。在这篇教程里,我们试着探索如何高效地管理你的时间以及如何充分利用Git提供的特性。

注意:这里介绍的命令中有的包含方括号(例如:git add -p [file_name])。在这些例子中,你应该用你自己的数字、标识符等替代方括号里的内容,并且去掉方括号。

1. Git自动补全

如果你在命令行环境中运行Git命令,每次都手动地逐个输入命令是一件很无聊的事。为此,你可以花几分钟时间配置一下Git命令的自动补全功能。

在*nix系统运行下列命令下载自动补全脚本:

cd ~
curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

然后,添加下面的行到你的~/.bash_profile文件:

if [ -f ~/.git-completion.bash ]; then
    . ~/.git-completion.bash
fi

尽管我之前已经提到过,但我还是想再强调一下:如果你想使用完整的Git特性,你绝bi应该切换到命令行环境。

2. 在Git中忽略文件

你是不是对出现在你Git库里面的编译生成文件(比如.pyc)感到很无语?或者你是不是很厌恶不小心将他们添加到了Git?直接看这里,这里有一个方法可以让你告诉Git忽略所有这些文件和目录。只需要创建一个名字为.gitignore的文件,里面列出你不想要Git跟踪的文件和目录。可以用感叹号(!)列出例外情况。

*.pyc
*.exe
my_db_config/

!main.pyc

3. 谁动了我的代码?

当事情出了乱子时立马责怪别人这是人类的天性。如果你的服务器程序不能正常工作了,要找出罪魁祸首是非常简单的–只需要执行git blame。这个命令告诉你文件里的每一行的作者是谁,最后改动那一行的提交,以及提交的时间戳。

git blame [file_name]

在下面的截图里,你可以看到在一个更大的库里这个命令的输出是什么样的:

git blame on the ATutor repository

4. 查看库的历史

在之前的教程里,我们已经看过了如何使用git log命令。不管怎样,有3个选项你应该知道。

  • –oneline - 压缩每次的提交信息,只保留一个缩减的Hash值和说明文字,然后把这些都展示在一行里。
  • –graph - 这个选项将在左边画出一个文字界面的提交历史图。如果你只有一个分支,用这个选项查看历史时是没什么意义的。
  • –all - 显示所有分支历史。

这是这3个选项合起来使用的效果:

Use of git log with all, graph and oneline

5. 不要丢失对某个提交的跟踪

假设你提交了一些不需要的东西,然后你进行了hard重置回到之前的状态。后来,你发现在这个过程中你丢失了其他一些重要的信息,你想要把这些信息找回来,或者至少可以查看一下这些信息。这就需要git reflog帮忙。

简单的git log只能告诉你最近的提交,这个提交的父提交,父提交的父提交,等等。但是git reflog是一个HEAD指向的提交的列表。记住,这个列表依赖于你自己的本地操作环境,它不是库的一部分,也不包含在push或者merge中。

如果执行git log命令,可以看到提交历史,这是我的库的一部分:

Project history

但是,git reflog命令显示了一个被我用hard重置丢掉的提交(b1b0ee9-HEAD@{4}).

Git reflog

6. 暂存文件的一部分更改以便进行一次提交

通常依据特性来提交是一个好的实践方法,意思是说,每一个提交都只添加一个特性或者修复一个bug。想一下如果你一次修复了两个bug或者添加了两个特性但是都还没有逐个提交该怎么办。这种场景下,你可以将他们一起提交。但是有一个更好的办法:单独暂存这些文件,然后分开提交。

让我们假设你对一个文件做了多个更改,然后想让这些更改分开提交。这时,我们用带-p的添加命令。

git add -p [file_name]

我们来试试这种用法。我添加了3个新行到file_name,但是我只想让第1行和第3行出现在我的提交里。让我们看看git diff的输出是什么样的。

Changes in repo

然后,我们看看带-p选项的add命令会发生什么。

Running add with -p

看起来Git认为所有的更改都是同一个目的的一部分,所以把他们分组到同一个块里。这时,你可以:

  • 输入 y 暂存块
  • 输入 n 不暂存块
  • 输入 e 手动编辑块
  • 输入 d 退出或者跳转到下一个文件
  • 输入 s 分割块

在我们这个例子中,我们想把这个块分割成更小的部分,然后选择其中一些忽略另外一些。

Adding all hunks

如你所见,我们已经逐个添加了第1和第3行,忽略了第2行。你可以看到库的状态并且进行一次提交。

Repository after selectively adding a file

7. 合并多个提交

为了进行核查或者发起一个合并请求(这经常发生在开源项目里),对代码进行了修改提交。但在最后代码被接受之前,你也许会需要修改你的代码。于是你修改代码,但是下一次核查的时候又一次需要进行修改。不知不觉中,你就已经有了好几个提交。理论上你应该用rebase命令把他们合并起来。

git rebase -i HEAD~[number_of_commits]

如果你想合并最后的两次提交,你应该运行下面的命令。

git rebase -i HEAD~2

一旦你运行这个命令,你将进入一个交互式界面,它将询问你想要合并哪些提交。你pick(拣选)最近的提交然后squash(合并)旧的提交。

Git squash interactive

接着你应该提供一个对新提交的说明。这个过程会重写你的提交历史。

Adding a commit message

8. 储藏没有提交的更改

假设你正在修复一个bug或者添加一个特性,突然你被要求展示一下你的工作成果。你现在的工作还没有完成,不够进行一次提交。这时,git stash命令可以用来急救一下。Stash命令跟踪你所有的更改,然后把他们储藏起来以便以后使用。命令如下-

git stash

可以多次储藏更改,查看储藏列表,你可以运行下面的命令:

git stash list

Stash list

如果你想取消储藏,覆盖当前的更改,你可以通过下面的命令使用储藏:

git stash apply

在最后的这个截图里,你可以看到每个储藏都有一个标识符,是一个唯一的数字(尽管在这里我们只有一个储藏)。如果你想使用某个储藏,你在apply命令后面加上这个唯一的标识符:

git stash apply stash@{2}

After un-stashing changes

9. 检查丢失的提交

尽管reflog是一种检查丢失提交的方法,大型的库里却不太实用。这个时候,应该用fsck(文件系统检查)命令。

git fsck --lost-found

Git fsck results

这里你可以看到一个丢失的提交。你可以通过git show [commit_hash] 查看提交的更改或者通过运行git merge [commit_hash]命令进行恢复。

git fsck跟reflog命令相比有一个优点。假设你删除了一个远程分支,然后clone了这个库。用fsck命令你可以找到并且恢复这个删除的远程分支。

10. 最佳选择

之前我已经存记下了那些最优雅的Git命令。但是目前为止,cherry-pick命令是我最喜欢的Git命令,因为它直白的名字和实用的功能!

最简单的情况下,cherry-pick从另一个分支里选出单独的一个提交,然后合并到当前分支。如果你正并行工作在两个或者更多的分支上,你也许会发现一个存在于所有分支上的bug。如果你解决了一个分支上的这个bug,你可以拣选这个对应的提交应用到其他分支上,而不会弄乱其他文件或者提交。

让我们来考虑一个可以使用这个命令的场景。我有两个分支,我想拣选b20fd14: Cleaned junk这个提交到另一个分支上。

Before cherry pick

我切换到想要应用这个拣选出来的提交的分支,然后运行下面的命令:

git cherry-pick [commit_hash]

After cherry pick

尽管这次我们很干净的用了cherry-pick命令,但你应该知道这个命令经常会引起冲突,所以请小心使用。

总结

到了这里,我们结束了这个能使你Git能力提升一个级别的列表。Git是最好的版本控制器,它能完成你能想象到的任何事情。所以,经常试着用Git挑战你自己。一不小心你就会学到很多新东西。


via: http://www.sitepoint.com/10-tips-git-next-level/

译者:love_daisy_love 校对:wxy

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

Git

相关内容

可实现三重空间感知:Ai2...
IT之家 8 月 16 日消息,研究机构 Ai2 现已在 GitH...
2025-08-16 18:43:18
微软官宣!将开源Windo...
快科技8月5日消息,微软近日宣布,计划开源Windows 11的用...
2025-08-05 18:42:51
北京人形机器人创新中心发布...
IT之家 7 月 7 日消息,IT之家从北京人形机器人创新中心官方...
2025-07-07 22:14:23
音画同步,AI视频也能有完...
机器之心报道 编辑:泽南 AI 生成的「最后一道关卡」已经突破...
2025-06-27 22:12:41
银河通用X清华大学发布首款...
该论文由清华大学与北京银河通用机器人有限公司合作完成。论文的共同第...
2025-06-12 17:11:39
【Git】pull 分支报...
报错消息 示例图: 示例代码: ➜ ...
2025-06-01 18:31:43

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...