17

スクリプトから磁器コマンドを呼び出さないようにしたいのですが、git checkout <commit>配管コマンドのみを使用した場合の動作の一部を取得する方法はありますcheckout-indexか? 私は特に作業コピーへの影響に関心があります。すべてがクリーンであると仮定するとcheckout、古い HEAD で追跡され、新しい HEAD には存在しないファイルが削除されます。checkout-indexファイルを削除するという概念はないようです。私が考えることができる最も近いことは、電話することです

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

しかし、差分全体を計算すると、不必要にコストがかかるようです。より良い方法はありますか?

4

1 に答える 1

12

two-treegit 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 に答える