クリスマスまであと1週間
これは『Git Advent Calendar 2016』18日目のエントリです。17日目の記事はSximada Takesxiさんの「GitPythonを使う」です。
こんばんは。しがないGitユーザのけいが (@keiga_jp) です。技術そのものよりも、その技術を自分の趣味や生活にどう活かせるかに興味があり、最近では『GitHub』という人類の技術と叡智が集う場所をこんなことに使っています。
本題に戻ります。Gitについての最新のTipsは他の人が書いてくれると思うので、このエントリでは箸休めとして、最近Gitを使い始めた人向けに、使い始めで陥りやすい罠ナンバーワン(当社比)の「コミットしたかったブランチとは違うブランチにコミットしてしまった」への対処法を書きたいと思います。
なお、このエントリでは説明のためにGUIアプリ『SourceTree』を使用します。補足としてコマンドも付記します。
チェリーピック
featureブランチにコミットしていたはずなのに、developブランチにコミットしていた、なんてこと、Git使い始めのときはもとより、慣れてきてからもうっかりやりがちです。しかも、git-flowを厳格にしようなんてプロジェクトの場合、developブランチに直接コミットするのは禁止されていたりして、このままではプッシュできません。
そんなときに便利なのがcherry-pick(チェリーピック)です。
コマンドラインでのコマンドはこちらです。
git cherry-pick <commit>
実際に使ってみましょう。
まずはコミットをつけ直したいブランチにチェックアウトします。今回ですとfeatureブランチですね。
git checkout <branch>
チェックアウトしたら、今回の例ですと、“小見出しを作成した”を右クリックして、“チェリーピック”を選択します。コマンドラインからだと前記のコマンドですね。
間違えてしてしまったコミットと同じ内容のコミットがfeatureブランチに追加されていますね。
同様に残りのコミットもチェリーピックしてしまいます。終わったら中身を確認して、チェリーピック漏れがないかを確認しましょう。
コミットのチェリーピックが全て終わったら、developブランチも修正しましょう。developブランチにチェックアウトします。
戻したい位置のコミットを右クリックして、“このコミットまで <branch> を元に戻す”を選択します。
git reset <commit>
モードは一応“Mixed”にしておきましょう。
間違えてコミットしたぶんの内容がワーキングディレクトリに戻ってきています。featureにチェリーピックがされていることを再度確認した後、変更は破棄してしまいましょう。『SourceTree』ならば“Hunkを戻す”で簡単に行なえます。
無事に履歴を修正することができました。
最後にひとつ注意点。リモートリポジトリにプッシュしてしまったコミットについては、リセットやリベースなどの履歴の改ざんを行なってはいけません。リポジトリがおかしくなってしまう可能性があります。詳しくは以下のスライドが参考になるかと思います。
おわりに
履歴を綺麗に保つということは、Gitの良さを活かすための重要なポイントです。チェリーピックを使いこなして、綺麗なコミットグラフをつくりましょう。