git では stash はどのように機能しますか?
淡淡烟草味
淡淡烟草味 2017-05-02 09:44:35
0
1
811

1. テスト シナリオ 1:
ここで、index.html ページを変更し、index.html ページを一時的に保存してから、インデックスの変更を続けます。 .html ページを開き、次に git stash を実行します。今回はコード ウェアハウスがクリーンになり、変更が一時的に保存され、その後 git stash Pop を実行して変更を復元します。この時点で、ワークスペース内の変更が復元されていることがわかります。ただし、ステージング領域での変更は失われます。 つまり、git status は変更がステージングされていないことを検出し、以前にステージングされた変更は破棄されましたが、ワークスペース内の変更は完全に保持されました。

2. テスト シナリオ 2:
ここで、test01.html ページを追加します。git status は、test01.html が git によって追跡されていないことを示し、この時点で、index.html ファイルを変更します。 Index.html ファイルは一時保存されますが、test01.html ファイルは一時保存されません。 つまり、git status は、git によって追跡されないファイルを一時的に保存しません。

3. シナリオ 3 をテストします。
シナリオ 2 を継続し、index.html ファイルを変更し、test01.html ファイルを新しいファイルとして追加します。この時点で、test01.html ファイルを git add します。 html は git、次に git stash によって追跡されます。test01.html ファイルが git stash show メソッド、次に git stash Pop によって一時的に保存され、変更が復元されることがわかります。 status により、test01.html ファイルが一時的な状態にあり、index.html が依然としてワークスペースの変更として保持されていることがわかりました。 つまり、git add は、これまで git によって追跡されていなかったファイルを git stash の後、一時的に保存され、git stash pop の後、新しく追加されたファイルはまだ一時的な状態になります。シナリオ 1、インデックス .html ファイルでは、ワークスペース内の変更のみが一時的に保存され、一時記憶領域内の変更は失われます。

4. シナリオ 4 をテストします。
シナリオ 3 を継続し、index.html ファイルを変更し、test01.html ファイルを新しいファイルとして追加します。この時点で、test01.html ファイルを git 追加します。 html を git で追跡し、test01.html ファイルを変更して、git stash、git stash Pop を実行すると、test01.html はまだ一時的な状態ですが、一時的に保存されたファイルの内容が最終的に変更された内容であることがわかります。ワークスペース。 つまり、以前に git で追跡されていないファイルを git add し、そのファイルを変更すると、git stash の後、そのファイルは一時的に保存され、git stash Pop の後も、新しく追加されたファイルが残ります。一時的な状態ですが、一時的に保存された変更内容は、追加による一時的な変更内容ではなく、前のワークスペースの変更内容になります。


上記のテストでは、git stash の動作パターンが見つからず、非常に混乱していました。git の専門家に指導と分析をしていただければ幸いです。

淡淡烟草味
淡淡烟草味

全員に返信(1)
曾经蜡笔没有小新

まず最初に、git stash コマンドの基本的な機能を説明します。作業ディレクトリのダーティ ステータス、つまり、git stash命令的基本功能:处理工作目录脏的状态,即修改的跟踪文件暂存改动,然后将未完成的修改保存到一个栈上。知道了这些之后,我们来看看我总结的几个要点:

  • git stash命令会将已跟踪的文件压入栈中,而未被跟踪的文件不会被压入栈中,正如楼主的实验2中所描述的。

  • 如果之前的工作有被添加到暂存区git stash命令默认不会将弹出栈的那个修改再加入暂存区,正如楼主的实验1所描述的那样,但是楼主的描述其实有误,之前暂存的修改并不是被废弃或丢失而是保留在工作区,只是未加入暂存区而已。

  • 对于楼主的实验2、3中的新添加文件test01.html,其实这算一种特殊情况吧。我们可以这样理解:stash pop的结果就是还原以前的修改,而它对于test01.html所能做的恢复操作也只能是重新加入暂存区,否则的话,test01.html将回到未被跟踪的状态。

  • 如果想要重新应用之前暂存的修改,可以在git stash pop后加上--index选项,这样的话就可以恢复到和之前一模一样了,即之前暂存过的现在也会是暂存状态,为暂存的仍是未暂存的状态。

最后,我需要声明下楼主所说的:

之前暂存的修改被废弃了

或者

暂存区的修改被丢失

其实描述有误,或者不该这样描述,因为这样会使我们误解——我们可能会误认为git stash只会暂存工作区的修改,而实际情况应该是这样的:git stash変更された追跡ファイル一時的な変更
を処理します。そして、 未完成の変更をスタックに保存します。これを理解した上で、私がまとめたいくつかの重要なポイントを見てみましょう:

  • 🎜投稿者の実験 2 で説明されているように、git stash コマンドは追跡されたファイルをスタックにプッシュしますが、追跡されていないファイルはスタックにプッシュされません。 🎜
  • 🎜前の作業🎜がステージング領域🎜に追加されている場合、git stash コマンドは、スタックからポップアウトした変更をデフォルトでステージング領域に追加しません。投稿者の実験1 そうですが、実は投稿者の説明は間違っています。以前に一時的に保存された変更は破棄されたり失われたのではなく、作業領域に残りましたが、一時保存領域には追加されませんでした。 🎜
  • 🎜投稿者の実験 2 と 3 で新しく追加されたファイル 🎜test01.html の場合、これは実際には特殊な状況です。これは次のように理解できます。stash Pop の結果は、以前の変更を復元することであり、test01.html に対して実行できる回復操作は、ステージング領域に再結合することだけです。それ以外の場合は、test01 です。 html は追跡されていない状態に戻ります。 🎜
  • 🎜以前🎜一時的だった変更を再適用したい場合は、git stash Pop の後に --index オプションを追加します。以前とまったく同じです。つまり、以前に一時的に保存されたものは一時的な状態になり、一時的に保存されたものは非一時的な状態のままになります。 🎜
🎜最後に、投稿者が言ったことを述べておく必要があります:🎜
🎜以前に保存された変更は破棄されました🎜
🎜または🎜
🎜一時記憶域内の変更が失われました🎜
🎜実際、この説明は間違っているか、このように説明すべきではありません。誤解を招くからです。git stash は変更を一時的に保存するだけであると誤解する可能性があります。ワークスペース。実際の状況は次のようになります: git stash はデフォルトで復元された操作をワークスペースに保持しますが、🎜 はそれを自動的に再スタッシュしません🎜。 🎜投稿者は私の発言を検証するために上記の実験をやり直すことができます。 🎜
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート