Apakah ada cara untuk mengulang git?

17

Jadi saya membuat kesalahan yang cukup besar. Saya membuat komit, menarik, menggabungkan (tetapi mengacaukan kode saat melakukannya) dan kemudian mendorong. Saya ingin mengulangi penggabungan itu dan mendapatkan kode yang benar. Apakah ada cara untuk melakukan ini?

Saya menggunakan bitbucket.


sumber
10
Hanya sebuah catatan - ini sebenarnya sesuai topik di SO, dan seharusnya tidak dimigrasi. Coba baca halaman bantuan Anda sendiri kadang-kadang dan perhatikan alat perangkat lunak yang biasa digunakan oleh pemrogram baris. Yang mengatakan, itu juga pada topik di sini - SwiftCore, jangan merasa buruk karena itu dimigrasi, itu bukan salah Anda.
Bob

Jawaban:

13

Tidak yakin apakah ini adalah cara "diberkati" untuk melakukannya, tetapi inilah yang saya lakukan untuk menyelesaikan masalah yang sama tanpa harus "memaksakan dorongan" atau hal-hal kotor seperti itu.

Mari kita asumsikan riwayat Anda terlihat seperti ini (dan M adalah penggabungan flubbed):

-A--B--C--M (master points here)
  \      /
   D----E

Berlari git checkout -b merge_fix <commit ID E>membuat cabang sebelum kami melakukan kesalahan:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Sekarang, mari kita lakukan penggabungan kembali pada cabang baru kami. Kami tidak bisa begitu saja bergabung master, jadi kami harus memilih komit secara manual sebelum penggabungan yang buruk: git merge <commit ID C>Jangan membuat kesalahan yang sama seperti yang Anda lakukan sebelumnya!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Dengan asumsi komit Gterlihat bagus, sekarang kami ingin menyinkronkan dengan bagian atas mastercabang. Perintah ini memberitahu git untuk mengabaikan perubahan yang dibuat untuk dikuasai, dan memaksa perubahan kita untuk menjadi hasil gabungan:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Akhirnya, (sekali lagi dengan anggapan bahwa komit Hterlihat bagus, kami ingin mempercepat masteruntuk memasukkan penggabungan tetap kami:

git checkout master
git merge merge_fix

Ini benar-benar hanya memindahkan masterpointer cabang ke H, tapi saya akan mengambil kesempatan untuk membersihkan seni ASCII saya sedikit:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

Dan begitulah! Anda telah berhasil melakukan penggabungan kembali tanpa membatalkan riwayat apa pun!

mblythe
sumber
6

Anda dapat melakukannya, seperti ini:

  1. Setel ulang ke komit sebelum penggabungan Anda.
  2. Lakukan penggabungan lagi
  3. Dorong paksa

Itu adalah:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Perlu diingat bahwa git push --forceakan menulis ulang apa pun yang Anda miliki di cabang jarak jauh, dan orang lain yang menggunakan cabang itu mungkin akan terpengaruh oleh ini juga. (Biasanya Anda tidak harus melakukan ini.)

janos
sumber
6
Ingat saja melakukan git push --forceitu tidak aman
Zepplock
1

git merge --abort lalu Anda bisa bergabung lagi

Zepplock
sumber
Saya hanya mendapatkan pesan "tidak ada penggabungan untuk membatalkan"
3
Ini hanya dapat dilakukan ketika ada menggabungkan konflik.
chanchal118
mengapa yang minus? ini membantu saya.
swdev
Karena pertanyaannya adalah kapan Anda telah menyelesaikan penggabungan (salah) dan mendorong.
Robin Green
-1

Silakan periksa harapan ini bermanfaat bagi Anda

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

sumber
Meskipun ini dapat menjawab pertanyaan OP, tautan hanya jawaban yang tidak diterima dengan baik di SO. Namun Anda dapat mengutip dalam jawaban Anda kutipan yang paling relevan dari tautan.
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Pranav 웃