2013-07-23 13 views
6

時には、機能ブランチをベースラインにコミットする際に問題が発生することがあります。状況によっては間違っている可能性があるため、変更を元に戻す必要があります。ただし、元のブランチで作業を続ける必要があります。機能ブランチからメインラインにコミットされた変更を元に戻しますが、ブランチを最新の状態に保ちますか?

メインラインにgit rebaseを使用して履歴を変更したくない場合(これにより、すべての問題がすべて発生します)、メインラインでgit revertを実行すると、すぐにgit mergeが実行されますブランチ上で、システムに対して行われた他の変更をすべてピックアップすると、完了したすべての作業は消えます。

ブランチの変更をそのまま維持するにはどうすればよいですか?

+0

復帰しているマージコミットですか?もしそうなら、http://stackoverflow.com/questions/1078146/re-doing-a-reverted-merge-in-gitを見てください。 – jszakmeister

+1

ああ、私は問題を見る、あなたはあなたの支店にメインラインをマージしている。私は上記のリンクがあなたのためのトリックを行うと思います。ブランチで「元に戻す」必要があります。 – jszakmeister

+0

ohh。はい、そこに記載されているもののいくつかは参考になります –

答えて

5

私はリベースとリセットをしたくないと思いますが、これはマージ専用のアプローチです。

2つのブランチmasterfeatureがあるとします。 あなたがmasterに機能をマージすることを決定したので、:

$ git merge feature 

、あなたはマスター上のすべてのごfeatureの変更を持っています。私は最も困難なシナリオを想定しています - 両方のブランチでマージした後にコミットがあります。しかし、突然あなたはfeatureの作品は何も見えない、すべてが壊れており、それを元に戻すことを決めた。あなたの歴史は、(あなたがgit log --graph feature masterでそれを見ることができる)である:マージ後に行われている

* commit 838f29fda2333bdbfc0d1be44d2387e6119dc4e8 
| 
|  f3 
|  
| * commit 58d1e3f0e032cc77d4ab2bbf0bdfe6407b96b7e6 
| | 
| |  m3 
| |  
| * commit afb600fe382befe095f9b8a6e9eef98be25c929b 
| |\ Merge: 5cddc52 8660a59 
| |/ 
|/| 
| |  Merge branch 'feature' 
| | 
* | commit 8660a59eeb13f9b3447846ba6977140f7c86c7a4 
| | 
| |  f2 
| | 
* | commit 6f76e2288d69808b97981340198fd8044ab47630 
| | 
| |  f1 
| | 
| * commit 5cddc528de424a01d1d18552ddea93435618e2f7 
| | 
| |  m2 
| | 
| * commit fa6ebb76f9f0308f7dcd1148503534668fa15358 
|/ 
| 
|  m1 
| 
* commit 4e3aa05d6f46eb14bbbc253a42325e9a53a3393e 

お知らせコミットF3と立方メートル。したがって、featureからの変更のみを慎重に削除する必要があります。masterに記載されています。

マスターのベース(パラメータ-m1)を維持しながら、masterのマージコミットを元に戻すことができます。それを達成するために、私は合流点に基づいて新しいブランチを作成し、それに戻す:

$ git checkout -b feature-revert afb600fe 
$ git revert -m1 HEAD 

は今、私たちは枝feature-revertに元に戻した変更を持っています。今では簡単ですだけでマージすることにより、マスターにそれを置く:

$ git checkout master 
$ git merge feature-revert 

ので、現時点ではmasterfeatureから何かを持っていません。ただし、後で機能を再統合したい場合、元に戻された変更は、マージされて元に戻されるので、マスターで失われます。私たちはそれをマージして、我々は、もう枝を必要としないと仮定し

$ git checkout feature-revert 
$ git revert HEAD 
$ git checkout feature 
$ git merge feature-revert 

:あなたは復帰を元に戻す(HE-HE)とバックfeatureにそれをマージしなければならない問題を解決するために

すでに、しかし、あなたは、あなたがしたい場合は、それを保つことができる:

$ git branch -d feature-revert 

あなたはそれをバックマージするfeature通常、通常のワークフローにmasterからのすべての変更をもたらすことに、注意する必要があります。

featureで修正した後、いつでもいつでもいつでもmasterにマージすることができます。

0

フィーチャーブランチでgit revertを実行してから、それをマスターにマージしてみましたか?

このようにして、ベースラインは同じままになり、機能ブランチで作業を続けることができます。

+0

私はそれをしたらどのように変更を保持するのですか?変更を削除しないでしょうか?復帰を直ちに復帰した場合、その後のマージが有効になるか、変更を再度削除しますか? –

1

あなたの変更がgit revertになると、ツリーに変更がない新しいコミットが作成されます。

は削除されていますが、元のコミットはまだ残っていますが、は削除されています。

ので、ちょうど:

  • git revertあなたのマージが(正しい親を選択することを忘れないでください)マスターにコミットします。今マスターは、機能ブランチから導入された壊れたコードを持っていません。
  • フィーチャーブランチを修正しました。
  • マスターで最初の復帰を元に戻します。あなたがhere(またはインストールされている場合、ローカルのgitのドキュメントで同じファイル)についてを参照してください

上で機能ブランチの修正をマージもともと

  • それを合併し、これは機能の壊れ状態を再度ご紹介します詳細はこちら

    Miは、fj .. fxは機能ブランチの後に修正され、あなたが問題に気づいたときに~Miが復帰され、機能ブランチから元のマージです~~Miがある
    --- a -- ... -- Mi ... ~Mi ... ~~Mi -- Mx [master] 
         \  /     /
         f1 ... fi -- fj ........ x -- fx  [feature] 
    

    あなたの歴史は、のように見える終わります~Miの復帰など

  • +0

    しかし、いったん私はマスターを元に戻してしまえば、マスターを機能ブランチにマージすることはできません。 –

    +0

    はい、元に戻すことができます。上記の箇条書きリストの3番目のポイントは、グラフの中で「~~ Mi」と表示されています(下の段落で説明されています)。リンクされたドキュメントのLinusからの引用のすぐ下に表示されています。 – Useless

    +0

    'git rebase --no-ff a'を介して、リンクされたドキュメントのようにブランチを再作成することはできませんでした。ここでaは分岐ポイントですか? – Hasturkun

    関連する問題