git push forceブランチは間違っていますか?


10

機能ブランチで作業しているときは、作業がレビューされてメインブランチに統合される前に、インタラクティブなリベースを使用してブランチのコミットクリーンアップする傾向があります。

機能の開発中に、バックアップ手段として中間作業をリモートリポジトリにプッシュしたいと思います。つまり、ハードドライブがクラッシュしたとき、機能ブランチ全体が失われることは望ましくありません。

ただし、これによりgit push --force、リベースの後にリモートリポジトリにアクセスしなければならないことがよくあるという事実につながります。このアクションは、一般的に眉をひそめています。または、リンクされたgithubページにあるように:

コミット履歴を変更すると、リポジトリを使用する他のすべての人にとって物事が難しくなる可能性があるため、すでにリポジトリにプッシュしたときにコミットをリベースすることは悪い習慣と見なされます。

この矛盾を解決する(一般に受け入れられている)ポリシーはありますか?

なぜこれがの複製ではないのかgit "リベースのゴールデンルール"はそれほど重要なのですか?

ここでの私の質問は、リモートリポジトリに作業バックアップすることと作業リベースすることの間の競合を解決するためのポリシーを求めています。したがって、なぜリベースを強制しないことが「不可欠」であるのかを尋ねます。



1
@gbjbaanb WIPコミットを行う場合、リベースは、1日間の作業で多くのコミットを行わないようにするのに非常に便利です。必要に応じて「覚えている状態に戻す」オプションがあるため、小さな変更のコミットを頻繁に行います-これらのほとんどはレポジトリのメイン履歴とは無関係/ノイズです(これがrebaseがとても便利な理由です)。
エンダーランド

1
@gbjbaanbそれは私が思う意見の問題です。多くのチームは、リベース戦略を使用して履歴をクリーンに保ちます。
Chiel 10 Brinke

1
@enderland誰もがかなりの歴史を望んでいますが、それでもリンクに示されているように間違った(そして危険な)ことをしています。トーバルズは決してそれを入れるべきではなく、代わりにディスプレイ上でコミットを「圧縮」することを許可すべきだった。
gbjbaanb

1
@gbjbaanbしかし...彼はしなかったので、私たちは私たちが持っているもので作業する必要があります。私にとって、各機能ブランチからの30回以上の個別および増分コミットの代わりに、マスターブランチで単一のコミットを行う方がはるかに便利です。しかし、だれもが異なるワークフローを持っていると思います
...-エンダーランド

回答:


5

自問すべき重要な質問:

  • マスターにマージした後、リモートブランチを保持しますか?

マスターにマージした後にリモート機能ブランチを削除すると、すでに履歴が失われています。マージ/ PRを行う前にブランチをスカッシュ/リベースすると、この履歴は失われます。この場合、強制プッシュはすべて、githubをバックアップとして使用できるようにします。

強制プッシュではなく履歴を保持したい状況は、一時的な期間だけ存在するのではなく、リモートブランチがマージ後も存続している場合です。

リベースされていないブランチを保持するかどうか尋ねていると思いますか?いいえ、AFAIC。それでも、それをプッシュ強制すると、理論的には同じブランチにプッシュした他のユーザーからのコミットが失われる可能性があります

複数の人が同時にそのブランチにプッシュしているようです。あなたがこの手段を行うには、ブランチの履歴を気に。

中間作業のために代わりにできることは、そのブランチの分岐を作成することです。これにプッシュしてから、マージする前にすべてのコミットを単一のコミットにリベースすることができます。したがって、機能ブランチにコミットすると、コミットは1つだけです(ブランチ全体のリベースされた履歴を使用)。


「マスターに再びマージした後、リモートブランチを保持しますか?」リベースされていないブランチを保持するかどうか尋ねていると思いますか?いいえ、AFAIC。それでも、それをプッシュ強制すると、理論的には同じブランチにプッシュした他のユーザーからのコミットが失われる可能性があります。
Chiel 10 Brinke

@ChieltenBrinke私はそれについて少し編集しました。FYI
enderland

プッシュ強制の場合、コミットの破壊を防ぐ手段としての分岐は、実際には非常に良い提案だと思います。しかし、知る限りでは、これは実際にはgitの概念ではなく、これを簡単に実行するためのサービスラッパー(githubなど)が必要です。私はそれについて正しいですか?あるいは、「分岐」という用語の使用を、単に別のブランチを作成したと間違えたのかもしれません。
Chiel 10 Brinke

@ChieltenBrinkeを使用すると、さまざまな方法で同じことを達成できます。機能ブランチがリモートリポジトリにある場合は、リポジトリをフォークして、そのブランチのバージョンを取得できます。そして、コミットを潰した後、そのブランチをリモートブランチにマージします。または、別のローカルブランチを作成して(おそらくfeaturebranch-local)、そのブランチでアクティブなdevを実行し、必要な数のコミットを行うことができます。マージしたい場合は、それらのコミットを押しつぶしてから、機能にマージします。基本的には、実際の一時的なブランチでdevを実行してから、機能に押し込み/マージします。
エンダーランド

githubを使用しないため、レポのフォークは選択できないと仮定して、「プライベート」develop-featureブランチで作業します。もちろん、プライベート性は純粋に慣例によるものであり、何によっても強制されませんが、特にこのために特定のブランチ命名規則が導入されている場合、ポリシーの一部にすることができます。(たぶん私はあまりにも不安になっているかもしれませ--force-with-leaseんが、そうではないかもしれません:)との組み合わせは、他の投稿で指摘されているように、傷つけることはできませんが、頼りにするべきではありません。
Chiel 10 Brinke

3

ここに私の心を横切るいくつかの可能性をリストしています。

常に新しいブランチにリベースする

乱雑なブランチsome-featureがある場合は、新しいブランチにリベースします。例えば

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

その後、some-feature-rebaseレビューして統合しました。

問題:ここでの大きな欠点は、厳密に言えば、リベースごとに新しいブランチが必要になることです。(たとえば、コードレビュー後に変更を加えた場合、複数のリベースを使用できます)

使用する git push --force-with-lease

git push --force-with-lease代替git push --forceについて学びました。

予想される状態でない限り、ブランチの更新を拒否します。すなわち、誰も上流のブランチを更新していません。

問題:これは、justを使用する状況で直接改善するようです--forceが、まだいくつかの警告があります。最も顕著なのは、のgit fetch代わりにgit pullを行い、ローカルのアップストリームブランチを更新--force-with-leaseし、リモートでマージされていない変更が行われなかったと思い込むブランチ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.