Bagaimana saya bisa menyalin konten cabang ke cabang lokal baru?

270

Saya telah bekerja di cabang lokal dan juga mendorong perubahan ke jarak jauh. Saya ingin mengembalikan perubahan pada cabang itu dan melakukan sesuatu yang lain di atasnya, tetapi saya tidak ingin kehilangan pekerjaan sepenuhnya. Saya sedang memikirkan sesuatu seperti membuat cabang baru secara lokal dan menyalin cabang lama di sana, maka saya dapat mengembalikan perubahan dan terus bekerja pada cabang lama. Apakah ada cara yang lebih baik? Atau bagaimana saya melakukan ini?

serengeti12
sumber
10
4 tahun kemudian, dengan Git 2.15 (Q4 2017), Anda akan memilikinya git branch -c A B. Lihat jawaban saya di bawah ini
VonC

Jawaban:

445
git checkout old_branch
git branch new_branch

Ini akan memberi Anda cabang baru "new_branch" dengan status yang sama dengan "old_branch".

Perintah ini dapat digabungkan dengan yang berikut ini:

git checkout -b new_branch old_branch
Daniel Hilgarth
sumber
134
Atau bahkan lebih pendek git checkout -b new_branch(saat Anda sudah aktif old_branch).
Koraktor
4
Ini hanya membuat cabang baru tetapi tidak dapat menyalin konten dari satu cabang ke cabang lain. Ketika saya mencoba perintah ini hanya menunjukkan "Cabang bernama **** sudah ada".
anoop
7
Saya pikir jika seseorang membuat cabang baru seperti ini tidak langsung memiliki salinan cabang lama tetapi hanya pointer baru di kepala cabang lama. Tetapi ketika Anda sekarang melakukan sesuatu seperti rebasing cabang baru, Anda akan melihat bahwa cabang lama masih dalam kondisi aslinya sementara cabang baru dimodifikasi. Jadi saya pikir itulah yang diinginkan OP.
uli_1973
1
git checkout old_branch dan daripada git branch new_branch .... Lebih baik menggunakan perintah di atas pada produksi, seperti perintah di bawah ini akan membuat cabang baru dan membawa Anda ke cabang baru (ubah cabang sebagai cabang baru) .... git checkout -b new_branch old_branch
Kiran
Untuk menimpa cabang, lihat stackoverflow.com/questions/26961371/...
MCCCS
55
git branch copyOfMyBranch MyBranch

Ini menghindari tindakan berpotensi memakan waktu dan tidak perlu memeriksa cabang. Ingatlah bahwa checkout memodifikasi "pohon kerja", yang bisa memakan waktu lama jika besar atau berisi file besar (misalnya foto atau video).

Lyle Z
sumber
1
Tentu saja, jika Anda memiliki file biner di git, terutama yang berukuran besar, ada baiknya menganalisis strategi Anda untuk file-file tersebut. Biasanya, ada kasus yang tidak biasa dan memiliki file biner di git akan sangat diterima.
Pendeta
52

Dengan Git 2.15 (Q4 2017), " git branch" belajar " -c/-C" untuk membuat cabang baru dengan menyalin yang sudah ada.

Lihat komit c8b2cec (18 Jun 2017) oleh Ævar Arnfjörð Bjarmason ( avar) .
Lihat komit 52d59cc , komit 5463caa (18 Jun 2017) oleh Sahil Dua ( sahildua2305) .
(Digabung oleh Junio ​​C Hamano - gitster- di komit 3b48045 , 03 Okt 2017)

branch: tambahkan opsi --copy( -c) untuk digunakan bersama --move( -m)

Tambahkan kemampuan ke --copycabang dan reflog serta konfigurasinya, ini menggunakan mesin dasar yang sama dengan opsi --move( -m) kecuali reflog dan konfigurasi disalin alih-alih dipindahkan.

Ini berguna untuk misalnya menyalin cabang topik ke versi baru, misalnya workuntuk work-2setelah mengirimkan worktopik ke daftar, sambil mempertahankan semua info pelacakan dan konfigurasi lain yang berjalan dengan cabang, dan tidak seperti --movemenjaga cabang lain yang sudah dikirimkan untuk sekitar referensi.

Catatan: saat menyalin cabang, Anda tetap di cabang saat ini.
Seperti yang dijelaskan Junio ​​C Hamano:

Saat membuat cabang baru Bdengan menyalin cabang Ayang kebetulan menjadi cabang saat ini, itu juga memperbarui HEADuntuk menunjuk ke cabang baru.
Mungkin dibuat seperti ini karena " git branch -c A B" mendukung implementasi pada " git branch -m A B",

Ini tidak sesuai dengan harapan yang biasa.
Jika saya duduk di kursi biru, dan seseorang datang dan mengecatnya menjadi merah, saya akan menerima akhirnya duduk di kursi yang sekarang merah (saya juga OK untuk berdiri, sebagai gantinya, karena tidak ada lagi kursi biru favorit saya ).

Tetapi jika seseorang membuat kursi merah baru, memodelkannya setelah kursi biru tempat saya duduk, saya tidak berharap untuk di-boot dari kursi biru dan akhirnya duduk di kursi merah yang baru.

VONC
sumber