Git School · FluxGit

Gitの復元ポイントと手動stash

FluxGit ·

各ブロックは別のケースであり、一括実行するスクリプトではありません。自分のリポジトリに合うケースを選び、ブランチ名、パス、VERIFIED_COMMITを置き換えてください。中止コマンドは対応する進行中の操作だけに使い、両方の選択肢を実行しないでください。

要点

FluxGitの復元ポイントは対象の履歴操作を復旧するための状態を記録します。手動stashはローカル編集を後で使うために保存する別の手順です。

例と前提条件

G12はtrackedファイルに未完了の変更がある状態でブランチを切り替えます。untrackedファイルは明示的に含めなければディレクトリに残ります。

変更前に状態を確認する

git status --shortとgit diffを確認します。切り替える前に保存対象を決めてください。作業ディレクトリがきれいでも永続的なバックアップではありません。

git status --short
git diff

参照または別のチェックアウトを保つ

分かりやすいメッセージでstashを作ります。git stash pushはtrackedの変更を保存し、untrackedも含める場合だけ-uを使います。

git stash push -m "school/manual-before-switch"
git stash list

最初の手順

git stash listを確認して目的のブランチへ移ります。戻ったら選んだ記録を適用する前に作業の状況を確認します。

git switch target-branch

別の結果を意図して選ぶ

git stash applyは記録を残します。git stash popは適用が成功した場合だけ記録を削除し、競合した場合は残します。

git stash show --patch 'stash@{0}'
git stash apply 'stash@{0}'

制限と例外

自動ポイントの対象は保護された実行経路のreset、rebase、cherry-pick、revert、mergeです。discardとcleanで万能なFlux restore pointが作られるわけではありません。

競合と後片付け

競合があればファイルを確認して解決します。未完了の状態を隠すためにpopを繰り返したり、記録を削除したりしないでください。

結果を確認する

適用後にファイル、インデックス、テストを確認します。必要な作業が保存されていることを確認してから記録を削除します。

git status --short
git diff
git diff --cached

よくある質問

stashはpushで自動的に公開されず、バックアップの代わりにはなりません。復旧には関連するローカル状態が残っている必要があります。

FluxGitで操作を確認する

Safety Timelineはreflogの移動、リスク、復元ポイントをまとめます。ポイントのデータはローカルに保持されます。操作ごとのプレビューと復旧の状況を確認してください。

Git公式ドキュメント

Git School · 1:51

作業途中でGitブランチを切り替える:git stashを視覚的に解説

追跡対象の変更をgit stashで保存し、名前を付けてブランチを切り替え、戻ってpopで復元します。未追跡ファイルが残る理由と、applyと成功したpopの違いを解説。ターミナルのコマンドも紹介します。

作業途中でGitブランチを切り替える:git stashを視覚的に解説
ナレーションは英語です。YouTubeでは11言語の手動字幕を利用できます。この文字起こしは日本語です。

YouTubeで見る — 新しいタブが開きます

テスト用リポジトリで収録。英語音声、日本語字幕。

ナレーションの文字起こしを読む
  1. 00:03 変更の途中ですが、今すぐ別のブランチを確認する必要があります。まだコミットできる状態ではなく、変更を失いたくもありません。
  2. 00:12 app.pyにある作業途中の変更です。
  3. 00:19 stashは追跡対象の変更を一時保存します。ここではapp.pyの変更を保存し、その変更を作業フォルダーから取り除きます。未追跡のファイルはディスク上に残ります。popが成功すると変更が復元され、stashの項目が削除されます。
  4. 00:36 Stash current changesを選び、後で分かる名前を付けます。
  5. 00:48 別のブランチに切り替えます。追跡対象の変更はstashに保存済みです。未追跡のファイルはフォルダーに残ります。
  6. 00:58 そちらの作業が終わったらmainに戻ります。
  7. 01:05 stashをpopします。app.pyに変更が戻り、stashはなくなりました。
  8. 01:15 applyとpopの違いは? applyは変更を復元し、stashの項目を残します。popは変更の適用が成功した場合だけ項目を削除します。競合が起きた場合、stashは保持されます。
  9. 01:29 ターミナルでは、メッセージ付きでgit stash pushを実行し、別のブランチに切り替えて戻り、git stash popを実行します。
  10. 01:37 まとめです。作業途中の変更は、未完成のコミットではなく棚に置きます。次はプルリクエスト前にコミットを整理します。

関連する手順

FluxGitをダウンロード