如何通过 git status 中的编号在 git 中添加特定文件?

Posted

技术标签:

【中文标题】如何通过 git status 中的编号在 git 中添加特定文件?【英文标题】:How to add specific files in git by their number in git status? 【发布时间】:2015-08-05 08:58:23 【问题描述】:

我经常遇到如下场景:

modified:   assembly/main.debug.s
modified:   ../src/cd/Config.java
modified:   ../src/cd/memoization/cfg/SubgraphFinder.java
modified:   ../src/cd/memoization/cfg/SubgraphMap.java
modified:   ../src/cd/profiler/Profile.java
modified:   ../test/cd/test/TestSamplePrograms.java
modified:   ../../notes/20150521.txt

这里我有一堆文件,我想将它们包含在不同的提交中。到目前为止我所做的是做一堆git add <pathspec>,然后是相应的git commit<pathspec> 让我很恼火。有没有像下面这样的?

1 modified:   assembly/main.debug.s
2 modified:   ../src/cd/Config.java
3 modified:   ../src/cd/memoization/cfg/SubgraphFinder.java
4 modified:   ../src/cd/memoization/cfg/SubgraphMap.java
5 modified:   ../src/cd/profiler/Profile.java
6 modified:   ../test/cd/test/TestSamplePrograms.java
7 modified:   ../../notes/20150521.txt

git magic 2,3,5 -m "My super simple commit"

【问题讨论】:

“我有一堆文件,我想将它们包含在不同的提交中”。好的,那么您实际上想要做什么?所有文件都包含在任何 git repo 中。如果您更改文件,则更改存在于某处的分支上,即使只是 master。您试图实现什么(大图)导致您提出这个问题? 那么,你想要git commit -a -m "...." 之类的东西,但它应该是有选择性的(不是所有修改过的文件都像-a 那样)?这听起来确实是一个有趣的功能,可以节省一些时间 听起来您正在寻找 git 的接口,也许像 Magit 之类的? masteringemacs.org/article/introduction-magit-emacs-mode-git 我会创建一个 .gitignore 文件来排除您不想添加的所有路径或排除所有文件并指定要包含的一次。然后使用git add . --all,然后使用 git commit。这是一个可能有帮助的链接:***.com/questions/30322696/git-missing-some-files/… @MichaelDurrant 大局很简单。想象一下,您在 git 存储库中修改了多个文件,并且您所做的更改在语义上属于不同的提交。 #Slizzered 这正是我想做的。理想情况下,不是通过单独指定路径,而是通过 git status 显示某种枚举,就像我的问题一样,以便更轻松地选择文件。 #Peter Paul Kiefer 这对我来说听起来很乏味。 【参考方案1】:

示例代码库:

我正在使用包含四个文件的示例 repo:a、b、c、d。 这里a被跟踪、更改和上演; b 被跟踪、更改且未上演; c 在未跟踪和上演; d 只是未被追踪。

外部工具:git-number

当不带参数运行时,'git number' 运行 'git status' 并为 'git status' 打印的每一行文件名附加一个唯一的数字,它会“记住”这个数字到文件名的关联。使用参数运行时,如下所示:

$ git number <any git command> [one or more numbers or git options/args]

'git number' 将运行它并将所有数字替换为它们的等效文件名。非数字参数原封不动地传递给 git。

这适用于其他命令。

外部工具:SCM Breeze

SCM Breeze 是一组 shell 脚本(用于 bash 和 zsh),可增强您与 git 的交互。它与您的 shell 集成,为您提供编号的文件快捷方式、带有选项卡完成的存储库索引以及许多其他有用的功能。

SCM Breeze 利用键盘快捷键和别名按编号处理 git 文件:

Ctrl + x, c => git_add_and_commit - 添加给定文件(如果有),然后提交分段更改

Ctrl + x, Space => git_commit_all - 提交所有内容

git add:

$ ga 1

git diff:

$ gd 2

git reset:

$ grs 3

git commit:

$ gco 4

git add -i 的原生方式

git add -i

来自Git reference:

-i--交互式 以交互方式将工作树中的修改内容添加到索引中。可以提供可选的路径参数来限制对工作树子集的操作。有关详细信息,请参阅“交互模式”。

您可以记住这是-intuitive,因为界面非常直观。好吧,至少对于核心 Vim 用户而言。

开启交互模式:

添加(暂存)跟踪文件:

添加未跟踪的文件:

查看更改:

如果您在添加过程中遇到困难,请使用空字符串点击 Return

注意:

如果您对外观和颜色感到困惑:我一直在使用iTerm2 + zsh + oh-my-zsh。

【讨论】:

据我所知 git -i 只允许向舞台添加未跟踪的路径。这是否也允许添加更新的文件?如果没有,我将如何将它们排除在提交之外? 我添加了一个工具,可以完全满足您的需求。 @PeterPaulKiefer:git add -i 做了git add 可以做的所有事情。因此,它可以添加更新的文件,并删除它们。 @NickVolynkin 是的,我认为数字工具是解决方案。我以前不知道。谢谢。 @PeterPaulKiefer 使用 git reset &lt;filename&gt; 取消暂存文件。

以上是关于如何通过 git status 中的编号在 git 中添加特定文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何登陆git bash窗口,查看git status

如何在不修改 .git/index 的情况下运行 git status - 例如在 PROMPT_COMMAND 中

如何在终端中退出“git status”列表?

如何归档 git status 输出?

Git - git status - 查看当前仓库状态

git 命令 git status add rm commit mv