Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅提交“git add-p file”更改,而不对同一文件进行其他更改,并且不进行阶段性重命名?_Git_Git Commit_Git Add - Fatal编程技术网

如何仅提交“git add-p file”更改,而不对同一文件进行其他更改,并且不进行阶段性重命名?

如何仅提交“git add-p file”更改,而不对同一文件进行其他更改,并且不进行阶段性重命名?,git,git-commit,git-add,Git,Git Commit,Git Add,问题是,我显然无法在一个文件中对大约200行左右更改的行中的四行内容进行部分提交。这可能是因为我错误地执行了命令,然后被认为已经纠正了。我是一个有经验的git用户,以前也做过类似的工作,但我以前一直没有犯错误 这就是我所做的 我有一个文件,其中有3到4个更改,包括一个我认为可能需要的更改,即使其他更改过于实验性 我还有一些重命名的文件,所以重命名是分阶段进行的 我执行了通常的git add-p文件步骤,并验证了git diff-cached文件确实显示了我想要签入的更改 我不小心在git com

问题是,我显然无法在一个文件中对大约200行左右更改的行中的四行内容进行部分提交。这可能是因为我错误地执行了命令,然后被认为已经纠正了。我是一个有经验的git用户,以前也做过类似的工作,但我以前一直没有犯错误

这就是我所做的

我有一个文件,其中有3到4个更改,包括一个我认为可能需要的更改,即使其他更改过于实验性

我还有一些重命名的文件,所以重命名是分阶段进行的

我执行了通常的git add-p文件步骤,并验证了git diff-cached文件确实显示了我想要签入的更改

我不小心在git commit-m消息中忽略了我应该包含的文件名,它提交了不需要的阶段性重命名以及文件名

然后我用git reset HEAD~1-soft退出了提交。这取消了提交,但使文件处于暂存状态,并进行了所有更改,而不仅仅是add-p更改,如git diff-cached文件所示

因为我还不希望所有的更改都被提交,所以我用git reset HEAD file重置了文件。此时,git status和git diff似乎表明我回到了git add-p file命令之前的状态

问题是,在这一点上,如果我只在添加过程中接受所需的更改,然后执行以下操作

git add -p file
git commit file -m "Message"
状态显示提交文件的所有更改。行计数显示提交完成后行数过多

我如何只提交我在git add-p文件中选择的内容,现在我似乎被阻止了这样做


评论:通常我没有分段重命名,因此通常我不必尝试指定要提交的文件。我认为git提交文件的含义不是我的目的所需要的含义。通过阅读手册页,我认为它想说的是,当您执行git提交文件时,文件的暂存内容并不重要,它将提交该文件的完整更改集。另外,git commit-p文件在让我以交互方式选择更改后,将对文件执行正确的操作,但它也将提交已暂存的不相关重命名

除非在你的上下文中有其他东西使它不切实际,为什么不

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

当然,之后您必须为下一次提交重新添加重命名的文件和对索引的其他更改,但这似乎是最简单的操作过程。

除非上下文中有其他内容使其不切实际,为什么不

git reset HEAD
git add -p file
git commit -m "Message"
当然,之后您必须为下一次提交将重命名的文件和其他更改重新添加到索引中,但这似乎是最简单的操作过程。

编辑:有关与背景相反的实际方法,请参阅,我已对其进行了升级。注意,git reset默认为mixed;它会将旧文件名恢复到索引中,这样比较索引和工作树,Git会认为一些文件被删除并以新名称创建。如果删除但以新名称创建的文件的内容足够相似,Git将调用重命名文件

您也可以使用git隐藏,尽管我通常建议避免使用git隐藏。git stash所做的是进行两个新的提交,保存当前索引状态和当前工作树状态,这两个状态不在任何分支上。然后它重置索引和工作树,这是一个git重置困难的过程。稍后您可以将这两个提交恢复到索引树和工作树中,但在执行此操作时,请确保使用git stash apply-index或git stash pop-index。如果没有-index,git stash会忽略保存的索引

错误是在git commit file-m消息中提到了file

在GitCommit中输入文件名相当于只要求GitCommit,尽管在我看来,这并不是很好

