Pertanyaan Ubah nama cabang utama untuk repositori Git lokal dan remote


Saya memiliki cabang master yang melacak cabang jarak jauh origin/master.

Saya ingin mengganti nama mereka menjadi master-old baik secara lokal maupun di kendali jarak jauh. Apakah itu mungkin? Untuk pengguna lain yang dilacak origin/master (dan yang selalu memperbarui lokal mereka master cabang melalui git pull), apa yang akan terjadi setelah saya mengganti nama cabang jarak jauh? Apakah mereka git pull masih berfungsi atau akan melemparkan kesalahan yang tidak dapat ditemukan origin/master lagi?

Kemudian, lebih lanjut, saya ingin membuat yang baru master cabang (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 yang bersih untuk mendapatkan apa yang saya inginkan? Atau saya harus pergi begitu saja master sebagaimana adanya dan membuat cabang baru master-new dan hanya bekerja di sana lebih jauh?


746
2017-10-06 16:51


asal


Jawaban:


Hal terdekat untuk mengganti nama adalah menghapus dan kemudian membuat ulang pada remote. Sebagai contoh:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

Namun ini memiliki banyak peringatan. Pertama, tidak ada checkout yang akan tahu tentang penggantian nama - git tidak tidak mencoba melacak cabang mengganti nama. Jika baru master belum ada, git pull akan error. Jika baru master telah dibuat. tarikan akan mencoba untuk bergabung master dan master-old. Jadi itu umumnya ide yang buruk kecuali Anda memiliki kerja sama dari semua orang yang telah memeriksa repositori sebelumnya.

Catatan: Versi git yang lebih baru tidak akan memungkinkan Anda menghapus cabang master dari jarak jauh secara default. Anda dapat mengesampingkan ini dengan mengatur receive.denyDeleteCurrent nilai konfigurasi ke warn atau ignore pada terpencil gudang. Jika tidak, jika Anda siap untuk membuat master baru segera, lewati git push remote :master melangkah, dan berlalu --force ke git push remote master langkah. Perhatikan bahwa jika Anda tidak dapat mengubah konfigurasi remote, Anda tidak akan dapat sepenuhnya menghapus cabang master!

Peringatan ini hanya berlaku untuk cabang saat ini (biasanya master cabang); cabang lain dapat dihapus dan dibuat kembali seperti di atas.


573
2017-10-06 17:35



Dengan asumsi Anda saat ini master:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. Pertama buat a master-old cabang di origin repositori, berdasarkan dari master lakukan di repositori lokal.
  2. Buat cabang lokal baru untuk ini baru origin/master-old cabang (yang secara otomatis akan diatur dengan benar sebagai cabang pelacakan).
  3. Sekarang arahkan ke lokal Anda master ke mana pun Anda ingin mengarahkannya.
  4. Akhirnya, ganti kekuatan master dalam origin repositori untuk mencerminkan lokal baru Anda master.

(Jika Anda melakukannya dengan cara lain, Anda memerlukan setidaknya satu langkah lagi untuk memastikannya master-old diatur dengan benar untuk dilacak origin/master-old. Tidak ada solusi lain yang diposting pada saat penulisan ini termasuk itu.)


240
2017-09-24 20:21



Dengan Git v1.7, saya pikir ini telah berubah sedikit. Memperbarui referensi pelacakan cabang lokal Anda ke remote baru sekarang sangat mudah.

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

146
2018-04-25 17:22



git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

Anda mungkin harus beralih secara manual new-branch-name sebelum menghapus old-branch-name


35
2018-02-10 02:29



Ada banyak cara untuk mengganti nama cabang, tetapi saya akan fokus pada masalah yang lebih besar: "Bagaimana cara mengizinkan klien untuk maju cepat dan tidak perlu mengacaukan cabang mereka secara lokal".

Pertama gambar cepat: renaming master branch and allowing clients to fast-forward

Ini adalah sesuatu yang sebenarnya mudah dilakukan; tapi jangan menyalahgunakannya. Seluruh ide bergantung pada penggabungan komitmen; karena memungkinkan percepatan, dan menghubungkan riwayat cabang dengan yang lain.

mengganti nama cabang:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

membuat cabang "master" baru:

# create master from new starting point
git branch master <new-master-start-point>

membuat komitmen gabungan untuk memiliki riwayat orang tua-anak:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

dan voila.

git push origin master

Ini berfungsi karena membuat a merge komit memungkinkan fast-forwarding cabang ke revisi baru.

menggunakan pesan commit gabungan yang masuk akal:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

25
2018-03-18 00:48



Saya berasumsi Anda masih bertanya tentang situasi yang sama seperti pada Anda pertanyaan sebelumnya. Artinya, master-baru tidak akan berisi master-old dalam sejarahnya. * Jika Anda memanggil master "master" yang baru, Anda akan secara efektif memiliki sejarah yang ditulis ulang. Tidak masalah bagaimana Anda masuk ke dalam keadaan di mana tuan bukanlah keturunan dari posisi tuan sebelumnya, hanya bahwa itu dalam keadaan itu.

Pengguna lain mencoba untuk menarik sementara master tidak ada hanya akan memiliki kegagalan menarik mereka (tidak ada seperti pada remote), dan setelah itu ada lagi di tempat baru, tarikan mereka harus berusaha untuk menggabungkan tuan mereka dengan master jarak jauh yang baru, sama seperti jika Anda menggabungkan master-old dan master-new dalam repositori Anda. Mengingat apa yang Anda coba lakukan di sini, penggabungan akan memiliki konflik. (Jika mereka terselesaikan, dan hasilnya didorong kembali ke repositori, Anda akan berada dalam keadaan yang lebih buruk - kedua versi sejarah di sana.)

Untuk menjawab pertanyaan Anda sederhananya: Anda harus menerima bahwa kadang-kadang akan ada kesalahan dalam sejarah Anda. Ini tidak masalah. Itu terjadi pada semua orang. Ada komit yang dikembalikan di repositori git.git. Yang penting adalah setelah kami menerbitkan sejarah, itu adalah sesuatu yang dapat dipercaya semua orang.

* Jika itu terjadi, ini akan setara dengan mendorong beberapa perubahan ke master, dan kemudian membuat cabang baru di tempat dulu. Tidak masalah.


11
2017-10-06 17:12



Itu jawaban yang dipilih gagal ketika saya mencobanya. Ini melempar kesalahan: refusing to delete the current branch: refs/heads/master. Saya kira saya akan memposting apa yang berhasil untuk saya:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

Triknya adalah checkout ke placeholder tepat sebelum mendorongnya ke repositori jarak jauh. Sisanya jelas, menghapus cabang master dan mendorongnya ke repositori jauh harus berfungsi sekarang. Disarikan dari sini.


8
2017-12-25 12:28



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 reuploading cabang yang sama. Sebenarnya, 'klien' secara otomatis akan mengenali nama yang diubah dan mengubah referensi jarak jauh mereka. Setelah itu (atau sebelumnya) Anda juga dapat memodifikasi nama lokal cabang.


3
2017-12-24 04:50



Bagaimana dengan:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name

1
2017-08-17 08:21



Ini adalah cara paling sederhana dan paling 'bisa dibaca' yang saya tahu:

Memindahkan cabang lokal menggunakan -m

git branch -m my_old_branch_name my_new_branch_name

Dorong 'pindah' ​​cabang ke remote, atur 'hulu' menggunakan -u

git push origin -u my_new_branch_name

(pengaturan 'hulu' pada dasarnya 'menghubungkan' cabang lokal Anda ke remote, sehingga hal-hal seperti mengambil, menarik, dan mendorong akan berfungsi)

Hapus cabang lama dari remote

git push origin -D <old_name>

(cabang lokal Anda sudah pergi, karena Anda 'memindahkannya' di langkah 1)


1
2017-12-08 01:15