2011-12-29 9 views
2

ここにgitリポジトリがあります。 私はbranch.master.rebase = truebranch.master.mergeoptions = --no-ffを設定しているが、私は問題に出くわしています:Git:クリーンな履歴ツリーを維持しようとすると問題が発生する

誰かがマスターに機能ブランチをマージしようとしました。マージは成功し、gitは支店が起点/マスターより30コミットであると言いました。彼が変更をプッシュしようとしたとき、gitはプッシュを拒否しました。リモート側で変更があったからです。彼が引っ張ったとき、gitはマスターに合併したコミットのrebaseを作ったが、今はmasterよりも29 commitしかなかった。

リベース後、コミットは機能ブランチからのコミットではなく、新しいコミットとして再適用されるため、マージコミットが失われたと考えられます。

プッシュした後、木はそのようなものだったが:

* c3'(head, master, origin/master) 
* c2' 
* c1' 
| * c3 (feature_branch, origin/feature_branch) 
| * c2 
| * c1 
|/
* 

私が達成しようとしたものである。

* c4 (head, master, feature_branch, origin/master) 
| \ 
| * c3 (origin/feature_branch) 
| * c2 
| * c1 
|/
* 

マージは、私は「何を、早送りマージのように見えました分岐の歴史を維持するために避けようとしています。

私はこれを避けるために何ができるのですか?

おかげで、

編集:この記事は私の問題descibes :http://notes.envato.com/developers/rebasing-merge-commits-in-git/

は今私の知る git rebaseのオプションを--preserveを-マージしますが、このオプションを作るための方法がありますデフォルト?

これ以外の場合、開発者はgit pullではなく、git fetchgit rebase origin/masterでなければなりません。

+1

このリンクを試してください:http://www.randyfay.com/node/89私を最も助けました。 –

+0

ここのデベロッパーたちは、 'git push --force'について知らないのです。 しかし、この記事がどのように役立つか分かりません、もっと説明できますか? リモートには、すべての作業がマスターにマージされる前にレビューされるので、マージする前にブランチをリベースすることはできません(最初にブランチをプッシュする前に、マスターからリベースするように指示されます)。 –

+0

個人的には、「マージワークフローの代替案」に記載されているプルリクエスト戦略が好きです。このレビュープロセスでは、http://code.google.com/p/gerrit/を使用することができます。マスタブランチとのマージを担当する1人は制限的で、マージ可能でない場合はプルリクエストを拒否する必要があります。 –

答えて

3

なぜすべての分岐履歴を保存するにはbranch.master.rebase = trueを使用しますか?

+0

私は '--rebase'でマージコミットを失うことに気づいていませんでした。 –

+0

"アップストリームブランチにすでに変更が含まれている場合(たとえば、アップストリームに適用されたパッチを郵送したため)、そのコミットはスキップされます。コミットのマージは、以前のコミットにすでに含まれている変更を表します。だからそれはスキップされます。 –

+0

私はまた、ブランチのマージを避けるためにそのオプションを設定しました。 –

3

履歴をきれいにすることは、何度も重視されています。 DAG(有向非循環グラフ)の性質は、特定のコミット(sha1s、タグ、ブランチ、tree-ishなど)への参照を簡単に設定して、どのコミットが既にマージされているか、再配置しないと、より正確な方法で履歴が保持され、並行して開発されたものと、それらの取り組みが統合された時点が示されます。

フィーチャーを小さくすることができれば、ブランチ・パー・フィーチャーを使用して追加することができます。これは、我々が使用するワークフローです:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

は当初、私は私の素敵できちんと歴史と直線を保っ言っています。私がGitを使いこなすにつれて、これがSVNのような非DVCSツールの使用から継承されたことが明らかになりました。

+0

branch-for-featureを作成します。歴史をきれいにすることで、私はブランチをマージすることを意味するので、コミットツリーは分かりやすいです。 –

+0

フィーチャ内のマージについて話している場合、またはマージしてフィーチャを統合する場合に依存します。 –

関連する問題