Git push ke cabang yang salah

99

Bekerja dengan git, setelah beberapa 'commit', dan beberapa 'push', saya menyadari bahwa saya menggunakan branch yang salah!

Sekarang saya harus menghapus dengan cara tertentu perubahan saya di salah_branch dan melakukan dan mendorong perubahan di right_branch

Apa cara terbaik (dan sederhana) untuk melakukan itu?

Terima kasih

Alessandro De Simone
sumber
Pertanyaan bagus @tokland: 99% pengembang ruby ​​menggunakan git, dan proyek yang saya kerjakan ada di RoR ... tapi saya tahu ini bukan motivasi yang baik
Alessandro De Simone
3
Dari sudut pandang saya, ini bukan duplikat dari apa yang dikatakan oleh Halfdan, karena ini juga tentang memindahkan komitmen ke cabang lain, tidak hanya menghapusnya.
olenz

Jawaban:

144

beralih ke cabang itu, periksa git logdan git revertkomit tersebut secara individual. Setelah Anda selesai melakukannya, beralih kembali ke cabang yang diinginkan dan di sana Anda dapat menggunakan git cherry-pickuntuk memilih komit tertentu dari git refs dan menggabungkannya ke cabang yang tepat.

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

Jika komit dikelompokkan bersama dan tidak ada komit yang didorong setelah komit kotor Anda, Anda bahkan dapat menggunakan git resetuntuk membuat cabang yang salah itu ke status sebelum komit Anda dan kemudian mengikutinya lagi menggunakan git cherry-pickuntuk memasukkan komit Anda ke cabang yang benar.

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2
Dhruva Sagar
sumber
Kembalikan + pilih ceri tampaknya jauh lebih sederhana daripada metode lain yang mungkin melibatkan pengaturan ulang kepala dan / atau rebasing.
ChrisV
2
Untuk git cherry-pick, Anda dapat meletakkan beberapa shas dalam satu baris, mis git cherry-pick commitsha1 commitsha2.
ThomasW
Penyelamat! Dan tidak rumit. Terima kasih!
Craig Silver
apa yang terjadi ketika Anda ingin menggabungkan wrong_branch (misalnya mengembangkan) menjadi right_branch (misalnya fitur / X), maka Anda mendapatkan pengembalian untuk membatalkan perubahan yang Anda pilih.
timB33
revertjauh lebih bersih dan tidak dramatis daripada resetkecuali jika Anda benar-benar ingin menghapus sesuatu yang sensitif (kredensial?)
Qumber
3

Cara paling sederhana adalah menggunakan git rebase. Misalkan Anda memiliki pengaturan itu:

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

Anda ingin memindahkan perubahan C3, C4 ke cabang kanan.

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

Sekarang pengaturannya adalah

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

Maka Anda harus mendorong hasil Anda dengan paksa (JIKA belum ada yang menyinkronkan dengan repo jarak jauh Anda):

git push -f remote:right_branch
Olivier Verdier
sumber
Saya belum mencoba solusi ini, saya sudah bekerja pada jawaban pertama (dan berhasil). Saya tidak terpikir pada rebase, sepertinya alternatif yang baik, terima kasih
Alessandro De Simone
1
Daripada git push -f, gunakan lebih baik git push --force-with-lease. Setidaknya, ini memastikan bahwa referensi jarak jauh akan diperbarui hanya jika tidak ada yang mendorong komit lain selain komit Anda.
Pierre-Olivier Vares
2

Sedikit jalan pintas yang menambah jawaban 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
tarikakyol
sumber