【问题标题】:git stash tracked but new filesgit stash 跟踪但新文件
【发布时间】:2020-01-05 12:43:24
【问题描述】:
$ git init
$ git commit -m 'initial commit needed to stash' --allow-empty
$ touch test
$ git add --intent-to-add test  # aka -N
$ git stash
error: Entry 'test' not uptodate. Cannot merge.
Cannot save the current worktree state

它不是未跟踪的,所以--include-untracked 没有影响。有什么方法可以存储已添加但从未提交的文件?

【问题讨论】:

  • 你为什么要使用--intent-to-add选项,你需要它吗?
  • 看起来像一个重复的问题,它已被stackoverflow.com/questions/14759748/…回答
  • @mnestorov 因为我打算添加文件。但还没有,所以我把它藏起来了。当然,我不能那样做……但这并不能回答问题;)
  • @DillipKumarBehera 这不是重复的,除非你可以扩展它来解释我缺少什么我不认为它回答了这个问题。
  • @OJFord 如果你add你的文件正常,没有任何--intent然后隐藏它,而不提交,那么你应该能够隐藏一个文件而不提交它。

标签: git git-stash


【解决方案1】:

有什么方法可以存储添加但从未提交的文件?

仅当它被真正添加时,即索引中有一个实际版本。然后git stash 就可以了。

过去,Git 中围绕 --intent-to-add 标志存在一些错误。据说它们现在都已修复,可以安全使用,但我建议避免使用它,除非它今天对您特别重要和/或有用。它在内部所做的是创建一个带有标志集的索引实体,并且每个处理索引的 Git 命令都应该根据需要对该实体进行特殊处理:

$ git add --intent-to-add test
$ git ls-files --stage --debug
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0   test
  ctime: 0:0
  mtime: 0:0
  dev: 0    ino: 0
  uid: 0    gid: 0
  size: 0   flags: 20004000

这里的哈希 ID,e69de29bb2d1d6434b8b29ae775ad8c2e48c5391,是一个空文件的哈希:

$ git hash-object -t blob --stdin < /dev/null
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

flags: 20004000 显示来自cache.hCE_INTENT_TO_ADD 标志:

/*
 * Extended on-disk flags
 */
#define CE_INTENT_TO_ADD     (1 << 29)
#define CE_SKIP_WORKTREE     (1 << 30)

git stash 所做的是进行两个(或有时三个)不在 any 分支上的提交,然后 - 实际上 - 运行 git reset --hard 以设置您的索引和工作树如果您还没有开始使用索引和工作树,它们将具有的状态。1 这两个提交保持索引(暂存区域)状态,作为普通提交/快照,并且您的工作树状态,作为另一个提交/快照。第三次提交(如果存在)包含任何未跟踪的文件,可能包括被忽略的文件。这些提交都没有空间容纳git ls-files --debug 显示的这些扩展标志,因此无法保留CE_INTENT_TO_ADD 标志。

也许git stash 可以通过假装它根本没有设置来尝试处理该标志(以便它写入一个空的test 文件,然后完全删除索引条目)。这几乎是一致的:毕竟,该文件作为一个空文件被跟踪。它只是具有这种特殊的“添加意图”状态,加上全零缓存信息,因为它不作为文件系统文件存在。当然,您会在此过程中失去特殊的“有意添加”状态。因此,最终结果将与您只是添加空文件相同。


1这曾经是它所做的,但后来git stash 被幻想允许路径规范参数。对于之后的几个 Git 版本,这种git stash 有时可能会丢失数据。这里的所有错误都已修复——我认为——但总的来说,我不建议使用这种基于路径规范的存储。事实上,我建议完全避免使用git stash,除非出于一些非常短期的目的。毕竟,Stashes 只是提交,没有很多好的方法可以稍后再次找到它们。进行真正的提交,确实有很好的方法在以后再次找到它们。

【讨论】:

  • 一个非常有用的答案,谢谢!就其价值而言,我对 stash 的主要用途确实是短暂的——它使用--autostash 重新设置基数,这就是我遇到这种情况的方式。我喜欢add -N,这样我就不会忘记稍后暂存文件(因为add -p 不会包括未跟踪的),但我也非常喜欢我的fixup 别名commit -m 'fixup! &lt;sha&gt;' &amp;&amp; rebase &lt;sha&gt;^(基本上)但直到今天才发现这两个不在一起。
  • stash-for-rebase 是 stash 更好的用途之一——但我有点希望它自己进行一两次定期提交,用于 rebase!但是,您仍然会遇到问题,因为无法按原样保存 intent-to-add 标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2022-01-27
相关资源
最近更新 更多