Gitが間違ったブランチにプッシュする


97

いくつかの「コミット」といくつかの「プッシュ」の後、gitを使用して、間違ったブランチを使用していることに気付きました!

今、私は何らかの方法で私のwrong_branchの変更を削除し、commitして変更をright_branchにプッシュする必要があります

それを行うための最良の(そして簡単な)方法は何ですか?

ありがとうございました



良い質問@tokland:Ruby開発者の99%がgitを使用していて、私が取り組んでいるプロジェクトはRoRにあります...しかし、これは良い動機にはならないかもしれません
Alessandro De Simone

3
私の観点からは、これは、コミットを削除するだけでなく、コミットを別のブランチに移動することに関するものなので、これは中段が述べたものの複製ではありません。
オレンツ

回答:


140

そのブランチに切り替え、git loggit revertそれらのコミットを個別に確認します。それが終わったら、目的のブランチに切り替え、そこでgit cherry-pickgit refsから特定のコミットを選択して、正しいブランチにマージできます。

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

コミットがグループ化されていて、ダーティコミットの後にプッシュされたコミットがない場合は、を使用git resetして、コミットの直前の状態に誤ったブランチを取得し、それを再度使用git cherry-pickして、コミットを正しいブランチに移動することもできます。

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

元に戻す+チェリーピックは、ヘッドのリセットやリベースを含む他の可能な方法よりもはるかに簡単に見えます。
ChrisV 2013年

2
git cherry-pickの場合、1行に複数のshaを配置できますgit cherry-pick commitsha1 commitsha2
ThomasW 2016年

命の恩人!複雑ではありません。ありがとうございました!
Craig Silver

。あなたはright_branch(例えば機能/ X)に(例えば開発)wrong_branchをマージするときに、あなたが桜に選んだの変更元に戻す戻します得るものが起こる
timB33

3

最も簡単な方法は、を使用することgit rebaseです。次の設定があるとします。

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

変更C3、C4を右側のブランチに移動したいとします。

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

今の設定は

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

次に、結果を強制的にプッシュする必要があります(まだリモートリポジトリと誰も同期していない場合)。

git push -f remote:right_branch

私はこの解決策を試していません、私は最初の答えですでに試していました(そしてそれはうまくいきました)。私はリベースで考えていませんでした、それは良い代替手段のように見えます、ありがとう
アレッサンドロ・デ・シモン

1
git push -f使用するよりも、使用してくださいgit push --force-with-lease。少なくとも、それはあなたのコミットの上に他のコミットを誰もプッシュしなかった場合にのみリモート参照が更新されることを保証します。
Pierre-Olivier Vares 2016年

2

Dhruvaの答えに追加する少しのショートカット

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.