Lebih
git: cabang-cabang berbeda; bagaimana melanjutkannya?
Pohon lokal saya telah menyimpang dari master:
$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 7 and 3 different commit(s) each, respectively.
#
nothing to commit (working directory clean)
Saya mencoba git pull --rebase dan gagal:
$ git pull --rebase
First, rewinding head to replay your work on top of it...
Applying: * ...
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging ChangeLog
CONFLICT (content): Merge conflict in ChangeLog
Failed to merge in the changes.
Patch failed at 0001 * ...
Jadi saya membalikkan dengan git rebase --abort dan saya sekarang berada di titik 1.
Apa yang saya inginkan adalah:
- "Export" 7 patch saya ke dalam file diff yang dapat dibaca oleh manusia (a la hg export).
- Jadikan pohon saya salinan karbon dari pohon asal/master (ala hg strip).
- Terapkan kembali 7 patch saya satu per satu dengan tangan (a la hg import).
Saya mengerti bahwa git rebase --continue melakukan hal ini. Saya sudah melakukannya dan berhasil (setelah beberapa kali merge manual dan git add). Namun, saya ingin dapat melakukannya secara manual, jadi saya bertanya-tanya apa perintah git yang sesuai dengan perintah hg di atas.
Terima kasih.
PS. Tolong jangan katakan pada saya bahwa menggunakan file ChangeLog dengan git adalah hal yang bodoh. Bahkan jika itu benar, itu bukan terserah saya.
31
3
Tentu saja ada beberapa cara yang dapat Anda lakukan secara manual. Anda masih akan mengalami konflik yang sama karena git pada dasarnya melakukan ini untuk Anda di bawah tenda. Tetapi jika Anda ingin melakukan ini secara manual, berikut adalah beberapa cara.
Pertama, ekspor komit kamu sebagai serangkaian patch. Cara termudah untuk melakukan ini adalah menggunakan
git format-patch
:akan menghasilkan 7 berkas patch - satu untuk setiap komit Anda. (Perhatikan bahwa "@{upstream}" adalah literal - ini adalah fitur git yang tidak begitu dikenal). Ini lebih baik daripada menangkap output dari
git diff
karena semua informasi komit (penulis, tanggal, pesan, dll.) dipertahankan.Kemudian anda bisa mengatur ulang repositori anda agar sesuai dengan upstream:
Kemudian anda dapat menerapkan kembali patch anda menggunakan
git am
- baik satu per satu atau sekaligus.Pilihan kedua adalah membuat cabang cadangan dengan pekerjaan Anda di dalamnya:
Kemudian atur ulang cabang Anda ke hulu:
Kemudian pilih komit-komit tersebut:
Kemudian buang cabang bekas:
Sudahkah anda mencoba
git merge origin/master
?Perubahan jarak jauh anda akan disimpan di cabang
origin/master
. (Atau akan, jika anda melakukangit fetch
.) Gabungkan saja kedua cabang -master
danorigin/master
- seperti dua cabang lainnya dan selesaikan konflik (jika ada).Ini dapat membantumu jika kamu perlu tahu cara menyelesaikan konflik git.
https://stackoverflow.com/questions/161813/how-do-i-fix-merge-conflicts-in-git
Git mengatakan bahwa ia mencoba melakukan apa yang Anda inginkan (menerapkan kembali patch Anda di atas perubahan terbaru dari origin/master) tetapi gagal dengan konflik. Tepat setelah konflik
git pull --rebase
, buka sebuah editor dengan berkas-berkas yang berkonflik (git status
akan mencantumkan berkas-berkas ini di bawah "both changed") dan selesaikan konfliknya, yang ditandai dengan diff lingua standar. Ketika anda selesai menyelesaikan konflik, lemparkangit rebase --continue
(ataugit rebase --skip
jika resolusi anda tidak menimbulkan perubahan).Baca tentang hal ini di Dokumentasi Stackexchange untuk 'Menyelesaikan konflik penggabungan setelah rebase Git'.