如何在没有对同一文件进行其他更改且没有分阶段重命名的情况下,仅提交“git add -p file”更改?

问题描述 投票:1回答:2

问题是,我不能在文件中部分提交四行的更改,在该文件中大约200个左右的更改行。这可能是由于我错误地做了命令然后据说纠正了。我是一位经验丰富的git用户,我以前做过这样的任务,但我总是这样做而不会犯错。

这就是我做的。

我有一个文件有3或4个更改,包括我认为可能需要的文件,即使其他更改太实验。

我也有一些重命名的文件,所以重命名是暂存的。

我做了通常的git add -p file步骤,并确认git diff --cached file显示我想要检查的更改。

我不小心做了git commit -m "Message"(省略了我应该包含的文件名)并且它提交了(暂存的)重命名,这是不需要的,以及file

然后我用git reset HEAD~1 --soft支持了这个提交。这取消了提交,但让file处于暂停状态,所有的变化,而不仅仅是add -p的变化,如git diff --cached file所示。

因为我不希望所有更改暂挂进行提交,我使用git reset HEAD file重置文件。在这一点上,git statusgit diff似乎表明我回到了git add -p file命令之前的状态。

问题是,在这一点上,如果我执行以下操作,只在添加期间接受了所需的更改,

git add -p file
git commit file -m "Message"

状态显示file已提交的所有更改。提交完成后,行计数显示太多行。

我现在怎么只承诺我在git add -p file期间选择的东西,因为我似乎被禁止这样做?

评论:通常我没有暂存的重命名,所以通常我不必尝试指定我想要提交的文件。我认为git commit file的含义不是我为了我的目的所需要的意思。从阅读手册页开始,我认为它试图说的是,当你执行file时,git commit file上演的内容并不重要,它将提交该文件的完整变更集。在让我以交互方式选择更改后,git commit -p file将为file做正确的事情,但它也将承诺上演的无关联的重命名。

git git-commit git-add
2个回答
4
投票

编辑:对于实用的方法,而不是背景,请参阅我赞成的RomainValeri's answer。请注意,git reset默认为mixed;它会将旧文件名恢复到索引,以便比较索引和工作树,Git会认为某些文件是以新名称删除和创建的。如果删除但已创建的新名称文件的内容足够相似,Git会将其称为“重命名”。

(你也可以使用git stash,虽然我一般建议避免使用git stash .git stash做的是做两个新的提交,保持当前索引状态和当前工作树状态,不在任何分支上。然后重置索引和work-tree a la git reset --hard。你可以稍后将这两个提交恢复到你的索引和工作树,但是当这样做时一定要使用git stash apply --indexgit stash pop --index。如果没有--indexgit stash会忽略保存的索引!)


错误是在file中提到git commit file -m "Message"

git commit中设置文件名相当于要求git commit --onlydescribed in the git commit documentation,尽管在我看来,并不是那么好。

准确的细节是复杂的,但是,为了(过度?)简化它并以更可解释的方式,git commit --only file(s)大致相当于:

mv .git/index .git/index-save   # shelve your proposed commit away
git reset --mixed               # go back to the current commit
git add file(s)                 # set up new proposed commit
git commit                      # now MAKE that commit
mv .git/index-save .git/index   # restore the earlier proposed commit
git add file(s)                 # overwrite the same files in it as before

这有点类似于,但显然比git commit --include file(s)更复杂,大致相当于:

git add file(s)                 # update the proposed commit
git commit                      # make the commit

请注意,任何一个都会破坏你使用file仔细设置的第三版git add -p。请记住,每个文件都有三个活动副本:

  • HEAD的冷冻的,你可以用git show HEAD:file看到,
  • 索引中有可塑性的Git-ified,你可以用git show :file看到,和
  • 工作树中的普通工具,你可以用普通的方式看到并使用它,而不使用Git。

git add所做的是将工作树文件复制到索引中,覆盖以前的所有内容。 git add -p所做的是选择性地更新索引中的那个,通过将它与工作树中的那个进行比较,向您显示每个差异,并允许您一次修补一个索引副本。所以git add -p构建了一个与HEAD副本和工作树副本不同的索引副本。

请注意,索引已包含每个其他文件的副本。这就是使它成为新提议的提交的原因:在任何时候,它都准备好了所有文件。


2
投票

除非您的上下文中的其他内容使其不切实际,否则为什么不呢

git reset HEAD
git add -p file
git commit -m "Message"

当然,之后您必须将重命名的文件和其他更改重新添加到索引以进行下一次提交,但这似乎是最直接的操作过程。

© www.soinside.com 2019 - 2024. All rights reserved.