QA@IT

remoteブランチの更新方法

3799 PV

次のような場合に、git push -f を使わない正しい方法があるなら知りたいです。

1.masterからbranchを作る
git checkout -b br1

2.br1上で開発を行う

3.オンラインにも置いておきたいのでbr1をremoteにpushする
git push origin br1

4.origin/masterが更新されたのでpullする

5.br1をmasterにrebaseする
git rebase master

6.br1が新しくなったのでremoteにも反映させたい…
git push origin br1

 でもこれだと怒られてしまう。
 br1は自分一人しか触らないのでとりあえず git push -f origin br1 してしまう。

オンラインに置くのはバックアップと複数端末で開発を行うためです。
forceしなくてもいい方法があれば今後のためにも覚えておきたいと考えています。

  • これ、gitの仕様上、仕方ないのはわかるんですけど不便ですよねぇ。pushに「publish」と「backup」の2つの役割が同居してて、かつコンフリクトしてるのが問題なんでしょうね。自分も粛々とpush -f使っていくことにします。。。 -

回答

6.br1が新しくなったのでremoteにも反映させたい

これがうまくいかないのは、

5.br1をmasterにrebaseする

ここでbr1の親のコミットが新しいmasterのコミットに変わります。すると、リモート側のブランチと違う親になり、fast-fowardできない関係になるのが原因じゃないでしょうか。5の代わりにbr1ブランチで

git merge master

をするとbr1にマージコミットが作成され、ブランチした時からmasterまでのコミットがbr1ブランチに入ります。ただ、br1ブランチの変更をmasterにmergeなりrebaseしようとするとうまくいかない気がするんですよね。masterの変更が入ってしまっているので…。

gitのリポジトリをうまく運用するために、コミットを付け替えたり、マージする方向は単方向の方がいいですよ。一旦ブランチを切ったら、ブランチには元になったブランチの変更を入れない。もし確認したいのなら、ブランチからブランチaを作り、そっちにブランチのもとになったブランチ(例えばmaster)の変更を入れる、とかしていった方がいいように思います。

編集 履歴 (1)

rebase したものをリモートに反映させたいのなら push -f しかないと思います。

公開していて誰がいつ pull したのかわからないようなブランチの場合は、一旦 push したものは rebase しないのが正しいと思います。

編集 履歴 (0)
  • そうなのですね。
    確かに、ある端末でrebaseしてpush -fしたあと、別の端末でpullするとおかしなことになりました。

    個人使用ということに留めておきます。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。