背景
ペアプロやモブプロをやっていると、変更が中途半端でそのままコミットしたくないようなタイミングでもドライバーを変更することがあります。リモートペアプロなどソースを編集する環境が別環境の場合だと変更を共有するためには一度リポジトリを経由する必要がありますが、中途半端な変更をコミットしてしまうとコミットログが汚れてしまいます。git stash
の退避内容を共有できたらいいのですが、stashにそんな機能は無いですし。
というわけで、コミットログを汚さずにやりかけの状態を他人へ渡すための、私なりに考えた方法を書きます。
※もっといいやり方がありましたらコメントで教えてください!
手順
AさんのやりかけをBさんに渡す場合、以下の手順で渡します。
Aさん(やりかけを渡す人)の手順
# (1) 変更内容を退避する
$ git stash save
# (2) 捨てブランチを作成し、ブランチを切り替える
$ git checkout -b tmp-yarikake
# (3) 退避した変更を、捨てブランチにcommit&pushする
$ git stash pop
$ git add -A .
$ git commit -m "中途半端なコミット"
$ git push origin tmp-yarikake
Bさん(やりかけを受け取る人)の手順
# (4) リモートリポジトリをfetchする
$ git fetch
# (5) (3)のコミット内容を取り込む
$ git cherry-pick 8169d7c
# (6) (5)のコミットをresetする
$ git reset --mixed HEAD^
# (7) 不要になった捨てブランチを削除する
$ git push --delete origin tmp-yarikake
手順が多いように見えますが、1つ1つは簡単です。
各手順の解説
(1) 変更内容を退避する
捨てブランチを作成するために、一度修正内容を退避します。
$ git stash save
(2) 捨てブランチを作成し、ブランチを切り替える
リモートリポジトリにプッシュするための捨てブランチを作成します。このブランチは最終的には削除しますので、tmp
など一時的なブランチであることが分かる名前にすると良いでしょう。
$ git checkout -b tmp-yarikake
(3) 退避した変更を、捨てブランチにcommit&pushする
修正内容をコミットします。このコミットは最終的なコミットログとしては残りません。コミットメッセージには一時的なコミットであることがわかる内容を記載しておくと良いでしょう。
$ git stash pop
$ git add -A .
$ git commit -m "中途半端なコミット"
$ git push origin tmp-yarikake
(4) リモートリポジトリをfetchする
ここからはBさんの操作になります。まずは(3)のpush内容を購読するためにfetchします。
$ git fetch
(5) (3)のコミット内容を取り込む
※Aさんの最初の作業ブランチ
特定のコミットを取り込めるcherry-pickを使って(3)の変更をマージします。8169d7c
の部分には(3)のコミット時のコミットIDを指定しましょう。
$ git cherry-pick 8169d7c
(6) (5)のコミットをresetする
cherry-pickを使うと変更分は自動でコミットされてしまうので、コミットの取り消しを行います。
これで、BさんのローカルにAさんのやりかけの状態を復元することができました。
$ git reset --mixed HEAD^
(7) 不要になった捨てブランチを削除する
不要になった捨てブランチを削除します。
(6)で目的は達成されたのでこの作業は必須ではないですが、一時的なブランチを残しておくのは微妙なので可能なら消しておきましょう。
また、ブランチから参照されなくなったコミットはいずれ消える1ため、(3)のコミットも無かったことにすることができます。
$ git push --delete origin tmp-yarikake
以上です。同じような悩みを持つ方いらっしゃいましたら使ってみてください。