确切的细节是复杂的,但是,简单一点,用一种更易于解释的方式来说,git-commit-only文件大致相当于:

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 add file(s)                 # update the proposed commit
git commit                      # make the commit
这有点类似于git commit-include文件,但显然比git commit-include文件复杂,后者大致相当于:

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 add file(s)                 # update the proposed commit
git commit                      # make the commit
请注意,其中任何一个都会销毁您使用GitAdd-p仔细设置的文件的第三个版本。请记住,每个文件始终有三个活动副本:

头部冻结的一个,可以通过git show HEAD:file看到, 索引中有一个可延展但Git化的索引,您可以通过Git show:file看到它,并且 工作树中的普通文件,您可以以普通方式查看和使用它,而无需使用Git。 GitAdd所做的是将工作树文件复制到索引中,覆盖以前存在的任何内容。GitAdd-p所做的是通过将索引中的内容与工作中的内容进行比较,有选择地更新索引中的内容- 树,显示每个差异,并允许您修补索引副本,一次一个。因此GitAdd-p构建了一个索引副本,它不同于头副本和工作树副本

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

编辑:要了解一种实用的方法,与背景相反,请参阅,我对它投了更高的票。注意,git reset默认为mixed;它会将旧文件名恢复到索引中,这样比较索引和工作树,Git会认为一些文件被删除并以新名称创建。如果删除但以新名称创建的文件的内容足够相似,Git将调用重命名文件

您也可以使用git隐藏,尽管我通常建议避免使用git隐藏。git stash所做的是进行两个新的提交,保存当前索引状态和当前工作树状态,这两个状态不在任何分支上。然后它重置索引和工作树,这是一个git重置困难的过程。稍后您可以将这两个提交恢复到索引树和工作树中,但在执行此操作时,请确保使用git stash apply-index或git stash pop-index。如果没有-index,git stash会忽略保存的索引

错误是在git commit file-m消息中提到了file

在GitCommit中输入文件名相当于只要求GitCommit,尽管在我看来,这并不是很好

确切的细节是复杂的,但是,简单一点,用一种更易于解释的方式来说,git-commit-only文件大致相当于:

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 add file(s)                 # update the proposed commit
git commit                      # make the commit
这有点类似于git commit-include文件,但显然比git commit-include文件复杂,后者大致相当于:

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 add file(s)                 # update the proposed commit
git commit                      # make the commit
请注意,其中任何一个都会销毁您使用GitAdd-p仔细设置的文件的第三个版本。请记住,每个文件始终有三个活动副本:

头部冻结的一个,可以通过git show HEAD:file看到, 索引中有一个可延展但Git化的索引,您可以通过Git show:file看到它,并且 工作树中的普通文件,您可以以普通方式查看和使用它,而无需使用Git。 GitAdd所做的是将工作树文件复制到索引中,覆盖以前存在的任何内容。GitAdd-p所做的是有选择地更新索引中的一个,方法是将它与工作树中的一个进行比较,向您显示每个差异,并允许您一次一个地修补索引副本。因此GitAdd-p构建了一个索引副本,它不同于头副本和工作树副本


请注意,该索引还包含其他每个文件的副本。这就是它成为新提议的提交的原因:它随时准备好所有文件。

