Gitの「分岐状態」について
- 「分岐状態」とは、ローカルブランチとリモートブランチが異なり、両者の履歴が完全に一致していない状況を指す
例えば:- ローカルでコミットを追加した
- リモートリポジトリに別の人がコミットを追加し、その内容がローカルにまだ反映されていない
この場合、Gitはどのように両者を統合するべきかを決定することができない
解決方法の設定
Gitは3つの方法でこの状況を解決する設定を提供している
ヒントメッセージに記載された以下の方法を選択可能;
-
merge(マージ方式)
git config pull.rebase false # マージ
この方法を選ぶと、ローカルブランチの内容とリモートブランチの内容をマージする
コミット履歴に「マージコミット」が生成される(分岐状態が解決された記録が残る) -
rebase(リベース方式)
git config pull.rebase true # リベース
- この方法ではリモートブランチの履歴の後ろにローカルブランチの変更を適用する
- 履歴を「平らにする」方法で、コミット履歴がきれいに保たれるメリットがあるが、複雑な状況では競合が発生する可能性もある
-
fast-forward only(早送り方式)
git config pull.ff only # ファストフォワードのみ
- この方法を選ぶと、ローカルブランチがリモートブランチに追いつける場合だけ変更を取り込める
- もし分岐が発生している場合はエラーになる、、
- この方法は慎重な統合を目指す場合に使用される
一回限りの解決方法
設定を毎回変更するのが面倒な場合、一時的にコマンドラインでオプションを指定することも可能
-
マージする場合
git pull --no-rebase origin main
-
リベースする場合
git pull --rebase origin main
-
ファストフォワードのみの場合
git pull --ff-only origin main
推奨設定
以下は一般的な選択肢;
- チームで作業していて履歴の正確さよりも簡単に管理することを優先する場合、
git config pull.rebase false
(マージ方式)が無難 - 履歴をきれいに保ちたい場合、
git config pull.rebase true
(リベース方式)が推奨
もし常に一貫した設定にしたい場合は、グローバル設定として以下を設定する:
git config --global pull.rebase true # 常にリベース
または、
git config --global pull.rebase false # 常にマージ