カテゴリー
コンピューター

【Git】stash などを使わなくてもマージやブランチ操作ができるケース

状況

  1. ブランチでコミット、作業完了
  2. master ブランチへマージし忘れた。
  3. 別の作業を開始して、編集途中。ファイルのへの変更などが既に保存されている。作業ディレクトリには変更があるがステージへは追加していない。

こんな時、ブランチで作業完了時点で master へマージして、新しいブランチを作って作業するべきだった><、とか、だから stash して辻褄を合わせなきゃ><、とか思っておりました。

しかし、特別な退避操作は必要ありませんでした。

作業ディレクトリは編集途中の状態のまま、マージやそのためのチェックアウトをすることができました。

作業ディレクトリ編集途中でも、編集内容を失わずにできた操作概要

  • 作業ディレクトリへの変更は、新規ファイル追加だった。
  • 別ブランチへのチェックアウト
  • マージ
  • 新規ブランチを作成し、そこへチェックアウト

具体的な作業記録

$ # ↓マージし忘れ、新しいブランチ作成忘れ、
$ #   作業ディレクトリでは編集してしまった、ステージへは未追加、な状況
$ git status
On branch feature1
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        document1.xlsx
        document2.xlsx
        documentA.docx
        memo.md

nothing added to commit but untracked files present (use "git add" to track)

$ # ↓そもそも stash しようとしても、できなかった。
$ #   作業ディレクトリには新規ファイル (=未追跡ファイル) を追加していたため。
$ git stash

No local changes to save

$ # ↓チェックアウトで作業ディレクトリの内容は変化せず。
$ git checkout master
Switched to branch 'master'

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        document1.xlsx
        document2.xlsx
        documentA.docx
        memo.md

nothing added to commit but untracked files present (use "git add" to track)

$ # ↓マージしても作業ディレクトリの内容は変化せず。
$ git merge --no-ff feature1
Removing memo1.md
Merge made by the 'recursive' strategy.
 memo1.md |   0
 memo1renamed.md        | 124 +++++++++++++++++++++++++++++++
 memo2.md              |  55 +++++++++++++++
 3 files changed, 179 insertions(+)
 delete mode 100644 memo1.md
 create mode 100644 memo1renamed.md
 create mode 100644 memo2.md

$ git log --all --decorate --graph --oneline
*   lebc054 (HEAD -> master) Merge branch 'feature1'
|\
| * 7f05f6e (feature1) 整理整頓
| * f773303 8割型完成版を追加する
| * 174a3dd 2016年2月9日の作業を追加する
|/
* 93bd104 最初のコミット

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        document1.xlsx
        document2.xlsx
        documentA.docx
        memo.md

nothing added to commit but untracked files present (use "git add" to track)

$ # ↓ブランチを作成してそこへチェックアウトしても作業ディレクトリの内容は変化せず。
$ git checkout -b feature2
Switched to a new branch 'feature2'

$ git status
On branch feature2
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        document1.xlsx
        document2.xlsx
        documentA.docx
        memo.md

nothing added to commit but untracked files present (use "git add" to track)

おわりに

今回は、すこし不思議な気持ちになりましたの。

作業ディレクトリに変更があっても、それをそのままにコミットを操作できるなんて!

変更が未追跡ファイルの追加のみでしたので、できたことのように思います。

未追跡ファイルのみであったこと、作業が終わってから気が付きました。git は出力されるメッセージが丁寧ですわね!

当たり前のことかもしれませんけれども、とてもびっくりしたので投稿いたしました。

ちなみに、stash といえば以前の苦労いたしました♪

以上です。

コメントを残す