2016-04-18 8 views
1

ローカルブランチをチェックアウトし、いくつかのコミットを行い、ブランチを元に戻しました。私の上司は私のブランチをマスターにマージしたかったのですが、押し出されたブランチのチップをマスターにマージするのではなく、コミットごとにマージする必要があったようです。その結果、当社のgitの履歴は次のようになります。 branch names changed to protect boss's reputation in the companygit squashいくつかのマージコミット

は、それが唯一の私の起源/ PL/EngATSDataOnChkPrint枝の起源に、コミットマージ表示されるように歴史を修正する「権利」方法はあります/マスター?私はそれがいくつかのスカッシュを持ってgit rebase -iのいくつかの並べ替えを含むつもりだと思うが、私はいくつかのアドバイスを最初に取得せずにそのようなことを試みるのは疲れている(私は私の上司より良いですが、

ありがとうございます!

答えて

2

TL; DRバージョン:これをクリーンアップすることもできますが、あまりにも多くの人が既に混乱に頼っている可能性があります。それが2人だけの人なら、それはあまりにも多くないかもしれません。その部分はあなたが決断しなければならないものです(できれば彼らと共に)。


これらのコミットが公開され、あなたといくつか他の人が(私たちはすなわち、あなたとあなたの上司、少なくとも二つの知っている)それらを拾ってきました。

あなた少ない、あるいは全くマージを生成するために、すべてをやり直すことができますが、そうならば、マージを拾ったことのある人が同様にそのリポジトリを調整するためにいくつかの作業を行う必要があります。理由は簡単です:gitのみ今までは新しいものをリポジトリに追加しますが、実際には何も削除しません。 はまだそれらを持っている、あなたはので、新しいものを作る、その後、いくつかのマージを「破棄」するgit resetを使用することができますが、あなたのリポジトリはまだ元のマージを持っている...そして、それを拾った誰

は、それらに依存する作業を行っている可能性があります。そうであれば、削除したと思っているもの(まだ持っているもの)と作業をマージするときにそれらのコミットを再導入します。つまり、ではなく、を自分の仕事とマージする必要があります。本当に削除されていない作品。

具体的には、彼らは以前の仕事、またはあなたがその場所に置いた新しい取り替えのいずれかで、彼らがこの周りに回るまでにrebase作業をする必要があります。

これらのマージの後に、またはマージの一部としてリベースすることを選択した場合も同じことが起こります。これは、rebaseがにコピーされ、新しいIDと新しい親IDを使用して新しいコミットにコミットするためです(通常、リベースはマージを破棄します)。

たとえば、3つのコミットがあり、それらを移動(リベース)したいとします。最初の "移動"コミットは、新しい親IDを持つことができるようにコピーしなければなりません。これにより、自身の新しいIDが与えられます。つまり、2番目のコミットもコピーして、最初のコピーの新しいIDを親として持つことができ、2番目のコピーに新しいIDを与える必要があります。

(前)::

(コピーした後)
... <- o <- o <- o  <-- master 
     \ 
     o <- o <- o <-- yourbranch 

... <- o <- o <- o    <-- master 
     \   \ 
     \   o <- o <- o <-- yourbranch [copies] 
      \ 
      o <- o <- o   [abandoned originals] 

誰場合は、第三は、その親として2番目の新しいIDを持つことができるようにコピーする必要がありますコミットそうでない場合は、これらのコミットがあります。が公開されていない場合は確かに当てはまります。が公開されています。元のIDを忘れてコピーしても問題ありません。しかし、他の誰かがオリジナルを持っていれば、それらを再導入することができます。


何を、決して?

いいえ、決してありません!

何も決してありません。

まあまあ!

(より正確には、を削除するを表示されていることのものは、通常はちょうどGitは本当にゴミとしてリサイクルするのに十分な長されていることを決定するまでには30日かそこらのために残っている場合は、隠されている。)

+0

ありがとうございました。これは多かれ少なかれ私が恐れていたものです。そして、そうです、組織の他の誰かがこのリポジトリをすでに取得しているかどうかは分かりませんので、私はそれを残して、今から適切に行う方法を知っていることを確認することをお勧めします。再度、感謝します! –

0

rebaseは通常、リベースされたコミットがリニアであり、マージする必要がないため、マージコミットを削除します。結果を試してみると、悪い実験を元に戻すために何か問題が生じた場合は、reflogresetを使用してください。

歴史はすでに公開リポジトリ(原点)にプッシュされているようですので、このような状況では一般に公開履歴には悪いフォースプッシュを行う必要があります。もしあなたが私なら、私はそれをそのまま保つでしょう。歴史は変わっていますが、悪くはありません。

関連する問題