Git yanlış dala it


100

Git ile çalışırken, biraz 'commit' ve birkaç 'push' işleminden sonra, yanlış dalı kullandığımı fark ettim!

Şimdi bir şekilde yanlış daldaki değişikliklerimi kaldırmalı ve değişiklikleri doğru dalda gerçekleştirmeli ve zorlamalıyım

Bunu yapmanın en iyi (ve basit) yolu nedir?

teşekkür ederim


olası Git
halfdan

Güzel soru @tokland: Ruby geliştiricilerinin% 99'u git kullanıyor ve benim çalıştığım proje RoR'da ... ama bunun iyi bir motivasyon olamayacağını biliyorum
Alessandro De Simone

3
Benim açımdan, bu halfdan'ın söylediklerinin bir kopyası değil, aynı zamanda taahhütleri başka bir şubeye taşımakla, sadece onları kaldırmakla değil.
olenz

Yanıtlar:


146

o şubeye geç, git logve git revertbunları tek tek kontrol et . Bunu yaptıktan sonra, istediğiniz şubeye geri dönün ve daha sonra git cherry-pickgit referanslarından belirli taahhütleri seçmek ve onu doğru dalda birleştirmek için kullanabilirsiniz.

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

Taahhütler bir arada gruplandırılmışsa ve kirli taahhütlerinizden sonra itilen hiçbir taahhüt yoksa, git resetbu yanlış şubeyi taahhütlerinizden hemen önce bir duruma getirmek için bile kullanabilir ve ardından git cherry-picktaahhütlerinizi doğru şubeye almak için kullanarak tekrar takip edebilirsiniz.

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

Revert + cherry-pick, başlığı sıfırlamayı ve / veya yeniden oluşturmayı içeren diğer olası yöntemlerden çok daha basit görünüyor.
ChrisV

2
Git cherry-pick için tek bir satıra birden fazla shas koyabilirsiniz, yani git cherry-pick commitsha1 commitsha2.
ThomasW

Cankurtaran! Ve karmaşık değil. Teşekkür ederim!
Craig Silver

yanlış dallanmayı (ör. geliştirme) doğru dalla (ör. özellik / X) birleştirmek istediğinizde ne olur, o zaman kiraz aldığınız değişiklikleri geri alarak geri
dönüşleri alırsınız

revertresethassas bir şeyi gerçekten silmek istemediğinizden çok daha temiz ve daha az dramatik (kimlik bilgileri?)
Qumber

3

En basit yol kullanmaktır git rebase. Bu ayara sahip olduğunuzu varsayalım:

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

C3, C4 değişikliğini sağ dala taşımak istiyorsunuz.

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

Şimdi ayar

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

O zaman sonuçlarınızı zorla itmeniz gerekir (henüz kimse uzak deponuzla senkronize olmadıysa):

git push -f remote:right_branch

Bu çözümü denemedim, zaten ilk cevapta çalışıyordum (ve işe yaradı). Yeniden baz almayı düşünmedim, iyi bir alternatif gibi görünüyor, teşekkürler
Alessandro De Simone

1
Daha çok git push -fkullanmak yerine git push --force-with-lease. En azından, uzaktan referansın yalnızca sizin taahhütlerinizin üzerine başka bir taahhütte bulunulmaması durumunda güncellenmesini sağlar.
Pierre-Olivier Vares

2

Dhruva'nın cevabına biraz kısayol ekleniyor

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.