2017-09-08 32 views
0

gitでマージを元に戻す方法について多くの情報がありますが、特定の状況でどのようにこれを行うのかについての一致を見つけることはできません。bitbucketプルリクエストによって作成されたgitマージを元に戻す

誰かが私たちのmasterブランチに私たちのdevelopブランチをbitbucketのプルリクエストによってマージしました。これはちょうど今日起こったので、マスターブランチで最後に行われたことです(マージコミットの上に他のコミットについて心配する必要はありません)。

注:我々は自分自身をホストするのBitbucketので、私たちは、ビットバケットの古いバージョンを持っています。復帰プル要求オプションはありません。

  1. git reset --hard *<SHA of commit before the merge>*

    • これは、マージは、それが決して起こらなかったかのようにコミット削除されます:私は何を読んでから、

は、基本的にはgitでこれを扱うには二つの方法があります。

  • どこでも「歴史を書き直すのは悪い習慣だ」、あるいは「公に共有されたレポでは決してこれをしない」ということを読んだことがあります。これは問題を解決するようですが、実際にこのマージをやり直したいときは6ヶ月後には問題にならないでしょうdevelopからmaster
  • これが最善の方法であればそれでは、bitbucketのプルリクエストはどうなりますか?そのプルリクエストはまだbitbucketに存在しますが、作成したマージコミットは削除されていますので、bitbucketを混乱させるでしょうか?
  • git revert -m 1 *<SHA of the merge commit>*

    • これは、それは我々が後にmasterdevelopをマージするつもり除いこれは、大丈夫だと思うマージ
    • によって行われた変更を取り消し、新しいコミットを作成します。私が読んだことから、developmasterにマージすると、今日取り戻された変更は含まれないため、これを行う前に復帰コミットを元に戻すことを忘れないでください。誰もこの復帰を覚えていないとき、私は実際にこれが6ヶ月後に問題になることを望んでいません。
  • TL; DR:私たちは再びこのマージを行うにはしたくないとき、それは今から6ヶ月を引き起こす可能性があるため、問題のgit revertを行う上躊躇です。私はまた、誰もそれをすることを警告しているようで、bitbucketのプルリクエストに問題を引き起こす可能性があるので、git resetを実行することには躊躇しています。

    答えて

    1

    いずれかを行うことができます。あなたに何をすべきかを指示する決定的な技術的理由はありません。

    1. 例外的に、転送しないでも問題ありません。それぞれについて説明し、誤ったマスターを引っ張ったチームに尋ねて、回復するのを助けてください。

    2. ブランチを戻すようにdevelopmentブランチを転送し、次にrevert the revertを転送して、その内容に戻すことができます。ケース2について

    PS:

    オリジナルケース

    * 73d5415 (HEAD -> master) master3 
    | * e660100 (development) development3 
    | * 0356d3a development2 
    | * 6cefad0 development1 
    |/ 
    * 209d967 master2 
    * dc25505 master1 
    

    のためには、あなたはmasterdevelopmentを合併し、それを元に戻します。今

    * 7a4f94a (HEAD -> master) Revert "Merge branch 'development'" 
    * 75e1e34 Merge branch 'development' 
    |\ 
    | * e660100 (development) development3 
    | * 0356d3a development2 
    | * 6cefad0 development1 
    * | 73d5415 master3 
    |/ 
    * 209d967 master2 
    * dc25505 master1 
    

    はあなたがshoud、それを修正する

    $ git checkout development 
    $ git merge --ff-only master 
    $ git revert 7a4f94a (the "Revert" commit) 
    

    結果:

    e7b511a (HEAD -> development) Revert "Revert "Merge branch 'development'"" 
    * 7a4f94a (master) Revert "Merge branch 'development'" 
    * 75e1e34 Merge branch 'development' 
    |\ 
    | * e660100 development3 
    | * 0356d3a development2 
    | * 6cefad0 development1 
    * | 73d5415 master3 
    |/ 
    * 209d967 master2 
    * dc25505 master1 
    

    e7b511aがないマスターになるために使用されると、後でマスターするためにマージすることができ、すべての開発が含まれています。欠点はありますが、すべてが1つのコミットとして表されるため、somethigを非難することを意味する場合は、e660100にもう一度コールする必要があります。

    +0

    2番目に詳しいことはできますか?私は従わない。特にあなたの "前方"の使用と。 6ヶ月間に「開発」から「マスター」へのマージを行う際の復帰を考慮して、「開発」を変更する方法があると言っていますか? –

    +0

    グラフを追加した例 – max630

    +0

    詳細な解答をいただきありがとうございます。私はこれを受け入れられた答えとして間違いなくマークしますが、もう一つのことです。マスターでの復帰以来、開発に他のコミットがあったので、マスターから開発への早送りマージはできません。それは何か変わるのだろうか?早送りマージの代わりにマージコミットを行うことでこれを達成できますか? –

    0

    [私は十分な評判を得るために、まだだとして、私はあなたの質問にコメントを置くことができないので、答えとして私のコメントを追加する]

    私が知っている唯一の方法は、マスターの古いハッシュに戻すには(なしマージコミットとコミットの逆転を示す)はforce-pushです。例とオプションについては、git force-pushを参照してください。

    これは反対意見が多いので、議論の余地がある回答です。しかし、bitbucketを使用しているときは、force-pushを制御することができます。つまり、操作のために有効にし、マスターのforce-pushを無効にすることができます。

    注:rebasesquash使用--force-with-leaseようbitbucket最新のプラグイン。

    +0

    答えをありがとう、しかし、私はあなたが私が求めていることを誤解していると思います。私は 'git reset -hard'を使用すると強制的に習得しなければならないことを知っていますが、私の質問はそれが最善の方法か、代わりに' git revert'を行うべきかどうかです。それは歴史を書き直すことはなく、強制力を引き起こさないだろう。なぜ私は両方のアプローチを使用することを躊躇しているのか理解するために私の質問を再読んでください。 –

    +0

    'git reset'と' force push'はヒストリを書き換えてユーザーが使用しないようにしますが、コントロールがあれば(bitbucketはそれを提供します)、そのような状況で使うことができます。 私はあなたが探している正確な答えを提供しているのではないので、ダミーファイルとブランチを持つダミーリポジトリを作成することをお勧めしますか?状況を再現して、どのソリューションがあなたに適しているかを確認します。このようにすれば、マスターを邪魔することなく、安全に多くのことを試すことができます。 – RuSh

    関連する問題