他人ブランチを基点に作業したときに起きた「分岐」と対処録
背景
ふだん私は dev ブランチから新機能用の作業ブランチを切る運用です。
しかし今回の issue は、他の人のブランチを基点に新たなブランチを作る要件でした。
- 元の他人ブランチ:Bブランチ(まだ作業継続中)
- 私が切ったブランチ:Aブランチ(
feature/issue_A)
Aブランチに 最新の dev を取り込むため、いつも通り git pull origin dev を実行したところ問題が発生しました。
このとき私は「自分が変更を全く加えていないのになぜ分岐が起きているのだろう?」と疑問に思いました。
事象
いまのブランチ
feature/issue_Aと、その upstream(origin/feature/issue_A)が 分岐 しています。
そのためgit pullは rebase / merge / ff-only のどれで統合するか指定が必要、という状態で停止。
つまり、ローカルの Aブランチ と リモートの Aブランチ が、それぞれ 別の新規コミット を持って進んでおり、単純な早送り(fast-forward)ができない状態でした。
なぜ起きたか(考察)
- Aブランチは Bブランチを基点に作成(= dev 直系ではない)。
- その後、Bブランチ側で他メンバーが新しいコミットを追加。
- 私は Aブランチに dev を取り込もうとした(
git pull origin dev)。 - 結果、AローカルとAリモートが分岐しており、
git pullでは統合方針の指定が必須になった。
要するに:「他人ブランチを基点」+「その元ブランチが未完で進行中」
この二点が重なると 分岐 が発生しやすい。
実際に取った対処(rebase で一直線化)
Aブランチのリモート変更と自分の変更を整合させ、履歴をきれいにするため rebase を選択。
# 1) まず最新を取得
git fetch origin
# 2) Aブランチの upstream に合わせて rebase
git rebase origin/feature/issue_A
-
rebase 中のログに
skipped previously applied commit:
→ すでに上流に取り込まれている重複コミットは 自動スキップ(正常)。 -
一部で コンフリクト(例:
screen.tsx,ChatInput.tsx)が発生:
→ 競合箇所を手動解決 →git add <file>→git rebase --continue -
rebase 完了後は履歴が書き換わるため 強制付きで安全にプッシュ:
git push --force-with-lease
dev を取り込みたいときの正しい流れ(明示的に選ぶ)
Aブランチ(= B基点)に dev の変更を反映したい場合は、次のどちらかを明示的に行う。
rebase 派(履歴を直線に)
git fetch origin
git rebase origin/dev
merge 派(マージコミットで統合)
git fetch origin
git merge origin/dev
git pull origin devは「今のブランチに dev を取り込む」動き自体は正しいが、分岐しているときは rebase/merge の方針を明示した方が安全。
まとめ
- 他人ブランチを基点にして作業し、その基点が未完で動いていると、自分の作業ブランチとリモートの同名ブランチが分岐しやすい。
-
git pullが止まったら、rebase するか merge するかを決めて統合する。 - 今回は rebase を採用し、競合解消 → プッシュして解決。
Discussion