写点什么

分享几个你可能不知道的交互式 Git 命令

  • 2022 年 3 月 02 日
  • 本文字数:3082 字

    阅读完需:约 10 分钟

本文分享自华为云社区《Git你有可能不知道交互式暂存》,作者:龙哥手记。


本节中的几个交互式 Git 命令可以帮助你将文件的特定部分组合成提交。 当你在修改了大量文件后,希望这些改动能拆分为若干提交而不是混杂在一起成为一个提交时,这几个工具会非常有用。 通过这种方式,可以确保提交是逻辑上独立的变更集,同时也会使其他开发者在与你工作时很容易地审核。 如果运行 git add 时使用 -i 或者 --interactive 选项,Git 将会进入一个交互式终端模式,显示类似下面的东西:

 $ git add -i            staged     unstaged path   1:    unchanged        +0/-1 TODO   2:    unchanged        +1/-1 index.html   3:    unchanged        +5/-1 lib/simplegit.rb *** Commands ***   1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked   5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp What now>
复制代码

可以看到这个命令以和平时非常不同的视图显示了暂存区——基本上与 git status 是相同的信息,但是更简明扼要一些。 它将暂存的修改列在左侧,未暂存的修改列在右侧。


在这块区域后是“Commands”命令区域。 在这里你可以做一些工作,包括暂存文件、取消暂存文件、暂存文件的一部分、添加未被追踪的文件、显示暂存内容的区别。

暂存与取消暂存文件


如果在 What now> 提示符后键入 u 或 2(更新),它会问你想要暂存哪个文件:

 What now> u            staged     unstaged path   1:    unchanged        +0/-1 TODO   2:    unchanged        +1/-1 index.html   3:    unchanged        +5/-1 lib/simplegit.rb Update>>
复制代码

要暂存 TODO 和 index.html 文件,可以输入数字:

 Update>> 1,2            staged     unstaged path * 1:    unchanged        +0/-1 TODO * 2:    unchanged        +1/-1 index.html   3:    unchanged        +5/-1 lib/simplegit.rb Update>>
复制代码

每个文件前面的 * 意味着选中的文件将会被暂存。 如果在 Update>> 提示符后不输入任何东西并直接按回车,Git 将会暂存之前选择的文件:

 Update>> updated 2 paths *** Commands ***   1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked   5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp What now> s            staged     unstaged path   1:        +0/-1      nothing TODO   2:        +1/-1      nothing index.html   3:    unchanged        +5/-1 lib/simplegit.rb
复制代码

现在可以看到 TODO 与 index.html 文件已经被暂存而 simplegit.rb 文件还未被暂存。 如果这时想要取消暂存 TODO 文件,使用 r 或 3(撤消)选项:

 *** Commands ***   1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked   5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp What now> r            staged     unstaged path   1:        +0/-1      nothing TODO   2:        +1/-1      nothing index.html   3:    unchanged        +5/-1 lib/simplegit.rb Revert>> 1            staged     unstaged path * 1:        +0/-1      nothing TODO   2:        +1/-1      nothing index.html   3:    unchanged        +5/-1 lib/simplegit.rb Revert>> [enter] reverted one path
复制代码

再次查看 Git 状态,可以看到已经取消暂存 TODO 文件:

 *** Commands ***   1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked   5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp What now> s            staged     unstaged path   1:    unchanged        +0/-1 TODO   2:        +1/-1      nothing index.html   3:    unchanged        +5/-1 lib/simplegit.rb
复制代码

如果想要查看已暂存内容的区别,可以使用 d 或 6(区别)命令。 它会显示暂存文件的一个列表,可以从中选择想要查看的暂存区别。 这跟你在命令行指定 git diff --cached 非常相似:

 *** Commands ***   1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked   5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp What now> d            staged     unstaged path   1:        +1/-1      nothing index.html Review diff>> 1 diff --git a/index.html b/index.html index 4d07108..4335f49 100644 --- a/index.html +++ b/index.html @@ -16,7 +16,7 @@ Date Finder  <p id="out">...</p> -<div id="footer">contact : support@github.com</div> +<div id="footer">contact : email.support@github.com</div>  <script type="text/javascript">
复制代码

通过这些基本命令,可以使用交互式添加模式来轻松地处理暂存区。


暂存补丁

Git 也可以暂存文件的特定部分。 例如,如果在 simplegit.rb 文件中做了两处修改,但只想要暂存其中的一个而不是另一个,Git 会帮你轻松地完成。 在和上一节一样的交互式提示符中,输入 p 或 5(补丁)。 Git 会询问你想要部分暂存哪些文件;然后,对已选择文件的每一个部分,它都会一个个地显示文件区别并询问你是否想要暂存它们:

 diff --git a/lib/simplegit.rb b/lib/simplegit.rb index dd5ecc4..57399e0 100644 --- a/lib/simplegit.rb +++ b/lib/simplegit.rb @@ -22,7 +22,7 @@ class SimpleGit    end    def log(treeish = 'master') -    command("git log -n 25 #{treeish}") +    command("git log -n 30 #{treeish}")    end    def blame(path) Stage this hunk [y,n,a,d,/,j,J,g,e,?]?
复制代码

这时有很多选项。 输入 ? 显示所有可以使用的命令列表:

Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?y - stage this hunkn - do not stage this hunka - stage this and all the remaining hunks in the filed - do not stage this hunk nor any of the remaining hunks in the fileg - select a hunk to go to/ - search for a hunk matching the given regexj - leave this hunk undecided, see next undecided hunkJ - leave this hunk undecided, see next hunkk - leave this hunk undecided, see previous undecided hunkK - leave this hunk undecided, see previous hunks - split the current hunk into smaller hunkse - manually edit the current hunk? - print help
复制代码

通常情况下可以输入 y 或 n 来选择是否要暂存每一个区块, 当然,暂存特定文件中的所有部分或为之后的选择跳过一个区块也是非常有用的。 如果你只暂存文件的一部分,状态输出可能会像下面这样:

What now> 1           staged     unstaged path  1:    unchanged        +0/-1 TODO  2:        +1/-1      nothing index.html  3:        +1/-1        +4/-0 lib/simplegit.rb
复制代码

simplegit.rb 文件的状态很有趣。 它显示出若干行被暂存与若干行未被暂存。 已经部分地暂存了这个文件。 在这时,可以退出交互式添加脚本并且运行 git commit 来提交部分暂存的文件。


也可以不必在交互式添加模式中做部分文件暂存——可以在命令行中使用 git add -p 或 git add --patch 来启动同样的脚本。


更进一步地,可以使用 git reset --patch 命令的补丁模式来部分重置文件, 通过 git checkout --patch 命令来部分检出文件与 git stash save --patch 命令来部分暂存文件。 我们将会在接触这些命令的高级使用方法时了解更多详细信息。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
分享几个你可能不知道的交互式Git 命令_git_华为云开发者社区_InfoQ写作平台