はじめに
gitフローに則って共同作業の時、間違ってローカルのdevelopにマージしてしまった時の対応方法をメモります。
状況
gitフローに則る場合、1から3の繰り返しです。
1.リモートブランチ(ex:develop)をプル
2.ローカルのdevelopより、作業ブランチを作成(feature/xxx)
3.マージリクエストを出し、OKならリモートブランチ(ex:develop)にマージ
今回はローカルのdevelopに何らかの変更を加えてしまった場合の対応例を記載します(本来ありえないですが、私は遭遇してしまったので)。
現場では何らかのツール(例えばソースツリー)を使用しているかと思いますが、以下ではコマンドでの対応例を記載しています。
developブランチを書き換えてしまった対応
リモートブランチと同じ状態にローカルブランチをリセットすることは可能です。
ローカルの develop
ブランチをリモートの develop
ブランチと同じ状態に戻すには、以下のGitコマンドを使用します。
まず、最新の変更を取得し、その後でローカルの develop
ブランチをリモートの状態にリセットします。
-
リモートから最新の情報を取得します:
git fetch origin
-
ローカルの
develop
ブランチをリモートのdevelop
ブランチにリセットします:git checkout develop git reset --hard origin/develop
これで、ローカルの develop
ブランチはリモートの develop
ブランチと全く同じ状態になります。
ただし、この操作はローカルで行った変更(まだリモートにプッシュしていないコミットなど)を完全に消去するので、実行する前に必要な変更がないか確認してください。
また、間違ってローカルで変更した内容がある場合は、それを新しいブランチに退避させてからリセットを行うことも考えられます。その場合、以下のように新しいブランチを作成してからリセットを行います:
git checkout -b new-branch-for-changes
git checkout develop
git reset --hard origin/develop
この方法で、変更を失うことなく安全に develop
ブランチをリセットできます。
間違った内容(古いブランチ)から必要箇所を戻して進める方法
develop
ブランチをリモートの最新状態に戻した後、以下の手順で新規ブランチを作成し、そこに必要な修正を反映してからマージリクエストを出すことが適切な流れになります。
-
新規ブランチの作成:
- まず、リセットした
develop
ブランチから新しい作業用のブランチを作成します。git checkout develop git checkout -b new-feature-branch
- まず、リセットした
-
修正の反映:
- もし間違ったブランチで作業していたものや、古い
develop
から分岐したブランチにある修正を新しいブランチに取り入れたい場合は、cherry-pick
やrebase
を使うことができます。 - 例えば、特定のコミットだけを新しいブランチに取り込みたい場合、
cherry-pick
を使用します:git cherry-pick <commit-id>
- 複数のコミットを順序良く反映させたい場合は、
rebase
の使用を検討します。ただし、rebase
はコミット履歴を書き換える操作なので、他のユーザーと共有しているブランチには適用しないよう注意が必要です。
- もし間違ったブランチで作業していたものや、古い
-
変更のプッシュとマージリクエストの作成:
- 修正を加えた後、新しいブランチをリモートにプッシュします。
git push origin new-feature-branch
- プッシュしたブランチに基づいて、リモートのリポジトリでマージリクエスト(プルリクエスト)を作成します。このリクエストを通じて、
develop
ブランチへのマージを提案し、レビューを依頼します。
- 修正を加えた後、新しいブランチをリモートにプッシュします。
これにより、古い状態や誤って作業した内容が正しく取り扱われ、develop
ブランチに安全に統合することができます。
cherry-pickの使い方
git cherry-pick
コマンドを使用することで、他のブランチにある特定のコミットを現在のブランチに適用することができます。
これは、古い develop
ブランチから分岐したブランチにある特定の修正を新しく作成したブランチに取り込む場合に便利です。
git cherry-pick
の使い方
-
新しいブランチにチェックアウト:
- 最初に、作業を行う新しいブランチにチェックアウトします。
git checkout new-feature-branch
- 最初に、作業を行う新しいブランチにチェックアウトします。
-
cherry-pick
の実行:- 次に、取り込みたいコミットのコミットIDを使って
cherry-pick
を実行します。git cherry-pick <commit-id>
-
<commit-id>
は取り込みたいコミットのIDです。このIDはgit log
で見ることができます。
- 次に、取り込みたいコミットのコミットIDを使って
注意点
-
コンフリクトの可能性:
cherry-pick
中にコンフリクトが発生することがあります。この場合は、手動でコンフリクトを解決し、git cherry-pick --continue
を実行して操作を完了させる必要があります。 -
選択的な取り込み: 複数のコミットを取り込む場合は、それぞれのコミットIDに対して
cherry-pick
を複数回実行するか、範囲を指定して実行します(例:git cherry-pick commit-id^..commit-id
)。
この手順により、古いブランチの重要な修正を新しいブランチに確実に適用することができます。
参考