Menimpa cabang lokal saya dengan cabang jarak jauh

153

Saya sudah sepenuhnya fubar cabang lokal saya, dan ingin memulai dari awal. Versi di server sudah benar.

Saya tidak ingin memulai lagi, saya ingin menggunakan riwayat lokal saya untuk memperbaiki masalah besar saya. (Saya bisa jika saya harus.)

git fetch branchname, dan git pull branchnametidak bekerja. Pesan yang saya dapatkan adalah " up to date " namun, versi lokal saya tidak cocok dengan server.

git pull origin/branchnamememberi saya kesalahan " tidak ditemukan ".

Sara Chipps
sumber

Jawaban:

248

pertama, buat cabang baru di posisi saat ini (jika Anda perlu riwayat 'kacau'):

git branch fubar-pin

perbarui daftar cabang jarak jauh Anda dan sinkronkan commit baru:

git fetch --all

kemudian, setel ulang cabang Anda ke titik di mana titik asal / cabang menunjuk ke:

git reset --hard origin/branch

hati-hati , ini akan menghapus semua perubahan dari pohon kerja Anda !

rajutan
sumber
2
+1 tetapi Anda mungkin ingin menambahkan pengingat untuk dilakukan git fetch originsebelum reset
Mark Longair
Saya melakukan ini dengan satu perubahan kecil dan itu tidak berhasil: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (beberapa hal lain), git reset --barang asli / cabang. Hasil akhirnya adalah bahwa saya masih di komit lama. Jadi, pendekatan ini mungkin berhasil dalam beberapa kasus, tapi saya pikir itu tidak berhasil sama sekali.
Greggles
@greggles: Ada kesalahan? Setelah perintah terakhir, KEPALA harus menunjuk ke asal / cabang.
Knittl
1
@ Gavin: tidak, ini dalam keadaan apa pun tidak akan memengaruhi cabang lain selain origin/branch. Tidak pernah.
knittl
1
@greggles Saya tahu ini sangat terlambat tetapi untuk orang lain yang bertanya-tanya mengapa itu bisa terjadi, pendekatan ini hanya akan berfungsi jika Anda memiliki cabang yang diperiksa. Itu tidak bekerja untuk Anda karena Anda berada dalam kondisi HEAD yang terlepas , (HEAD menunjuk komit, bukan cabang) dan perintah ini hanya berfungsi jika HEAD menunjuk ke cabang. Ketika Anda melakukannya git resetsaat HEAD menunjuk cabang, cabang itu akan mengikuti.
Michael Dorst
60

Apa yang saya lakukan ketika saya mengacaukan cabang lokal saya adalah saya baru saja mengganti nama cabang saya yang rusak, dan periksa / cabang lagi cabang hulu:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Kemudian jika Anda yakin tidak menginginkan apa pun dari cabang lama Anda, hapus:

git branch -D branch-old

Tetapi biasanya saya meninggalkan cabang lama di sekitar setempat, kalau-kalau ada sesuatu di sana.

Casey Marshall
sumber
4
Ini sepertinya jawaban terbaik. Ini membantu membuat salinan cadangan untuk berjaga-jaga dan tampaknya sangat mungkin menghasilkan cabang lokal menjadi salinan persis dari yang jauh.
Greggles
Jawaban yang bagus, bermanfaat bagi saya. Satu T: Dokumentasi git-checkout resmi tampaknya mengatakan bahwa perintah ke-3 Anda seharusnya: git checkout -b <branch> --track <remote>/<branch>Apakah Anda bekerja dengan baik, tanpa itu --track?
Starman
1
Saya pikir config var branch.autoSetupMerge(yang saya pikir default ke true) membuat --trackimplisit. Dan, ya, di semua pengaturan git saya, saya tidak perlu secara eksplisit --tracksaat melakukan checkout -b, tetapi YMMV.
Casey Marshall
5

Cabang lokal Anda kemungkinan memiliki modifikasi yang ingin Anda buang. Untuk melakukan ini, Anda harus menggunakan git resetuntuk mengatur ulang kepala cabang ke tempat terakhir yang berbeda dari cabang repo hulu. Gunakan git branch -vuntuk menemukan id sha1 dari cabang hulu, dan setel ulang cabang Anda menggunakan cabang itu git reset SHA1ID. Maka Anda harus dapat melakukan git checkoutuntuk membuang perubahan yang tersisa di direktori Anda.

Catatan: selalu lakukan ini pada repo yang didukung. Dengan begitu Anda dapat meyakinkan diri Anda bahwa itu bekerja dengan baik. Atau jika tidak, Anda memiliki cadangan untuk dikembalikan.

Wes Hardaker
sumber
Ini terasa seperti mungkin akan berhasil, tetapi mengingat kesederhanaan dan keandalan pendekatan "buat salinan karya Anda di tempat lain, buat salinan baru cabang jauh" Saya gagal melihat bagaimana ini lebih baik.
Greggles
2
git reset --hard

Ini untuk mengembalikan semua perubahan lokal Anda ke kepala asal

Karthikeyan Varadarajan
sumber