1. ホーム
  2. git

[解決済み] 強制プッシュを必要とせずに git rebase を使用するにはどうすればよいですか?

2022-10-30 08:04:06

質問

git nirvanaを達成するために、現在マージしている状況でrebaseを活用する方法を一日かけて勉強しているところです。

私が考えるgit 101の流れ(以下に綴ります)を実行するとき、私は以下のことをしなければなりません。 push --force を実行し、変更をオリジンにプッシュしています。

私だけではないでしょう - この件が取り上げられていることは承知しています ( 1 , 2 , 3 , 4 , 5 )、技術的な理由は理解しています。 なぜ が必要な技術的な理由も理解しています。 私の問題はこれです --- rebase を賞賛する多くの (多くの) ブログ エントリがあり、それがいかに彼らの生活を変えたかについて述べています ( 1 , 2 , 3 , 4 など) がありますが、いずれも push --force がフローの一部であることに言及しているものはありません。 しかし、既存の stackoverflow の質問に対するほぼすべての回答は、" Yeah, if you're gonna rebase, ya gotta use push --force を使用しなければなりません。

リベース擁護派の人数と宗教性を考えると push --force' を使うことはリベースフローの本質的な部分ではないと信じなければなりませんし、もし頻繁にプッシュを強制しなければならないなら、何か間違ったことをしているのだと思います。 .

push --force 悪いこと .

では、私のフローを紹介します。 力を使わずに同じ結果を得るにはどうしたらいいでしょうか?

簡単な例

2つのブランチです。

  • v1.0 - リリースブランチで、パッチのみを含む
  • マスター - 次のメジャーリリースのためのすべてを提供します。

いくつかのパッチのコミットと次のリリースのためのコミットがあります。

次のリリースで失われないように、パッチを私のマスターに組み込みたいと思います。 プレエンライトメント私は単に。

git checkout master
git merge v1.0

しかし今、私は

git checkout master
git rebase v1.0

それで今、私はここにいます。

の時間です。

git push

ダイスはありません。

どのように解決するのですか?

リベースは素晴らしいツールですが、トピックブランチを master に高速にマージするために使用すると、最も効果的です。たとえば、add-new-widget ブランチを master に対してリベースすることができます。

git checkout add-new-widget
git rebase -i master

ブランチの master への fast-forward マージを実行する前に。例えば

git checkout master
git merge --ff-only add-new-widget

この利点は、履歴に複雑なマージコミットやマージ時の競合があまり発生しないことです。なぜなら、すべての変更はマージ前に master の先端にリベースされるからです。二次的な利点としては、リベースしたのに git push --force を使用する必要がないことです。なぜなら、master ブランチの履歴を破壊することがないからです。

これは確かにリベースの唯一の使用例ではなく、また唯一のワークフローでもありませんが、私が見た中ではより賢明な使い方のひとつです。YMMV。