レッスン 26 · 回復
作業を隠して安全に再開する
未完成の編集と新しいメモを stash に保存し、Apply で戻して、競合した場合に Pop が何をするかを確認します。stash は、決定するまで残ります。
- レベル: 中級者
- 3 分で読みました
- 5 分の動画
- 更新されました
- このレッスンの前に: 目的のスナップショットをステージングし、最初のコミットを行います, マージとリベースの競合を解決する
このブラウザに進行状況が保存されました。
再生すると、YouTube からビデオが読み込まれます (プライバシー強化モード)。
何を学ぶか
- スタッシュに入れる内容を選択します: 追跡された編集、追跡されていないファイル、またはステージングされたもののみ。
- 適用がスタッシュを保持し、ポップがクリーン適用後にのみスタッシュを削除する理由を説明します。
- 編集とメモの両方が戻ってきて、ブランチが移動していないことを確認します。
- 隠し場所を失わずにポップ紛争から回復します。
始める前に
あなたは、レッスン 18 の結果から分岐した private/stash-hint にいます。ここには、docs/stash-conflict.md (「架空のアドレスを使用する」) を追加する 1 つのコミットがあります。ワークツリーには、そのファイルに対する未完了の編集と、Git がまだ見たことのない新しいファイル docs/signup-hint.md があります。誰かがあなたに別のことに切り替えてほしいと頼むので、中途半端な作業をせずに、両方を脇に置きたいと考えます。
すべてがローカルであり、無料プランです (GitTree はサインインを要求します)。ホスティング アカウント、プロバイダー、インターネットはありません。すべてのアイデンティティは架空のものです (example.com)。このレッスンを実際のプロジェクトで実行しないでください。
変更は、GitTree 内で行うか、ネイティブ Git コマンドを使用して行います。同じコピー内で両方を行うことはできません。結果の読み取りは常に安全です。メニュー ラベルは GitTree 2.0 独自の文字列から取得され、ネイティブ コマンドは使い捨てコピーの Git 2.43 で実行されました。 GitTree ステップは macOS、Windows、または Linux で実行されませんでした。
概念と状態の効果
Stash は、ローカルの変更を Git オブジェクトとして保存し、ワーク ツリーを最後のコミットまでクリーンアップします。これは短時間中断するツールであり、バックアップではなく、維持したいブランチの代替でもありません。
スタッシュには、デフォルトで追跡された編集が保持されます。追跡されていないファイルは、要求しない限り残されます。これは Git が --include-untracked で行います。 GitTree の Stash Changes… ダイアログは、開くときに Include untracked files がオンになっています。とにかくチェックしてください。無視されたファイルは別のカテゴリであり、ここには保管されません。 Only staged changes はインデックスにあるものだけを隠し、Keep staged changes in place too はインデックスをそのまま残します。
Apply Stash は変更を元に戻し、スタッシュをリストに保持します。 Pop Stash はそれを適用し、適用がクリーンな場合にのみエントリを削除します。競合する場合、スタッシュは残り、ワークツリーで競合を解決します。 GitTree の適用とポップはステージングされた状態を復元しません。 git stash apply --index はそれを行いますが、アプリはそれを使用しないため、ステージングされた編集はステージングされずに戻されます。
スタッシュと適用では、ブランチを移動したりコミットしたりすることはありません。ワークツリーとスタッシュエントリのみが変更されます。
正確なプロジェクトの状態を準備する
レッスン 18 で残したプロジェクトの別の通常のコピーから開始し、元の gittree-features はそのままにしておきます。ブランチを作成し、DOC_STASH_BASE を保存してコミットします。次に、ステージングを行わずに、DOC_STASH_WORK を同じファイルに保存し、DOC_HINT を新しいファイルとして保存します。 DOC_STASH_OTHER と STASH_RESOLVED は、別の競合コピーでのみ使用されます。
完全なファイル入力
以下のフェーズでのみ保存します。これらは、最後に改行を含む完全な UTF-8/LF 本文です。 Markdown フェンスは決して貼り付けないでください。変更されていない実行可能ファイルは、名前付き入力を継承します。別のバリアントのバージョンでオリジナルを上書きしてはなりません。
docs/stash-conflict.md — DOC_STASH_BASE
Use a fictional address.docs/stash-conflict.md — DOC_STASH_WORK
Use a complete fictional email address.docs/signup-hint.md — DOC_HINT
Unfinished signup hint: use fictional data only.docs/stash-conflict.md — DOC_STASH_OTHER
Do not send the address anywhere.docs/stash-conflict.md — STASH_RESOLVED
Use a complete fictional email address. Nothing is sent.GitTreeで
Command+Shift+P (Ubuntu では Ctrl+Shift+P) でパレットを開きます。スタッシュ エントリは、左側のパネルの Stashes の下にリストされます。スタッシュのアクションは右クリック メニューにあります。
- 次のセクションで示すように、ブランチとステージングされていない 2 つの変更をビルドします。変更リストを読んでください:
docs/stash-conflict.mdが変更され、docs/signup-hint.mdが新規です。 - パレットを開いて Stash Changes… を実行します。ダイアログで、Message を
signup hint rehearsalに設定します。 Only staged changes はオフです。 Include untracked files がオンになっています。 Keep staged changes in place too はオフです。 Stashを選択してください。 - 「変更を隠しました」という通知が表示されるまで待ちます。変更リストは空で、メモはディスクから削除され、隠し場所は Stashes の下に表示されます。
- スタッシュ行にマウスを移動します。そのツールチップには「追跡されていないファイルが含まれます」と表示されます。それを右クリックして Show Stash を選択します。グラフでスタッシュが選択され、右側のパネルにその追跡された変更
docs/stash-conflict.mdがリストされます。追跡されていないメモは、隠し場所の別の部分に保管されます。 - もう一度右クリックして、Apply Stash を選択します。通知には「スタッシュを適用しました。まだリストにあります。」と書かれています。
- 結果を確認します。
docs/stash-conflict.mdは再び変更され、docs/signup-hint.mdは追跡されていないファイルとして戻り、ブランチ チップは同じコミットであり、スタッシュはまだリストされています。 - Separate conflict copy. 2 番目のコピーでは、スタッシュの後に、DOC_STASH_OTHER を同じファイルにコミットします。スタッシュを右クリックし、[Pop Stash] を選択します。警告には、「スタッシュは変更と競合しています。競合を解決してください。スタッシュは保持されます。」と表示されます。
- 競合したファイルは Conflicted でリストされます。それを開き、出力に STASH_RESOLVED と書き込み、Save and Mark Resolved を選択します。隠し場所はまだそこにあります。作業が安全であることが確認できたら、それを右クリックして Delete Stash… を選択します。ダイアログには、リストから削除され、回復スナップショットに保持されることが示されます。 GitTree の「元に戻す」では、削除されたスタッシュはまだ復元されないため (レッスン 30)、削除は最終的なものとして扱います。
コース内のすべての通常のコミット: Summary は指定された件名、Description は空、オプション Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit、および Allow Empty Commit はオフのままです。
ターミナル内
レッスン 18 の結果の別のコピー:
git switch --create private/stash-hintDOC_STASH_BASE を docs/stash-conflict.md として保存し、次のようにします。
git add -- docs/stash-conflict.md
git commit --quiet -m "docs: establish the stash conflict baseline"ステージングなしで DOC_STASH_WORK を docs/stash-conflict.md に保存し、DOC_HINT を docs/signup-hint.md として保存します。次に、両方を隠します。
git stash push --include-untracked --message "signup hint rehearsal"
git status --short
git stash list --format=%sOn private/stash-hint: signup hint rehearsalステータスには何も表示されません。ツリーはクリーンです。競合のためにこの状態の未変更のコピーを保持し、次を適用します。
git stash apply 'stash@{0}'
git status --short
git stash list --format=%s
git rev-parse HEAD M docs/stash-conflict.md
?? docs/signup-hint.md
On private/stash-hint: signup hint rehearsal両方の本体が戻ってきており、スタッシュはまだリストに表示されており、HEAD はそのコミットです。 --include-untracked を使用しないと、同じプッシュで docs/signup-hint.md がディスク上に残り、編集内容のみが隠蔽されます。
別のコピーで DOC_STASH_OTHER を保存してコミットし、次にポップします。
git add -- docs/stash-conflict.md
git commit --quiet -m "docs: change the stash target"
git stash pop 'stash@{0}'
git ls-files --unmerged
git stash list --format=%sPop は 1 で終了し、「CONFLICT (コンテンツ)」と「再度必要になった場合に備えて stash エントリが保持されます。」を出力します。マージされていないエントリが 3 つリストされ、ファイルには競合マーカーが保持され、docs/signup-hint.md は復元され、スタッシュはリストされたままです。続行するためのマージやリベースはありません。STASH_RESOLVED を保存して、git add -- docs/stash-conflict.md を実行してください。代わりに独自のブランチに作業を保存するために、git stash branch rescue-hint 'stash@{0}' はスタッシュが作成されたコミットにブランチを作成し、それを適用し、その後のみスタッシュを削除します。
結果
最初のコピーの Where you end: にはツリーが編集され、再度メモが含まれていますが、HEAD は移動されておらず、スタッシュはまだリストされています。紛争のコピーでは、ポップが紛争を報告し、隠し場所は生き残り、解決策が演出されました。 stash コマンドによってコミットは行われず、何もプッシュされませんでした。
よくある間違い
- 追跡されていないファイルは、含めない限り隠蔽されないことを忘れてください。
- Pop が競合後に隠し場所を削除したと仮定します。そうではありませんでした。
- 最初の適用がすでに機能しているときに 2 回適用し、変更が重複しているのではないかと疑問に思います。
- 隠し場所を長期保管場所として使用。ブランチを使用して役立つ作業に名前を付けます。
何か問題が発生した場合
Pop 競合が発生した後は、スタッシュを所定の位置に残し、ファイルを解決し、何かを削除する前に結果を確認してください。間違ったブランチに申請した場合は、スタッシュにその作業がまだ保持されていることを確認した後でのみ、その作業を破棄してください。 Create Branch from Stash… は、スタッシュが作成されたコミットに独自のブランチをスタッシュに与えます。
理解度を確認してください
各質問に答えてから、その理由を読みましょう。 「必須」とマークされた質問は、レッスンの完了にカウントされます。
6 個中 0 個が正解です
必須の質問に正しく答えると、レッスンを完了できます。
このブラウザで確認しました。
練習する
スタッシュ後にツリーがクリーンであったこと、適用によって両方のファイルが復元されたこと、およびスタッシュがまだリストに残っていることを証明します。 Include untracked files がオフの場合に何が変わるかを予測します。競合コピーで、隠し場所がポップから生き残ったことを証明します。
あなた自身の確認: サイトはあなたのコンピュータを認識できません。
レッスンを完了するには、必須の質問に正しく答え、実践的な演習を確認してください。
要約
- 意図的に隠しオプションを選択してください。
- 適用するとエントリが保持されます。
- 相反するポップもそれを維持します。
関連している
用語集の用語の紹介
隠し場所 - 隠し場所;適用します — تطبيق;ポップ — تطبيق وحذف;追跡されていません — غير متبَّع。
ビデオトランスクリプト
ビデオのナレーションが次々と流れます。
トランスクリプトを表示する
- 終わっていない仕事は脇に置いて、持っていきましょう 無事に戻ってきました。
- スタッシュには編集内容がシェルフに保存されます。 ワークツリーを掃除します。
- 適用すると変更が元に戻り、保持されます エントリー。きれいであれば、ポップで削除されます。
- 1 つのコミットでブランチを作成し、編集します ファイルを開き、新しいメモを追加します。
- 変更リスト内: 1 つの変更されたファイル、 そして新しいファイルが 1 つあります。
- 現在のコミットを書き留めます。それはあってはならない 動く。
- パレットを開き、Stash Changes を実行します。
- あなたが認識できるメッセージをそれに与えてください。
- ステージングのみがオフです。未追跡を含める オン。 「ステージを維持」がオフになっています。
- 無視されたファイルは別のカテゴリです。 そして入らないでください。
- [Stash] を選択し、通知を待ちます。
- 変更リストは空であり、スタッシュは が記載されています。
- ツールチップには、追跡されていないファイルは次のとおりであると表示されます。 含まれています。 Show Stash はそのファイルをリストします。
- スタッシュを右クリックし、「適用」を選択します 隠し場所。
- 通知には隠し場所がまだあると書かれています リスト。
- 編集とメモの両方が戻ってきました。
- ブランチチップは同じコミットです。いいえ stashコマンドで作成しました。
- そしてその隠し場所はまだ棚の上にあります。
- ターミナルで git stash Push を実行します。 未追跡を含めてからステータスを含めます。
- リストにはメッセージが表示されます。 最初に支店名。
- git stash apply は両方を元に戻します。
- スタッシュはまだリストされており、HEAD は 同じです。
- このオプションを選択しないと、メモはオンのままになります ディスク。
- 競合コピーでは、別のコピーをコミットします。 最初に変更してからポップします。
- 警告には、隠し場所が保持されていることが示されています。の ファイルが競合しています。
- ファイルを解決し、解決済みとしてマークします。 隠し場所はまだそこにあります。
- 確実な場合にのみ隠し場所を削除してください。 または、独自のブランチを与えます。
- 実践: きれいで、復元され、保管されていることを証明します。 次に、追跡されていないものを含めずに予測します。
- 次に、ソフト、ミックス、およびリセットの内容を学びます。 それぞれの変化が難しい。