1. ホーム
  2. git

[解決済み] Git でリモートブランチをリベースする

2022-03-03 15:21:20

質問

Git の中間リポジトリを使ってリモートの SVN リポジトリをミラーリングしており、そこから人々がクローンして作業することができます。この中間リポジトリは、毎晩上流の SVN から master ブランチをリベースしており、私たちは機能ブランチで作業しています。たとえば

remote:
  master

local:
  master
  feature

機能ブランチをリモートにプッシュして、期待通りのものを完成させることができました。

remote:
  master
  feature

local:
  master
  feature

その後、リモートを追跡するためにブランチを再セットアップしました。

remote:
  master
  feature

local:
  master
  feature -> origin/feature

そして、すべてがうまくいっています。ここからやりたいことは、feature ブランチをリモートの master ブランチにリベースすることですが、これを自分のローカルマシンから行いたいと思います。できるようにしたいですね。

git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

リモート機能ブランチをリモートマスターと最新の状態に保つため。しかし、この方法はGitから文句を言われる。

To <remote>
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to '<remote>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

git pull はトリックを実行しますが、避けたいマージコミットが発生します。私は、メッセージに記載されている feature -> feature ではなく feature -> origin/feature が、これは単にプレゼンテーションの問題かもしれません。

私は何かを見逃しているか、あるいは完全に間違った方法でこれを進めているのでしょうか?リモートサーバーでリベースを行わないことは重要ではありませんが、リベースによるマージの衝突を修正することが非常に難しくなります。

解決方法は?

その機能を一人で使っているのか、他の人がそれを使って作業しているのかによります。

自分だけならリベースの後に強制的にプッシュすることができます。

git push origin feature -f

しかし、もし他の人がそれに取り組んでいるのであれば、master から rebase するのではなく、merge するべきです。

git merge master
git push origin feature

これにより、コラボレーションする相手と共通の履歴を持つことができるようになります。

別の次元では、バックマージはしない方がいいです。これは、その機能に属さない他のコミットでその機能ブランチの履歴を汚していることになり、リベースの有無にかかわらずそのブランチでの以降の作業を難しくしてしまいます。

という私の記事です。 フィーチャーごとのブランチ .

お役に立てれば幸いです。