【问题标题】:How to commit specific file in index?如何在索引中提交特定文件?
【发布时间】:2014-07-15 09:54:28
【问题描述】:

例子:

» 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

如果我修改了一个名为a的文件,并将其部分添加到index,并且索引中还有一个名为b的文件。

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

我使用的方式是使用git commit -p,输入n不上台。或git commit -p file,然后选择我想要的部分。

但是如果文件 a 中的部分已经添加到索引中,有没有更好的方法将文件 a 直接提交到索引部分?


补充:

我认为这可能是对 git 的错误使用。

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

显然文件 b 还没有准备好提交,所以它应该在工作目录中。

【问题讨论】:

  • 如果我理解正确,您已经有了要在索引上提交的更改?如果是这样,一个简单的git commit 就足够了。如果您愿意,我会发布更具体的答案。
  • git commit 将提交索引中的所有文件,但我只想提交索引中的文件a,而不是包含文件b(在索引中),并且不包含工作目录中的文件a。跨度>

标签: git


【解决方案1】:

git commit a 将仅提交 a 并将 b 暂存。

这是来自man page 的示例:

$ edit hello.c hello.h
$ git add hello.c hello.h
$ edit Makefile
$ git commit Makefile

这会进行一次提交,记录对 Makefile 的修改。为 hello.c 和 hello.h 暂存的更改不包含在生成的提交中。但是,它们的更改并没有丢失 — 它们仍然是阶段性的,只是被阻止了。

【讨论】:

  • 只有提交特定文件in indexgit commit file 才会提交indexworking directory 中的更改。
【解决方案2】:

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

听起来你根本不想跟踪b

git rm --cached b
echo b >> .gitignore
git add .gitignore
git commit -m "Add a, ignore b"

但是如果你想跟踪b,只要确保你想添加任何修改,那么你can use git update-index

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

【讨论】:

  • 我要跟踪b,而文件b是另一个人添加的,所以我想指定index中的文件提交,并在提交后保留b在索引中。
  • @TankyWoo 那么我的回答的第二部分是给你的:b 仍然被跟踪(不在索引中,但你不需要它,除非“另一个人”在同一个工作树中工作比你在同一台机器上)
  • 在第二部分,首先应该重置更改,update-index --skip-worktree 只是将此文件“隐藏”到工作树中,然后我可能需要做--no-skip-worktree
  • 我已经更新了我的问题,也许我问的场景是对git的错误使用。
  • @TankyWoo 确实,提交不是针对文件,而是针对所有索引内容,因此需要先清理该索引。
猜你喜欢
  • 2012-01-16
  • 2019-08-21
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
相关资源
最近更新 更多