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:

  1. "Export" 7 patch saya ke dalam file diff yang dapat dibaca oleh manusia (a la hg export).
  2. Jadikan pohon saya salinan karbon dari pohon asal/master (ala hg strip).
  3. 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.

Larutan

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:

git format-patch -M @{upstream}

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:

git reset --hard @{upstream}

Kemudian anda dapat menerapkan kembali patch anda menggunakan git am - baik satu per satu atau sekaligus.

git am 0001-blah-blah.patch
git am 0002-blah-blah.patch
...

Pilihan kedua adalah membuat cabang cadangan dengan pekerjaan Anda di dalamnya:

git branch scrap

Kemudian atur ulang cabang Anda ke hulu:

git reset --hard @{upstream}

Kemudian pilih komit-komit tersebut:

git cherry-pick scrap~6
git cherry-pick scrap~5
git cherry-pick scrap~4
...

Kemudian buang cabang bekas:

git branch -D scrap
Komentar (2)

Sudahkah anda mencoba git merge origin/master?

Perubahan jarak jauh anda akan disimpan di cabang origin/master. (Atau akan, jika anda melakukan git fetch.) Gabungkan saja kedua cabang - master dan origin/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

Komentar (1)

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, lemparkan git rebase --continue (atau git rebase --skip jika resolusi anda tidak menimbulkan perubahan).

Baca tentang hal ini di Dokumentasi Stackexchange untuk 'Menyelesaikan konflik penggabungan setelah rebase Git'.

Komentar (4)