2012-03-06 7 views
7

背景:我々は我々のプロジェクトのためのgithubのを使用して、私は、私たちのメインリポジトリの私自身のフォークに取り組んでいます。大きなマージコミットを避けるために、マージの代わりにリベースを使用します。Gitは長寿命(リモート)上のリベース機能ブランチ

シナリオ:

  1. 新機能を実装、私のフォークのマスターのローカルブランチを作成し、そこに私の変化に置く:私は仕事をしたいの方法は、このようなものです。グループ内の私と他の人は、多くの小さなコミットを行います。そのため、ブランチ上の同じファイルに影響を与える複数のコミットがほとんど常にあります。
  2. プッシュ私のフォークへのローカルブランチはので、私は、私はすべての私の変更は私のラップトップが死亡した場合に失われたり失われて持っている必要はありません(私が働いているかのリモートコピーを持っている。私は最後にこれを実行してみてください毎日の)。
  3. 機能の終了に時間がかかる場合は、自分のフォークのマスターにリベースして、機能が損なわれる可能性のある変更がないことを確認することがあります。これは通常正常に動作します。
  4. ブランチのリモートコピーを最新の状態に保つために、ローカルブランチをリベース後にプッシュします。

問題:手順4で問題が発生します。私はほとんどの場合、早送りではないコミットを扱い、git push --forceを使用する必要があります。

私は

Git: how to maintain permanent parallel branches

How to maintain (mostly) parallel branches with only a few difference

を見てきましたし、私のワークフローの仕事を作るための方法を発見していません。 gitワークフローでGoogle検索を行うと、ローカルブランチで作業し、リモートコピーをgithub(例えばhttp://nvie.com/posts/a-successful-git-branching-model/)に保存しないと仮定した結果が返されます。

私はGitリポジトリへの比較的新しいので、私は、私はここで何かをしないのですかどうかを知りたいのです。私は--forceなしでステップ4をやりたいと思っています。マージの代わりにリベースを使用し、ローカルブランチのリモートコピーを保持できる代替ワークフローも非常に便利です。

答えて

8

git push --forceは、git pushがリバースとリモートブランチを処理するときに、それがないと早送りプッシュを実行しないため、実際の生活の一部です。 gitのほとんどの事柄は履歴が追加され、編集されたことはなく、rebaseはその前提を破っていると想定しているので、動作させるためにはかなりうねったことをしなければなりません。

リバース・ワークフローは非常に似ていますが、しばらくするとマージ・ワークフローに戻りました。 Rebasingは素敵な線形履歴を提供しますが、--forceを必要とするなど、多くの欠点があり、masterなどでマージする前にブランチの状態を見ることができなくなります。

Amberが言及しているように、rebaseは同じブランチ上の他の人と作業することを非常に困難にします。git push --forceの前に、他の誰かが最初にプッシュしたかどうかを見るために、 pull --rebaseの場合、git push --forceです。これにも競合状態があります。誰かがあなたの直前にプッシュするとpush --force、その変更はあなたの上書きされます。

+1

'--force-with-lease'を使って競合状態を避けることができます。アップストリームがあなたのローカルよりも新しい場合、失敗します。 – mLuby

6

rebase ingの場合は、rebaseは履歴を書き換えるため、プッシュすると常に--forceになります。それは単にそれがどのように機能するかです。書き換えられた履歴は、定義によって同じ歴史の上に早送りすることはありません。

の代替ではなくrebase INGのmergeにあります。リベースの代わりにマージを使用している場合を除いて、まったく同じワークフローを使用することができ、プッシュを強制的に押す必要はありません。

誰もが脇あなたからあなたのリモートブランチを使用していない場合は、--forceを使用することは、本質的に悪いわけではありません。他の人がリモートブランチを使用してである場合は、とにかくmergeを使用してください。

関連する問題