ブログ投稿 " Rebasing Merge Commits in Git " ( Glen Madderngit pull --rebase
による) は、ローカル マージを行った場合の危険性を示しています。
今git pull --rebase
のmaster
上に ofを実行すると、ローカルの mergeorigin/master
が削除されます。
リベース後の次の図を参照してください。マージコミットはもうありません。
これは多くの理由で悪いです。
- 1 つには、実際にはマージをリベースしたいだけなのに、機能のコミットが実際に複製されています。後でフィーチャー ブランチを再度マージすると、両方のコミットが の履歴に残ります
master
。
- そして
origin/feature
、完成したはずmaster
の が ぶら下がったままになっています。
優れた分岐/マージ モデルに従って得られる素晴らしい歴史とは異なり、実際には誤解を招くような歴史があります。
たとえば、誰かが のブランチを見ると、master にマージされていても、まだマージされていないorigin
ように見えます! その人が展開を行うと、あらゆる種類の問題が発生する可能性があります。全体的に悪いニュースばかりです。origin/feature
これは、Github for (Mac|Windows) が検出して回避するものです。
時間内に検出できなかった場合は、同じブログ投稿で次の回復について言及されています。
[master] git reset --hard origin/master
HEAD is now at 9f3e34d sneaky extra commit
[master] git merge --no-ff feature
実際の解決策:
望ましい結果を得ることができます。
を使用する代わりに、 と をgit pull --rebase
使用します。git fetch origin
git rebase -p origin/master
の「よりスマートなバージョン」は、pull --rebase
「マージを保持するフェッチ + リベース」の組み合わせだと思います。
Glenはまた、この一連のコマンドがローカル ブランチに関連付けられた追跡情報を使用しなくなるという事実に対抗するために、次のエイリアスを提案しています。
function git_current_branch() {
git symbolic-ref HEAD 2> /dev/null | sed -e 's/refs\/heads\///'
}
alias gpthis='git push origin HEAD:$(git_current_branch)'
alias grb='git rebase -p'
alias gup='git fetch origin && grb origin/$(git_current_branch)'
Jason Weatheredは「 http://jasoncodes.com/posts/gup-git-rebase 」を投稿しましたが、現在はAanand Prasadの git-upを参照しています。