17

我想避免从我的脚本中调用瓷器命令,但是有没有办法获得一些git checkout <commit>只使用管道命令的行为,比如checkout-index?我对工作副本的影响特别感兴趣:假设一切都是干净的,checkout删除在旧 HEAD 中跟踪而在新 HEAD 中不存在的文件。checkout-index似乎没有任何删除文件的概念。我能想到的最接近的事情就是打电话

git diff-tree -p <old> <new> | git apply

但计算整个差异似乎不必要地昂贵。有没有更好的办法?

4

1 回答 1

12

您正在寻找两棵树git read-tree -um。它使用一个基础树(通常是你喂它HEAD),一个目标树,以及(隐式)索引和工作树。描述其行为的表格对我来说很难理解,所以我有自己的备忘单,无论如何,重新格式化的对我来说更有意义。无论如何,它实现了git checkout.

git read-tree -um H M  # `I` is the (implicit) index, GIT_INDEX_FILE

                    Legend

        H       Original tree (usually HEAD:)
        I       Indexed tree
        M       Merge target tree

        H->I     \
        H->M      } status in second relative to first
        I->M     /

        "-"     file exists in neither
       new      exists only in second
       deleted  exists only in first
       same     exists in both, unchanged
       changed  exists in both, different
      (blank)   irrelevant or all cases not otherwise given

        keep    keep current version
        fail    whole command fails, no changes
       delete   delete worktree file


      H->I      H->M      I->M

                          same     keep

     deleted   changed             fail
     deleted   deleted             delete
     deleted    same               delete unless Index empty, else use M
                same               keep

      same     changed             worktree clean: use M; dirty: fail
      same     deleted             worktree clean: deleted; dirty: fail

      new        -                 keep
      new       new      changed   fail
     changed   changed   changed   fail
     changed   deleted             fail


note: "index empty" identifies an initial checkout, where HEAD has been
set but never loaded.  git can't currently distinguish between a
delete-everything index and an initial-checkout index.
于 2014-07-28T00:02:23.723 回答