【问题标题】:git add -N followed by git stash - "Cannot merge"git add -N 后跟 git stash -“无法合并”
【发布时间】:2017-05-23 12:38:44
【问题描述】:

我需要存储一组包含新文件的更改 - 没有 deleting ignored directories

所以我尝试了这个:

git add --intent-to-add myNewFile.txt
git stash

结果是:

error: Entry 'myNewFile.txt' not uptodate. Cannot merge.
Cannot save the current worktree state

如何存储修改后的文件以及一个或多个选定的新文件,但不影响任何其他文件或目录(尤其是 .gitignore 中的文件或目录)?

(这不是how can I git stash a specific file? 的重复项,因为这个问题是如何存储以前添加的文件。我的问题是存储一个尚未添加的文件。)

【问题讨论】:

  • 好吧,也许你可以在推送之前完成所有内容后提交它们并重写历史记录。
  • 或者我可以手动将新文件移动到别处。或者我什至可以创建一个临时分支而不是存储。但这不是这个问题要问的。事实上,“无法合并”错误看起来像是一个错误,即使它可能只是 git 中一些深层实现细节的自然结果。
  • 好吧,如果我猜对了,真正的问题是“我怎样才能存储修改后的文件以及一个或多个选定的新文件,但不影响任何其他文件或目录”。我试图为此提出一个可能的解决方案,因为似乎不可能存储特定的未跟踪文件,您可以存储 ALL 未跟踪文件或不存储文件。
  • “意图添加”的东西很老套,只是不能很好地与git stash 配合使用。作为一个不同的 hack,您可以在目录中创建一个空的未跟踪文件,这样当您存储实际添加的实际文件时,Git 不会带走本来空的目录,因为否则为空的目录中有一个未跟踪的空文件。

标签: git git-stash


【解决方案1】:

UPDATE - 具有讽刺意味的是,进一步的测试表明定期提交的效果相对较好。推测性措辞相应修改...


问题似乎在于 git 如何处理没有内容的索引条目。尽管它将围绕占位符条目提交,但stash 不能接受有关它的某些内容。 (我可以想到多个潜在挑战。最明显的是,存储是由提交组成的 - 在数据库中 - 在这种情况下无法表示“计划提交”。错误消息表明致命问题在其他地方,可能与 WIP 提交的组装方式有关。)

您可能只需要git adding 文件(没有-N 选项)就可以解决问题。 这样做的唯一原因是,如果您有其他分阶段更改并且不希望该文件的状态与其他更改混淆。

在这种情况下,一个折衷方案是添加一个空版本的文件(这样防止文件不被跟踪的占位符具有 empty 内容,而不是没有内容的条目) .然后您可以将真实文件放在路径中,它将被“修改”而不是“未跟踪”,因此您可以在没有问题的-u 选项的情况下进行存储。

【讨论】:

  • 我的“预期”文件不是空的,但在我看来逻辑上还没有准备好添加。所以我用--intent-to-add 添加了它。我只是添加,所以我可以藏起来,以期进行回购同步。我决定定期添加,因为我不会遇到你提到的问题。令人困惑的阶段性变化。
猜你喜欢
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2017-01-17
  • 2013-12-22
  • 2012-02-19
  • 2012-12-25
  • 2020-01-05
相关资源
最近更新 更多