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