Saya memiliki cabang master
yang melacak cabang jarak jauh origin/master
.
Saya ingin mengubah nama mereka menjadi master-old
lokal dan pada remote. Apakah ini mungkin?
Untuk pengguna lain yang dilacak origin/master
(dan yang selalu memperbarui master
cabang lokal mereka melalui git pull
), apa yang akan terjadi setelah saya mengganti nama cabang jarak jauh?
Akankah mereka git pull
masih berfungsi atau akankah mereka melakukan kesalahan yang tidak dapat ditemukan origin/master
lagi?
Kemudian, lebih jauh, saya ingin membuat master
cabang baru (baik lokal maupun jarak jauh). Sekali lagi, setelah saya melakukan ini, apa yang akan terjadi sekarang jika pengguna lain melakukannya git pull
?
Saya kira semua ini akan menghasilkan banyak masalah. Apakah ada cara bersih untuk mendapatkan yang saya inginkan? Atau haruskah saya pergi master
begitu saja dan membuat cabang baru master-new
dan bekerja lebih lanjut di sana?
sumber
git push -f
memengaruhi kemampuanpull
dari cabang pelacakan jarak jauh.master-old
yang menunjuk ke komit yang sama denganmaster
cabang sebelumnya . Kemudian Anda bisa menimpamaster
cabang dengan perubahan baru Anda dengan melakukanmerge
denganours
strategi. Melakukan penggabungan berfungsi saat jarak jauh tidak memungkinkan perubahan yang tidak cepat. Itu juga berarti pengguna lain tidak akan memaksa pembaruan.master
hanya istimewa selama itu satu-satunya cabang yang ada. Segera setelah Anda memiliki lebih dari satu, semua cabang memiliki posisi yang sama.Jawaban:
Hal yang paling dekat dengan penggantian nama adalah menghapus dan kemudian menciptakan kembali pada remote. Sebagai contoh:
Namun ini memiliki banyak peringatan. Pertama, tidak ada checkout yang ada yang tahu tentang rename - git tidak mencoba melacak renungan cabang. Jika yang baru
master
belum ada, git pull akan error keluar. Jika yang barumaster
telah dibuat. tarikan akan mencoba untuk menggabungkanmaster
danmaster-old
. Jadi itu umumnya ide yang buruk kecuali jika Anda memiliki kerjasama dari semua orang yang telah memeriksa repositori sebelumnya.Catatan: Versi git yang lebih baru tidak memungkinkan Anda untuk menghapus cabang master dari jarak jauh secara default. Anda dapat menimpanya dengan mengatur nilai
receive.denyDeleteCurrent
konfigurasi kewarn
atauignore
pada repositori jarak jauh . Jika tidak, jika Anda siap untuk membuat master baru segera, lewatigit push remote :master
langkah, dan lolos--force
kegit push remote master
langkah. Perhatikan bahwa jika Anda tidak dapat mengubah konfigurasi jarak jauh, Anda tidak akan dapat menghapus cabang master sepenuhnya!Peringatan ini hanya berlaku untuk cabang saat ini (biasanya
master
cabang); cabang lain dapat dihapus dan diciptakan kembali seperti di atas.sumber
new-branch-name
danold-branch-name
bukannyamaster
/master-old
, jadi ini adalah masalah umum.Dengan asumsi Anda sedang aktif
master
:master-old
cabang diorigin
repositori, berdasarkan darimaster
komit di repositori lokal.origin/master-old
(yang secara otomatis akan diatur dengan benar sebagai cabang pelacakan).master
ke komit mana pun yang Anda inginkan.master
diorigin
repositori untuk mencerminkan lokal baru Andamaster
.(Jika Anda melakukannya dengan cara lain, Anda memerlukan setidaknya satu langkah lagi untuk memastikan bahwa
master-old
sudah diatur dengan benar untuk melacakorigin/master-old
. Tidak ada solusi lain yang diposting pada saat penulisan ini termasuk itu.)sumber
master
atau cabang lain. Pertanyaan itu berjudul buruk, ia menanyakan tentang tugas yang lebih kompleks dari sekadar mengganti nama cabang.master
maka mereka bisa sajagit fetch && git reset --hard origin/master
memaksa lokal merekamaster
sama dengan yang aktiforigin
. Saya telah mendokumentasikan ini, serta kasus yang lebih kompleks di mana Anda memiliki komit lokal di atasmaster
yang ingin Anda pertahankan, di stackoverflow.com/q/4084868Dengan Git v1.7, saya pikir ini telah sedikit berubah. Memperbarui referensi pelacakan cabang lokal Anda ke kendali jarak jauh sekarang sangat mudah.
sumber
--set-upstream
adalah sebagai berikut: Setelah cabang Anda diganti namanya secara lokal dan dihapus pada asalnya, cukup lakukan:git push -u --all
new_branch
dan kemudian akhirnya menghapus remotemaster
dengan baris ke-2.git push origin --delete old_branch
sedikit lebih mudah dibaca.Anda mungkin harus beralih secara manual
new-branch-name
sebelum menghapusold-branch-name
sumber
git branch -d old-branch-name
untuk menghapus cabang lama lokal.git push remote-name new-branch-name :old-branch-name
.Ada banyak cara untuk mengubah nama cabang, tetapi saya akan fokus pada masalah yang lebih besar: "bagaimana memungkinkan klien untuk mempercepat dan tidak harus mengacaukan cabang mereka secara lokal" .
Pertama gambar cepat:
Ini adalah sesuatu yang sebenarnya mudah dilakukan; tapi jangan menyalahgunakannya. Seluruh ide bergantung pada gabungan melakukan; karena mereka memungkinkan fast-forward, dan menghubungkan sejarah cabang dengan yang lain.
mengganti nama cabang:
membuat cabang "master" baru:
membuat komit gabungan untuk memiliki riwayat orang tua-anak:
dan voila.
Ini berfungsi karena membuat
merge
komit memungkinkan penerusan cabang dengan cepat ke revisi baru.menggunakan pesan commit gabungan yang masuk akal:
sumber
git merge -s ours master-old
adalah bagian penting yang dilewatkan oleh jawaban lain. Juga, "mudah dilakukan" tidak berarti "mudah dimengerti, atau mencari tahu" yang tampaknya menjadi masalah dengan banyak git, tetapi saya ngelantur.Saya berasumsi Anda masih bertanya tentang situasi yang sama seperti pada pertanyaan Anda sebelumnya . Yaitu, master-new tidak akan berisi master-old dalam sejarahnya. * Jika Anda memanggil master-new "master", Anda akan secara efektif memiliki sejarah yang ditulis ulang. Tidak masalah bagaimana Anda masuk ke kondisi di mana master bukan merupakan keturunan dari posisi master sebelumnya, hanya saja itu berada dalam kondisi itu.
Pengguna lain yang mencoba menarik sementara master tidak ada hanya akan memiliki tarikan gagal (tidak ada referensi pada jarak jauh), dan begitu ada lagi di tempat baru, tarikan mereka harus mencoba untuk menggabungkan master mereka dengan master jarak jauh baru, sama seperti jika Anda menggabungkan master-lama dan master-baru di repositori Anda. Mengingat apa yang Anda coba lakukan di sini, penggabungan tersebut akan memiliki konflik. (Jika mereka diselesaikan, dan hasilnya didorong kembali ke repositori, Anda akan berada dalam keadaan yang lebih buruk - kedua versi sejarah ada di sana.)
Untuk menjawab pertanyaan Anda secara sederhana: Anda harus menerima bahwa kadang-kadang akan ada kesalahan dalam sejarah Anda. Ini tidak apa-apa Itu terjadi pada semua orang. Ada komit yang dikembalikan dalam repositori git.git. Yang penting adalah bahwa begitu kita menerbitkan sejarah, itu adalah sesuatu yang dapat dipercaya semua orang.
* Jika ya, ini akan sama dengan mendorong beberapa perubahan ke master, dan kemudian membuat cabang baru di tempat sebelumnya. Tidak masalah.
sumber
The jawaban yang dipilih gagal ketika saya mencoba. Ini melempar kesalahan:
refusing to delete the current branch: refs/heads/master
. Saya kira saya akan memposting apa yang berfungsi untuk saya:Caranya adalah dengan checkout ke placeholder tepat sebelum mendorongnya ke repositori jarak jauh. Sisanya cukup jelas, menghapus cabang master dan mendorongnya ke repositori jarak jauh seharusnya berfungsi sekarang. Dikutip dari sini .
sumber
Baik. 2 sen saya. Bagaimana dengan masuk di server, pergi ke direktori git dan mengganti nama cabang di repositori kosong. Ini tidak memiliki semua masalah yang terkait dengan mengunggah kembali cabang yang sama. Sebenarnya, 'klien' akan secara otomatis mengenali nama yang dimodifikasi dan mengubah referensi jarak jauh mereka. Setelah itu (atau sebelumnya) Anda juga dapat memodifikasi nama lokal cabang.
sumber
Bagaimana dengan:
sumber
Ini adalah cara paling sederhana dan paling 'mudah dibaca' yang saya tahu:
Cabang lokal 'Pindahkan' menggunakan -m
Dorong cabang 'pindah' ke jarak jauh, atur 'hulu' menggunakan -u
(pengaturan 'hulu' pada dasarnya 'menghubungkan' cabang lokal Anda ke jarak jauh, sehingga hal-hal seperti mengambil, menarik, dan mendorong akan bekerja)
Hapus cabang lama dari jarak jauh
(cabang lokal Anda sudah tidak ada, karena Anda 'memindahkannya' pada langkah pertama)
sumber
OKE , mengganti nama cabang baik secara lokal dan pada remote cukup mudah! ...
Jika Anda berada di cabang, Anda dapat dengan mudah melakukan:
git branch -m <branch>
atau jika tidak, Anda perlu melakukan:
git branch -m <your_old_branch> <your_new_branch>
Kemudian, dorong penghapusan ke kendali jarak jauh seperti ini:
git push origin <your_old_branch>
Sekarang Anda selesai, jika Anda mendapatkan kesalahan hulu saat Anda mencoba mendorong, cukup lakukan:
git push --set-upstream origin <your_new_branch>
Saya juga membuat gambar di bawah ini untuk menunjukkan langkah-langkah di baris perintah nyata, cukup ikuti langkah-langkahnya dan Anda akan menjadi baik:
sumber
Anda dapat melakukan hal berikut:
Tapi memaksakan dorongan adalah ide yang buruk jika orang lain berbagi repositori ini. Force push akan menyebabkan riwayat revisi mereka bertentangan dengan yang baru.
sumber
Berikut ini dapat disimpan ke skrip shell untuk melakukan pekerjaan:
Sebagai contoh:
Harap dicatat bahwa di sini nama jarak jauh default "asal" adalah kode-keras, Anda dapat memperluas skrip untuk membuatnya jika dapat dikonfigurasi!
Maka skrip ini dapat digunakan dengan alias bash, alias git atau, misalnya, tindakan kustom sumber daya.
sumber
Saya percaya kuncinya adalah kesadaran bahwa Anda melakukan perubahan nama ganda :
master
menjadimaster-old
dan jugamaster-new
untukmaster
.Dari semua jawaban lain saya telah mensintesiskan ini:
tempat pertama kita harus mendefinisikan
doublerename
fungsi Bash:Ini mirip dengan perubahan-sejarah
git rebase
di mana konten cabang sangat berbeda, tetapi berbeda bahwa klien masih dapat maju dengan aman dengan amangit pull master
.sumber
sumber