Git 如何在索引中提交特定文件?

Git 如何在索引中提交特定文件?,git,Git,例如: » git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: a modified: b Changes not staged for commit: (use "git add <file>..." to update what will be committed) (

例如:

» git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   a
    modified:   b

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   a
»git状态
论分行行长
要提交的更改:
(使用“git重置磁头…”取消分级)
修改:a
修改:b
未为提交而暂存的更改:
(使用“git add…”更新将提交的内容)
(使用“git签出--…”放弃工作目录中的更改)
修改:a
如果我修改了一个名为a的文件,并将其部分添加到
索引
,那么索引中也有一个名为b的文件

我只想在索引中提交文件a,在工作目录中既不包括b也不包括a

我使用的方法是使用
gitcommit-p
并输入
n
以不进行stage。或者
git commit-p file
并选择我想要的部分

但是,如果文件a中的部分已经是外接程序索引,是否有更好的方法来直接提交文件a中的仅索引部分


补编:

我想这可能是git的错误用法

只有要在下一次提交中提交的更改才应添加到 索引


显然,文件b没有准备提交,因此它应该在工作目录中。

git commit a
将只提交
a
,而将
b
保留在暂存状态

以下是来自以下方面的示例:

这将进行一次提交,记录对Makefile的修改。为hello.c和hello.h进行的更改不包括在结果提交中。但是,它们的更改并没有丢失 — 他们仍在上演,只是被阻止了

我只想在索引中提交文件a,在工作目录中既不包括b也不包括a

听起来您根本不想跟踪
b

git rm --cached b
echo b >> .gitignore
git add .gitignore
git commit -m "Add a, ignore b"
但是,如果要跟踪
b
,只需确保要对其添加任何修改,那么您:


如果我理解正确,您已经有了要在索引上提交的更改了吗?如果是这样,一个简单的
git提交就足够了。如果你愿意,我会发布一个更具体的答案。
git commit
将提交索引中的所有文件,但我只想在索引中提交文件a,不包括文件b(在索引中),也不包括工作目录中的文件a。我想跟踪b,而文件b是由另一个人添加的,因此我想在
index
中指定要提交的文件,提交后将b保留在索引中。@TankyWoo那么我的答案的第二部分是给你的:b保留在第二部分中(不在索引中,但你不需要它,除非“另一个人”在同一个工作树中工作,而不是在同一台机器上工作),首先应该重置更改,和
更新索引--skip worktree
只是将此文件“隐藏”到工作树,然后可能我需要执行
--no skip worktree
。我已经更新了我的问题,可能我问的情况是git使用错误。@TankyWoo确实,提交不是针对文件,而是针对所有索引内容,因此需要首先清理该索引。只有在索引中提交特定的文件
git提交文件
,才能提交
索引和
工作目录中的更改。
git rm --cached b
echo b >> .gitignore
git add .gitignore
git commit -m "Add a, ignore b"
git reset -- b # will unstage (remove from index)
git update-index --skip-worktree -- b
...
# when ready to add b
git update-index --no-skip-worktree -- b
git add -- b