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

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

 $ git add -istaged     unstaged path1:    unchanged        +0/-1 TODO2:    unchanged        +1/-1 index.html3:    unchanged        +5/-1 lib/simplegit.rb​*** Commands ***1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elpWhat now>

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

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

暂存与取消暂存文件

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

 What now> ustaged     unstaged path1:    unchanged        +0/-1 TODO2:    unchanged        +1/-1 index.html3:    unchanged        +5/-1 lib/simplegit.rbUpdate>>

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

 Update>> 1,2staged     unstaged path* 1:    unchanged        +0/-1 TODO* 2:    unchanged        +1/-1 index.html3:    unchanged        +5/-1 lib/simplegit.rbUpdate>>

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

 Update>>updated 2 paths​*** Commands ***1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elpWhat now> sstaged     unstaged path1:        +0/-1      nothing TODO2:        +1/-1      nothing index.html3:    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 untracked5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elpWhat now> rstaged     unstaged path1:        +0/-1      nothing TODO2:        +1/-1      nothing index.html3:    unchanged        +5/-1 lib/simplegit.rbRevert>> 1staged     unstaged path* 1:        +0/-1      nothing TODO2:        +1/-1      nothing index.html3:    unchanged        +5/-1 lib/simplegit.rbRevert>> [enter]reverted one path

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

 *** Commands ***1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elpWhat now> sstaged     unstaged path1:    unchanged        +0/-1 TODO2:        +1/-1      nothing index.html3:    unchanged        +5/-1 lib/simplegit.rb

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

 *** Commands ***1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elpWhat now> dstaged     unstaged path1:        +1/-1      nothing index.htmlReview diff>> 1diff --git a/index.html b/index.htmlindex 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.rbindex dd5ecc4..57399e0 100644--- a/lib/simplegit.rb+++ b/lib/simplegit.rb@@ -22,7 +22,7 @@ class SimpleGitend​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 hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

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

What now> 1staged     unstaged path1:    unchanged        +0/-1 TODO2:        +1/-1      nothing index.html3:        +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 命令来部分暂存文件。 我们将会在接触这些命令的高级使用方法时了解更多详细信息。

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

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

  1. externalreferences 命令在 sdi 模式下不可用_一个适合新手交互式Git命令学习项目

    前言 在我们日常工作开发中,Git是必不可少的版本控制软件,很多时候我们都用Git来管理我们的项目. 比较常用的有Github,Gitlab,Stash等. 因此对于Git命令的掌握是我们工作必备的能 ...

  2. git隐藏修改_您可能不知道的有关Git隐藏的有用技巧

    git隐藏修改 I have launched a newsletter Git Better to help learn new tricks and advanced topics of Git. ...

  3. 你可能不知道的关于 Git stash 的技巧

    简评:如果你用过一段时间的 Git,你可能会用过 Git stash 命令.它是 Git 最有用的功能之一. 以下是一些我在上周学的关于 Git stash 的技巧. Git stash save G ...

  4. 苹果最新系统ios7_手机资讯:你绝对不知道的iOS7隐藏功能

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多知识的,这些知识很多小伙伴一般都是不知道的,就好比最近就有很多小伙伴们想要知道你绝对不知道的iOS7隐藏功能,那么既然现在大家对 ...

  5. 你可能不知道的Shell

    Shell也叫做命令行界面,它是*nix操作系统下用户和计算机的交互界面.Shell这个词是指操作系统中提供访问内核服务的程序. 这篇文章向大家介绍Shell一些非广为人知.但却实用有趣的知识,权当品 ...

  6. 你可能不知道的5种 CSS 和 JS 的交互方式

    翻译人员: 铁锚 翻译日期: 2014年01月22日 原文日期: 2014年01月20日 原文链接:  5 Ways that CSS and JavaScript Interact That You ...

  7. ai的弹窗点了都不响应_【评价集合】拼多多评价,你所不知道的点都在这里!...

    对于在拼多多开店的商家们来说,评价是消费者对于商品的好坏程度的一个评分,评价的高低不仅仅会影响到商品的销量,更会影响转化率以及权重!所以为了店铺商品的长远发展打算!各位商家在求取出评.好评的道路上不断 ...

  8. 图片浏览器每次只能打开一张图片_那些你可能不知道的浏览器奇技淫巧

    搬运自我的公众号文章 那些你可能不知道的浏览器奇技淫巧 平常工作少不了用浏览器,以下分享一些浏览器的使用技巧,更好的有助于你的工作. ps: 以下技巧均在 Chrome 浏览器下测试的. 网页长截图 ...

  9. 你也许不知道的Vuejs - 前言

    by yugasun from yugasun.com/post/you-ma- 本文可全文转载,但需要保留原作者和出处. 写在最前 <你也许不知道的Vuejs>系列文章是本人在过去一年多 ...

最新文章

  1. httpd服务的访问控制
  2. 聚类算法-最大最小距离算法(实例+代码)
  3. CV_LOAD_IMAGE_COLOR 和 CV_BGR2RGBA找不到定义
  4. linux学习笔记:如何更改文件属性?
  5. 循环语句—C#基础回顾
  6. Idea中@Autowired 黄色波浪线问题,注入类显示红色波浪线,去除重复代码导致的波浪黄线,去除xml文件里sql语句的黄色行背景色,问题解决
  7. 解决AxureRP经常性损坏问题
  8. 强大的支持多文件上传的jQuery文件上传插件Uploadify
  9. FPGA虚拟化:突破次元壁的技术
  10. T3.2是什么级别?
  11. ArchLinux安装错误”Errors occured, no packages were upgraded. ⇒ ERROR: Failed to install packages to new“
  12. [SV]SystemVerilog Structured Procedures --- always_comb、always_ff、always_latch
  13. Pandas 实用技能,数据筛选 query 函数详细介绍
  14. Python小记(一):import和from。。。import区别?
  15. 2021/9/2 BLE PRA 广播包
  16. python爬虫打造_Python爬虫与AI结合,打造诗歌接龙程序!
  17. Linux 快照 (snapshot) 原理与实践(二) 快照功能实践
  18. 微信小程序 从零开发房屋租赁平台
  19. 计算机的新兴技术在测绘工程领域的应用,测绘新技术在测绘工程测量中应用的探讨张晨(原稿)...
  20. 长尾词是什么?如何做长尾关键词排名?

热门文章

  1. jggrid标红列和动态标红行的几种方法
  2. Java一年,面试总结
  3. 安装Bootstrap3源码版本
  4. ajax get 不会缓存,ajax的get请求时缓存处理解决方法
  5. git 添加用户名和邮箱_Git实用教程(二) | Git简介及安装详解
  6. a3967驱动_以A3967SLB为核心的步进电机控制系统设计
  7. php socket_create_listen(),socket_create_listen()
  8. linux mkswap -p参数,Linux基础命令---mkswap
  9. 小甲鱼python课后题简书_【Python爬虫】-笨办法学 Python 习题01-10
  10. linux下mysql5.7的安装教程_linux下mysql 5.7.18安装教程 邯郸