ブランチ専用のスタッシュが欲しかったので運用方法で補った話

More than 1 year has passed since last update.

WithOne AdventCalendar 7日目の記事です。
本日のテーマはGitです。
私のローカルにおけるGitの運用を記事にしてみました。

ブランチ専用のスタッシュが欲しい

Gitを使っていてこんなことを思ったことはないでしょうか?
日常的に複数のブランチで作業している人の1000人に1人くらいは思ったことのある悩みだと思います。

複数ブランチを使用しない人にも伝わるように、
たとえば私の場合はこんなときに複数ブランチで作業してました

  • 機能の実装に詰まったので、気分転換に別のブランチで別機能に着手した
  • レビューのために複数のブランチを同時並行で作業する必要があった

スタッシュで困ること

スタッシュが少しなら困らないんですが

  • 複数ブランチのスタッシュが混在してたり
  • ローカルな接続先に切り替える用のスタッシュを用意してたり
  • 使用済みスタッシュのゴミが散乱してる

などの要因でスタッシュがたくさんあると、途端にめんどくさくなります

例えばこんなケース

機能α 作成中に、優先度が高い機能β の作成の割り込みがあった

大多数の人は
1. 作業中の機能α をスタッシュに保存する
2. developブランチに戻る
3. 機能β のためのブランチを作成する
という流れで作業を開始するでしょう。

さて、機能β を無事に実装を終えたら
4. 機能α のブランチに戻る
5. スタッシュしておいた処理を適用する
という流れで戻ると思います

しかしこのスタッシュがごちゃついている場合は……
というのがこの投稿のテーマです。

コミットをスタッシュ代わりにしちゃうのはどうかな?

機能α 作成中に、優先度が高い機能β の作成の割り込みがあった

この先ほどのケースに対する流れを次のようにします。
1. 作業中の機能α をコミットする
2. developブランチに戻る
3. 機能β のためのブランチを作成する
機能β を完了させる
4. 機能α のブランチに戻る
5. 一つ前のコミットでリセットする(オプションはSoftで)

こうすることで、迷いなく機能α の実装に戻ることができます。

呼び名を決めよう

ブランチ専用のスタッシュとして、リセット前提のコミットのことを
以下、ブランチスタッシュと呼ぶことにします。
別の呼び方がいい人はお好きに読み替えてください。

GUIでやるとこんな感じ

スクリーンショット 2016-12-07 9.35.17 2.png
赤枠で囲まれているのがブランチスタッシュです。
私のワークスペースを覗いたことがある人がいるかわかりませんが、いつもこんな感じです。

普段はSourceTreeを使用していて、GUIでやると非常に簡単です。
戻したいブランチスタッシュの直前のコミットにカーソルを合わせて右クリックをすると次のようなメニューが出ます。
スクリーンショット 2016-12-07 9.36.39.png

「このコミットまで XXX を元に戻す」を選択すると次のようなダイアログが出るので、
スクリーンショット 2016-12-07 9.37.16.png

モードを選択して(SoftかMixed)OKを押すと、ブランチスタッシュした続きに戻ることができます。
スクリーンショット 2016-12-07 9.37.36 2.png

使用上の注意

最後に、この運用方法は操作ミスで次のような事が起こり得ます。

  • オプションをHardでリセットしてしまう
  • 間違ってブランチスタッシュをプッシュしてしまう
  • 他のブランチをプッシュするときに、ブランチスタッシュまでプッシュしてしまう
  • ブランチスタッシュの存在を忘れて、その後ろにコミットしてしまう

これら状況で何が起こるか理解できない人にはオススメできない、そんな記事でした。