2016-03-05 9 views
6

私はたくさんの警告が彼の最近のマージで約た「空のコミット」何同僚の姿を手助けしようとしています。私はgitkを開いて、このような何かを見た:これらのgitコミットは、間違ったブランチにどのように複製されましたか?

_o (Z) Merge branch 'new-branch'        (yesterday) 
o | (Y) Fix bad merge           (person 1) 
o_| (X) Merge branch 'master' into new-branch     (recent) 
o | (W) Last legitimate commit that belongs on new-branch  (person 1) 
| |  ... work on master ... 
o | (F) Legitimate commit that actually belongs on new-branch (person 2) 
| |  ... work on master ... 
o | (E) Legitimate commit that should have been on master  (person 2) 
o | (D') Even more work etc...        (committed by person 2) 
o | (C') More work in master         (committed by person 2) 
o | (A') Normal work in master        (committed by person 2) 
| o (D) Even more work etc...         (authored by random person) 
| o (C) More work in master         (authored by random person) 
o | (B) Starting to work on new-branch      (person 1) 
|_o (A) Normal work in master         (authored by random person) 
o Common Ancestor            (weeks ago) 
明らかにそう

このブランチに取り組んで二人はより頻繁に彼らのブランチにマスタからマージされているはずですが、その後、マージの警告のこれらの山はより明白であったであろう。名前が重複してのコミッターフィールドにあったコミットチームメンバーは、彼はおそらくそれらを引き起こすためにプル--rebaseをしたと言うが、私はそれが動作する可能性がどのようにまわりで私の頭をラップすることはできません。誰が何が起こったのかも説明できますか?

彼らは良性のように見えたので、私は、マージの警告を修正する方法を探していませんよ。私は何が起こったのか理解したいので、将来起こることを防ぐことができます。私のチームは、gitのは比較的新しいので、私は彼らが大部分は試行錯誤を使用して、それを一度に一つの小さなステップを理解しようとしています。

ありがとうございます!

+0

彼らはいくつかのチェリーピックをした可能性はありますか? – jeerbl

+0

私はそれを疑う。私が4つの間違ったコミットに単純化したのは、実際はもっと15に似ていました。私は彼が15チェリーを選んでチェリーを覚えているように感じる。しかし、可能性としてそれを高めるためにありがとう! –

+0

フィーチャブランチをマスタで更新する場合は、マスタをマージする代わりにリベースしてください。これは本質的に現在のマスターとチェリーを取り込み、すべての機能の変更をその上に置く。 – lorengphd

答えて

1

あなたがブランチにリベースを行うと、あなたはその枝の歴史を書き換えます。影響を受けるすべてのコミットは、コミット内で内容が変更されていなくても、IDを少なくとも変更します。このため、実際にはコミットしていないかのように、コミットが重複しているように見えることがあります。同じ内容の2つの異なるコミットがあります。

この "重複コミット"動作を再現する方法は、通常、すでにリモートリポジトリにプッシュされているブランチのリベースを行い、その後、同じリモートブランチに戻してマージします。 rebaseはあなたのコミットのIDを変更し、変更が同じ内容になるにもかかわらず、マージは両方の "重複した"コミットのペアを保持します。既存のリポジトリに

  1. 、 「マスター」ブランチから新しい「機能」ブランチを作成:git checkout -b feature
  2. は、新しいファイル「ファイル・feature.txt」を追加し、「機能」の枝の上にそれをコミット:「マスター」ブランチへgit add . ; git commit -m "added new file on master branch"
  3. スイッチとは、あまりにも、そこに別の新しいファイル を追加し、そのコミット:git checkout master ; git add . ; git commit -m "added new file on master branch"
  4. プッシュリモートリポジトリに機能ブランチ:git checkout feature ; git push --set-upstream origin feature
  5. 今、 「マスター」ブランチ上に「機能」ブランチのリベースを実行します。git rebase master
  6. あなたは今、リモートリポジトリに、この「機能」ブランチをプッシュしようとした場合、あなたは「git pull」を行う必要があるエラーが発生します最初。これは、マージ(git pullgit fetch ; git mergeの省略形です)のために実際にあなたの "重複"コミットを取得した点です。また、コミットの内容は同じですが、ブランチのリベースのために、コミットのID git pull
  7. GUIでブランチを「git gui」(メインメニューの[リポジトリ] - [ビジュアイズ機能]の履歴]に移動します)してみると、次のようになります。 enter image description here
  8. それとも、コマンドラインで直接それを見るためにgit logを使用します:このような何かを参照 enter image description here
関連する問題