提交存储整个文件,而不是更改。将提交视为存储更改是引领您走上这条花园之路的原因。每次提交都保存完整的所有文件集。为了让您看到更改,Git提取了两个提交并对它们进行比较。@torek如果您做一些研究和简单的实验,您将了解到Git不应该被描述为存储整个文件,因为它是一种误导性的过于简化。在任何情况下,如果一个东西存储了我更改的文件,它就会存储我的更改。@cardiffspaceman我知道他自己太谦虚了,不能这么说,但请检查torek的活动,即在git标签上。我并没有诉诸他的任何权威,我只是指出,建议他做一些研究和简单的实验充其量只是讽刺,但考虑到目前的情况,可能是侮辱。顺便说一下,git确实将文件存储为blob。每个版本都有一个blob,其中包含此特定版本中的所有内容。不过,我还是愿意纠正我的错误观念。对我来说,简短而真实地回应torek只是一个小小的耐心行为。我不同意我走的是一条花园小径。如果git正在存储diff1的实际输出,或者如果它正在存储每个文件的每个版本的完整副本,那么git add-p文件仍然会意外地被git commit文件覆盖,这是基本信息。commit存储整个文件,而不是更改。将提交视为存储更改是引领您走上这条花园之路的原因。每次提交都保存完整的所有文件集。为了让您看到更改,Git提取了两个提交并对它们进行比较。@torek如果您做一些研究和简单的实验,您将了解到Git不应该被描述为存储整个文件,因为它是一种误导性的过于简化。在任何情况下,如果一个东西存储了我更改的文件,它就会存储我的更改。@cardiffspaceman我知道他自己太谦虚了,不能这么说,但请检查torek的活动,即在git标签上。我并没有诉诸他的任何权威,我只是指出,建议他做一些研究和简单的实验充其量只是讽刺,但考虑到目前的情况,可能是侮辱。顺便说一下,git确实将文件存储为blob。每个
版本具有包含此特定版本中所有内容的blob。不过,我还是愿意纠正我的错误观念。对我来说,简短而真实地回应torek只是一个小小的耐心行为。我不同意我走的是一条花园小径。如果git正在存储diff1的实际输出,或者如果它正在存储每个文件的每个版本的完整副本,那么git add-p文件仍然会意外地被git commit文件覆盖,这是基本信息。重置对挂起的分段重命名有什么作用?如果没有,则提交将提交这些。如果它取消了重命名,那么这些文件在重命名后所做的编辑会发生什么情况?@cardiffspaceman我还不太熟悉git中的重命名逻辑,我相信你,并继续阅读更多关于这个主题的内容:-编辑…我刚刚读了torek的答案。很高兴改名了。感谢他,我感觉像是打破了记录。。。。谢谢?@cardiffspaceman:Git不存储重命名的事实。它只是以新名称存储新内容。如果新内容与旧内容匹配,但两个名称不同,Git可以稍后轻松地发现并将其报告为重命名。但它没有将其存储为重命名此文件操作。它只是存储了新文件的新内容。当前状态是显示git status,并显示git commit的效果,即下一次git commit将更改文件名,而不执行任何其他操作,即使重命名后文件的工作版本已更改。因此,如果git reset HEAD将使我在状态中没有重命名的迹象,那么之后,我只能将重命名的文件与其更改一起暂存,并且在git reset HEAD之后,重命名不能作为单独的提交提交。如果/当您使用git reset,您将从提交头获取文件的原始旧文件名+旧内容副本,并将其复制到索引中。现在HEAD和nextcommit都有一个名为foo.py的文件,Git不会寻找其他类似于foo.py但使用另一个名称的新文件,所以它不会说foo.py重命名为bar.py。如果从索引中重新删除foo.py,但它在新提交后位于HEAD中,并且索引中有一个非常相似的bar.py,Git将再次表示重命名。重置对挂起的分段重命名有什么作用?如果没有,则提交将提交这些。如果它取消了重命名,那么这些文件在重命名后所做的编辑会发生什么情况?@cardiffspaceman我还不太熟悉git中的重命名逻辑,我相信你,并继续阅读更多关于这个主题的内容:-编辑…我刚刚读了torek的答案。很高兴改名了。感谢他,我感觉像是打破了记录。。。。谢谢?@cardiffspaceman:Git不存储重命名的事实。它只是以新名称存储新内容。如果新内容与旧内容匹配,但两个名称不同,Git可以稍后轻松地发现并将其报告为重命名。但它没有将其存储为重命名此文件操作。它只是存储了新文件的新内容。当前状态是显示git status,并显示git commit的效果,即下一次git commit将更改文件名,而不执行任何其他操作,即使重命名后文件的工作版本已更改。因此,如果git reset HEAD将使我在状态中没有重命名的迹象,那么之后,我只能将重命名的文件与其更改一起暂存,并且在git reset HEAD之后,重命名不能作为单独的提交提交。如果/当您使用git reset,您将从提交头获取文件的原始旧文件名+旧内容副本,并将其复制到索引中。现在HEAD和nextcommit都有一个名为foo.py的文件,Git不会寻找其他类似于foo.py但使用另一个名称的新文件,所以它不会说foo.py重命名为bar.py。如果从索引中重新删除foo.py,但它在新提交后出现在HEAD中,并且索引中有一个非常相似的bar.py,Git会再次说重命名。我很感激这个详细的答案,尽管我可能不使用它。我很感激这个详细的答案,尽管我可能不使用它。