索引,缓存和在git中上演有什么区别?

这些都是一样的吗? 如果是这样,为什么有这么多条款?!

另外,我知道有一件名为git stash的东西,它可以暂时存储工作副本的更改,而无需将它们提交到回购站。 我发现这个工具非常有用,但是再一次,这个名字与git中的其他一些概念非常相似 - >这很混乱!


索引/阶段/缓存是同样的事情 - 至于为什么这么多的术语,我认为这个索引是'原始'术语,但是人们发现它很混乱,所以引入了其他术语。 我同意,起初它有时让事情有点混乱。

git的stash工具是一种存储'正在进行'的工作的方式,你现在不想在一个提交对象中存储在特定的存储目录/数据库中)。 基本的stash命令将存储对工作目录所做的未提交更改(缓存/暂存和未缓存/非暂存更改),然后将工作目录还原为HEAD。

它与索引/阶段/缓存没有真正的关系,只是它将存储缓存中未提交的更改。

这使您可以快速保存脏工作目录和索引的状态,以便在干净的环境中执行不同的工作。 稍后,您可以取回存储对象中的信息并将其应用于您的工作目录(即使工作目录本身处于不同的状态)。

官方的git stash具有相当不错的细节,但仍然可以理解。 它也有很好的例子说明如何使用stash


这确实很令人困惑。 这三个术语可以互换使用。 这是我为什么称这些事情的原因。 git索引是:

  • 一个二进制文件.git/index是所有跟踪文件的索引
  • 用作提交的中转区域
  • 包含文件的缓存 SHA1哈希(加速性能)
  • 需要注意的是,索引/缓存/阶段包含源控制下的所有文件列表,甚至不变。 不幸的是,诸如“将文件添加到索引”或“文件被分级到索引”之类的短语可能会误导性地暗示该索引仅包含更改后的文件。

    这是一个演示,显示git索引包含所有文件的列表,而不仅仅是已更改的文件:

    # setup
    git init
    
    echo 'x' > committed.txt
    git add committed.txt
    git commit -m 'initial'
    
    echo 'y' > staged.txt
    git add staged.txt
    
    echo 'z' > working.txt
    
    # list HEAD
    git ls-tree --name-only -r HEAD
    # committed.txt
    
    # list index
    git ls-files
    # committed.txt
    # staged.txt
    
    # raw content of .git/index
    strings .git/index
    # DIRC
    # committed.txt
    # staged.txt
    # TREE
    
    # list working dir
    ls -1
    # committed.txt
    # staged.txt
    # working.txt
    

    补充阅读:

    https://www.kernel.org/pub/software/scm/git/docs/technical/racy-git.txt

    git索引包含什么?

    链接地址: http://www.djcxy.com/p/50877.html

    上一篇: What's the difference between the index, cached, and staged in git?

    下一篇: Show both staged & working tree in git diff?