git_icon

クリスマスまであと1週間

 これは『Git Advent Calendar 2016』18日目のエントリです。17日目の記事はSximada Takesxiさんの「GitPythonを使う」です。

 こんばんは。しがないGitユーザのけいが (@keiga_jp) です。技術そのものよりも、その技術を自分の趣味や生活にどう活かせるかに興味があり、最近では『GitHub』という人類の技術と叡智が集う場所をこんなことに使っています。

 本題に戻ります。Gitについての最新のTipsは他の人が書いてくれると思うので、このエントリでは箸休めとして、最近Gitを使い始めた人向けに、使い始めで陥りやすい罠ナンバーワン(当社比)の「コミットしたかったブランチとは違うブランチにコミットしてしまった」への対処法を書きたいと思います。

 なお、このエントリでは説明のためにGUIアプリ『SourceTree』を使用します。補足としてコマンドも付記します。

チェリーピック

git_20161218_01

 featureブランチにコミットしていたはずなのに、developブランチにコミットしていた、なんてこと、Git使い始めのときはもとより、慣れてきてからもうっかりやりがちです。しかも、git-flowを厳格にしようなんてプロジェクトの場合、developブランチに直接コミットするのは禁止されていたりして、このままではプッシュできません。

 そんなときに便利なのがcherry-pick(チェリーピック)です。

 コマンドラインでのコマンドはこちらです。

git cherry-pick <commit>

 実際に使ってみましょう。

git_20161218_02

 まずはコミットをつけ直したいブランチにチェックアウトします。今回ですとfeatureブランチですね。

git checkout <branch>
git_20161218_03

 チェックアウトしたら、今回の例ですと、“小見出しを作成した”を右クリックして、“チェリーピック”を選択します。コマンドラインからだと前記のコマンドですね。

git_20161218_04

 間違えてしてしまったコミットと同じ内容のコミットがfeatureブランチに追加されていますね。

git_20161218_05

 同様に残りのコミットもチェリーピックしてしまいます。終わったら中身を確認して、チェリーピック漏れがないかを確認しましょう。

git_20161218_06

 コミットのチェリーピックが全て終わったら、developブランチも修正しましょう。developブランチにチェックアウトします。

git_20161218_07

 戻したい位置のコミットを右クリックして、“このコミットまで <branch> を元に戻す”を選択します。

git reset <commit>
git_20161218_08

 モードは一応“Mixed”にしておきましょう。

git_20161218_09

 間違えてコミットしたぶんの内容がワーキングディレクトリに戻ってきています。featureにチェリーピックがされていることを再度確認した後、変更は破棄してしまいましょう。『SourceTree』ならば“Hunkを戻す”で簡単に行なえます。

git_20161218_11

 無事に履歴を修正することができました。

 最後にひとつ注意点。リモートリポジトリにプッシュしてしまったコミットについては、リセットやリベースなどの履歴の改ざんを行なってはいけません。リポジトリがおかしくなってしまう可能性があります。詳しくは以下のスライドが参考になるかと思います。

おわりに

 履歴を綺麗に保つということは、Gitの良さを活かすための重要なポイントです。チェリーピックを使いこなして、綺麗なコミットグラフをつくりましょう。