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

13

我经常遇到以下情况:

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 "我的超级简单提交"


我有一堆文件,想在不同提交中包含它们。好的,你实际上想做什么需要这样做吗?所有文件都包含在任何git存储库中。如果更改文件,则更改会存在于某个分支上,即使只是主分支。您尝试实现的目标(大局)是什么导致您提出此问题? - Michael Durrant
所以,你想要像 git commit -a -m "...." 这样的东西,但它应该是有选择性的(不像 -a 一样将所有修改过的文件全部加入提交)?这确实听起来像是一个有趣的功能,可以节省一些时间。 - Slizzered
听起来你正在寻找一个git的接口,类似于Magit这样的东西,也许?https://www.masteringemacs.org/article/introduction-magit-emacs-mode-git - asjo
我会创建一个.gitignore文件,以排除您不想添加的所有路径或排除所有文件并指定要包含的文件。然后使用git add . --all,接着进行git commit。这里有一个可能会有所帮助的链接:http://stackoverflow.com/questions/30322696/git-missing-some-files/30322823#30322823 - Peter Paul Kiefer
1
@MichaelDurrant 大局很简单。想象一下,您在git存储库中修改了多个文件,并且您所做的更改在语义上属于不同的提交。#Slizzered 这正是我想做的。理想情况下,不是通过逐个指定路径,而是通过git状态显示某种枚举,如我的问题所示,以便更轻松地选择文件。#Peter Paul Kiefer 我觉得这听起来很繁琐。 - ben
显示剩余7条评论
1个回答

20

示例仓库:

我使用了一个包含四个文件的示例仓库:a、b、c、d。
其中,a 被跟踪、修改并暂存;b 被跟踪、修改但未暂存;c 未被跟踪但已暂存;d 未被跟踪。

enter image description here

外部工具: git-number

当不带参数运行时,'git number' 会运行 'git status' 并为 'git status' 打印的每个文件名的每一行附加一个唯一的编号,并且它将“记住”这个编号与文件名的对应关系。当带有参数运行时,例如:

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

“git number”将运行该命令,并将所有数字替换为它们相应的文件名。非数字参数将原封不动地传递给git。

enter image description here

这可与其他命令一起使用。

enter image description here

外部工具: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参考文档:

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

你可以记住这个选项是-intuitive,因为界面非常直观。至少对于狂热的Vim用户而言是这样。

打开交互模式: enter image description here

添加(暂存)已跟踪的文件: enter image description here

添加未跟踪的文件: enter image description here

查看更改: enter image description here

如果你在添加过程中卡住了,可以按下空字符串的Return键。

注意:

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

1
@PeterPaulKiefer:git add -i 可以完成 git add 的所有功能。因此,它可以添加更新的文件并删除它们。 - Jean Hominal
@NickVolynkin 是的,我认为数字工具是解决方案。我以前不知道这个。谢谢你。 - Peter Paul Kiefer
顺便说一句,如果你用的是 Mac,git-number 可以在 Homebrew 中获取。 - Nick Volynkin
@JeanHominal git add 只允许使用 --all 开关来删除文件,没有机会选择文件。但你指出了一个问题。如果 git add 不允许我从暂存区中删除文件,那么我该如何避免提交它们呢?如果我打算将已经暂存的文件分别添加到不同的提交中,这就是一个问题。git rm --cached 可以完成这项工作。我认为 GUI 也是这样做的。Nick Volynkin 提到的 number 工具也可以处理这个问题。 - Peter Paul Kiefer
1
@PeterPaulKiefer 使用 git reset <文件名> 命令来取消暂存的文件。 - Nick Volynkin
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接