Pertanyaan Bagaimana saya bisa membatalkan penggabungan yang tidak menghasilkan gabungan yang dilakukan?


Saya membuat cabang eksperimental dari master, dan membuat empat commit di cabang eksperimental. Sang majikan, dalam waktu yang berarti, masih tetap di tempat terakhirnya. Sekarang, saya ingin menggabungkan cabang eksperimental saya sedemikian rupa sehingga saya dapat dengan mudah membatalkan penggabungan ini di masa depan.

Ketika saya mencoba mencari, cara termudah untuk membatalkan penggabungan sepertinya saya suka git revert hash_of_merge_commit.

Namun, ini hanya berfungsi ketika saya menggabungkan hash commit gabungan ketika menggabungkan master saya dengan cabang eksperimental. Dalam hal ini, karena KEPALA master belum berkembang, ketika saya mencoba untuk menggabungkan, saya hanya mendapatkan empat komit baru yang ditambahkan untuk dikuasai, dan ini berarti bahwa untuk membatalkan penggabungan ini, saya perlu secara manual mengingat dan mengembalikan masing-masing komit ini di masa depan.

Ada cara yang lebih baik untuk melakukan ini?


5
2017-11-03 15:45


asal


Jawaban:


Anda harus menggabungkan tanpa fast-forwarding, dengan meneruskan --no-ff ke perintah penggabungan.

Dengan cara ini, komit baru selalu dibuat dan Anda akan dapat mengembalikannya.

Umumnya penggabungan cabang fitur harus selalu dilakukan non-fast-forward, membuat integrasi fitur Anda jelas dalam sejarah master cabang.


0
2017-11-03 15:49



Penjawab lainnya tampaknya peduli dengan mencegah hal ini terjadi di tempat pertama. Jika penggabungan yang diteruskan dengan cepat telah terjadi dan didorong, berikut ini solusinya:

  1. git checkout -b my-undo-branch
  2. git reflog show master - temukan commit terakhir sebelum penggabungan
  3. git reset --keep SHA - menggunakan SHA dari langkah sebelumnya

Pada titik ini, verifikasi bahwa cabang ini dalam keadaan yang Anda inginkan master untuk menjadi. Sekarang hanya masalah mengambil diff antara dua cabang dan berkomitmen untuk menguasai:

  1. git checkout master
  2. git diff master my-undo-branch --no-prefix > patchfile
  3. patch -p0 < patchfile

Kemudian, akhirnya, hapus patchfile, git add semua perubahan, dan git commit mereka.


15
2018-06-07 20:16



Anda bisa bergabung dengan --no-ff untuk mencegah gabungan fast-forward, yang adalah bagaimana Anda "mendapat empat komit baru ditambahkan ke master". Ketika cabang-cabangnya tidak benar-benar menyimpang, Git melakukan penggabungan cepat dan hanya menabrak cabang ref sekitar. Mencegah perpaduan cepat-maju akan membantu Anda mempertahankan riwayat cabang Anda sedikit lebih utuh melalui gabungan komitmen yang jelas, meskipun Anda tidak akan dapat memberi tahu nama dari cabang yang membuat dibuat.

Kalau tidak, tidak ada jalan untuk memeriksa reflog. Git tidak menyimpan informasi cabang di luar 'tip' saat ini dari setiap cabang. Tidak ada hubungan antara komit dan cabang yang diperiksa ketika komit itu dibuat.


0
2017-11-03 15:48



Membatalkan penggabungan secara umum dapat menjadi bisnis yang rumit. Lihat http://progit.org/2010/03/02/undoing-merges.html atau ini pertanyaan SO lainnya untuk latar belakang.

Apa yang mungkin Anda cari adalah:

git merge --no-ff

yang akan memberi tahu Git bahwa ia harus membuat gabungan commit bahkan jika tidak memiliki untuk, seperti dalam kasus ini.


0
2017-11-03 15:49



Saya akan meninjau kembali strategi percabangan Anda dan memperkenalkan cabang "sekali pakai". Artinya, cabang-cabang yang dapat digunakan oleh server CI Anda atau hanya Anda untuk melihat apakah hal-hal bekerja. Anda tidak perlu takut membuangnya. Anda dapat menandai cabang tersebut sebelum dihapus jika Anda ingin mempertahankan apa yang dicoba.

Lebih lanjut tentang ini di sini:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR


0
2017-11-03 18:04