2017-10-05 9 views
4

私は次の問題を抱えています: ブランチAで作業しました。 ブランチAはマスターブランチにマージされています。Git:後で結合解除された結合ブランチでの作業

しばらくすると、顧客は、更新する必要があるため、変更を取り消すことを決めました。マスターブランチの支店Aで行われました。

だから、マスターブランチの歴史は次のようになります。

Some stuff 
Some other stuff 
Some stuff, where the merge of Branch A was reverted 
Some other stuff 
Some other stuff 
Branch A was merged into master 
The commit of Branch A (Branch A contains one Commit) 

私は支店Aをリベースしたいので、私は何かしたい:

The commit of Branch A (From here I want to continue working) 
Some stuff 
Some other stuff 
Some stuff, where the merge of Branch A was reverted 
Some other stuff 
Some other stuff 
Branch A was merged into master 
The commit of Branch A (Branch A contains one Commit) 

私が変更したいドント注意を私の遠隔マスターの歴史、私は支店のコミットが私のマスターの最後のコミットでrebasesされる必要があります。その後、更新した支店Aを再びMasterにプッシュします。

今、私はブランチAで作業を続けたいと思いますが、まず、現在のマスターブランチでブランチAをリベースして、最新の状態にします。

問題は次のとおりです。ブランチAをマスタにリベースすると、ブランチAで行った変更が削除されたように見えます。これは、マスターブランチのマージ逆のためだと思います。ですから、Gitは、ブランチAがマスターブランチで削除されているので、ブランチAをマスターにリベースすると、削除も完了します。

私がブランチAで変更したファイルを、別のブランチに1つコピーして、マスターからチェックアウトしたかったものをコピーしたくないです。私は良い解決策、任意の推奨事項があると思いますか?

+2

お客様は何をしましたか?彼はマージコミットを再開しましたか、それとも 'リベース 'を使って削除しましたか?最高の行動を決める答え。 –

+0

@SebastianLenartowicz指定された履歴は、コミットの復帰があることを示しています。 –

+0

ブランチAのリバートを元に戻すのはなぜですか? –

答えて

1

にコミットIDを変更するには、対話型リベースを使用することができますそれぞれの前にこれをいくつかのオプションのうちの1つに変更することができます。これらのオプションはすべてこのテキストで説明されています。たとえば、skipはコミットを取り消すことができ、それらの変更は元に戻されません。

git revertbranch-aのマージを元に戻したコミットのようにもう1つの潜在的な解決策があります。

+0

かなり涼しいですが、私はそれを正しく理解しています。このために、私はリモートマスタにアクセスする必要がありますか? ローカルブランチでこれを行うと、このブランチで作業を続けます。復帰コミットがまだ歴史に残っているので、リモートマスターに再度プッシュするとどうなりますか? – MJohnyJ

+0

@MJohnyJリモートブランチにアクセスすることなく、ローカルリポジトリに変更を加えることができます。ここでの提案は、あなたの 'branch-a'を再構築することです。私はこれが 'master 'と' branch-a'のどこにあるのかについていくつかの仮定を書いています。これらの支店がどこにあるのか明確にしてくださいますか? –

+0

@MJohnyJ 'git rebase -i'は、復帰コミットを削除することを許可します。最終的な引数を変更し、 '--onto'を使う必要があるかもしれません。変更を取り戻すために、コミットを元に戻すこともできます。 –

1

これはちょっと難しいことです。 BranchAHEADは既にmasterに属しているため、マスターのコードはBranchAよりも新しいものとみなされます。この場合、マスターブランチの変更を明示的なコミットで元に戻すのではなく、リセットした方が良いでしょう。

以下のオプションはすべて履歴の書き換えが必要なので、一時的なブランチで最初に試してみてください。

1つのオプションは、rebase --ontoを使用してマージブランチとリバートコミットの両方が削除されるように変更することです。

git rebase --onto <commit_id_before_merge_commit> <revert_merge_commit_id> master 

第二には、Gitはそれらをマスターのように同じことを認識しないようなBranchAにコミットハッシュを変更することです。

git checkout BranchA 
git reset HEAD^n # n is the number of commits that are exclusive to branchA 
git add -u # Add all the files. Make sure to add newly created ones. 
git commit -m 'some message' 
git rebase master # should work now 

第三に、あなたはまた、あなたがgit checkout branch-a && git rebase -i masterを使用する場合は、あなたがpickコマンドを使用してテキストエディタでコミットの一覧を取得しますBranchA

git rebase -i <first_exclusive_initial_commit_id_of_branchA> 
+0

コミットハッシュを変更するのは本当に良い考えです。これは私が見ることができる唯一の方法で、リモートのマスターレポにアクセスすることはありません。しかし、それが問題の適切な解決策であるかどうかは確かではない – MJohnyJ

0

マスターの履歴には触れたくないので、マスターの履歴を適用して元に戻したという事実を無視して、変更をマスターの上に再適用する必要があります。コミット元に戻すの正確な性質に応じて、<revert>それを呼び出すことができます、私はこれを達成するために、正確に二つの方法を参照してください。

  1. <revert>だけ変更内容を元に戻した場合は、あなただけ取得するために再びそれを元に戻すことができますコミットは変更を再適用します(--x == xと考える)。

    • git format-patchであなたのブランチのパッチシーケンスを作成します。

    • 戻すにコミットした場合には、私はこのようなこのような状況が近づいてしまう、純粋ではありません。

    • git amでマスターにこのパッチシーケンスを適用してください。

    ポイントはgit amは歴史の不可知論者であること、である:それは、現在のコミットの状態を見て、それにパッチを適用します。

関連する問題