Jadi bayangkan hal berikut terjadi (dan kita semua menggunakan SourceTree):
- Kita semua bekerja asal / berkembang.
- Saya pergi berlibur selama seminggu.
- Rekan kerja saya telah bekerja secara lokal selama beberapa hari terakhir tanpa menggabungkan asal / mengembangkan kembali ke cabang pengembangan lokalnya.
- Dia mencoba melakukan dorongan, diberitahu bahwa dia harus bergabung terlebih dahulu, dan kemudian melakukan tarikan.
- Dia mendapat konflik, menghentikan komit otomatis setelah penggabungan dari proses.
- Dengan asumsi bahwa Git seperti SVN, rekan kerja saya membuang file "baru" dalam copy pekerjaannya dan kemudian melakukan penggabungan - menghapus file "baru" dari kepala asal / kembangkan.
- Pekerjaan dev selama berminggu-minggu berlangsung di atas revisi itu.
- Saya kembali dari liburan dan mengetahui bahwa beberapa hari pekerjaan saya hilang.
Kami semua sangat baru di Git (ini adalah proyek pertama kami yang menggunakannya), tetapi yang saya lakukan untuk memperbaikinya adalah:
- Ganti nama "kembangkan" menjadi "develop_old".
- Gabungkan develop_old ke cabang baru "develop_new".
- Setel ulang cabang develop_new ke komit terakhir sebelum penggabungan buruk.
- Cherry memilih setiap komitmen sejak saat itu, satu per satu, menyelesaikan konflik dengan tangan.
- Dorong develop_old dan develop_new hingga ke titik asal.
Pada titik ini, develop_new adalah, saya berharap, salinan "baik" dari semua perubahan kami dengan minggu-minggu berikutnya kerja layak diterapkan kembali. Saya juga mengasumsikan bahwa "terbalik komit" akan melakukan hal-hal aneh di merge, terutama karena beberapa minggu ke depan senilai bekerja didasarkan pada itu - dan karena gabungan yang berisi banyak hal yang kita lakukan ingin bersama dengan barang-barang yang kita don' t.
Saya berharap ini tidak pernah terjadi lagi, tetapi jika itu terjadi lagi, saya ingin tahu cara yang lebih mudah / lebih baik untuk memperbaiki keadaan. Apakah ada cara yang lebih baik untuk membatalkan penggabungan "buruk", ketika banyak pekerjaan telah dilakukan di repo berdasarkan penggabungan itu?
git log
format favorit Anda dengan anotasi yang sesuai tentang apa yang terjadi di berbagai commit? (Saya akan menghapus / membubuhi keterangangit log --graph --pretty=oneline --abbrev-commit
dan pergi dari sana)Jawaban:
Jika saya mengerti dengan benar, ini adalah situasi Anda:
Setelah beberapa sejarah umum (o), Anda berkomitmen dan mendorong pekerjaan Anda (y). Rekan kerja Anda (c) berhasil di repositori lokalnya dan melakukan penggabungan yang buruk (M). Setelah itu mungkin ada beberapa komitmen tambahan (a) di atas M.
Sekarang grafik Anda terlihat persis seperti sebelum penggabungan buruk:
Lakukan penggabungan yang baik (G):
Yang menghasilkan:
Sekarang transplantasikan komitmen tambahan:
Ini memberikan hasil akhir:
Ketahuilah bahwa ini dapat menyebabkan lebih banyak konflik gabungan. Anda juga baru saja mengubah riwayat, yaitu semua rekan kerja Anda harus mengkloning / reset / rebase ke riwayat baru.
PS: tentu saja Anda harus mengganti
G
,M
danX
dalam perintah Anda dengan id komit yang sesuai.sumber
Ada baiknya Anda berpikir tentang cara memperbaiki repositori, tetapi jika rekan kerja Anda hanya menghapus file baru dan tidak menimpa banyak pembaruan, maka pendekatan yang jauh lebih sederhana adalah dengan hanya mengembalikan file yang telah dihapus.
Saya mungkin akan mulai dengan mencoba hanya mengambil ceri (ke kepala saat ini) komit asli di mana Anda menambahkan kode yang sekarang hilang. Jika karena alasan apa pun itu tidak berhasil, cukup periksa revisi lama dengan file yang Anda tambahkan, dan tambahkan kembali dalam komit baru.
Apa yang Anda gambarkan sebenarnya adalah subset dari anti-pola Git yang terkenal, yang bagi saya seumur hidup saya tidak dapat mengingat nama - tetapi intinya adalah, membuat "pengeditan manual" selama penggabungan Git (yaitu pengeditan) yang tidak benar-benar menyelesaikan konflik penggabungan tetapi membuat beberapa perubahan yang sama sekali tidak terkait) dianggap sebagai praktik yang sangat buruk karena mereka pada dasarnya ditutupi oleh gabungan itu sendiri, dan mudah diabaikan dalam tinjauan kode atau sesi debugging.
Jadi jelaskan kepada rekan kerja Anda bahwa ini adalah epik yang gagal, tetapi pertimbangkan menampar bantuan band sebelum bersiap untuk operasi besar.
sumber