Cara membuat cabang dari komit khusus di cabang berbeda

107

Saya telah membuat beberapa komit di cabang master lalu menggabungkannya ke cabang dev.

Saya ingin membuat cabang dari komit tertentu di cabang dev, yang pertama kali dilakukan di cabang master.

Saya menggunakan perintah:

git checkout dev
git branch  <branch name> <commit id>

Namun, ini membuat cabang dari cabang master, bukan cabang dev yang saya harapkan. ID komit sama di cabang master dan cabang dev. Jadi, bagaimana saya bisa membedakan id komit yang sama di cabang yang berbeda?

PS: Saya membuat contoh di github di sini https://github.com/RolandXu/test_for_branch

Saya menggunakan perintah:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

Apa yang saya harapkan adalah bahwa cabang uji berisi aa.txt bb.txt cc.txt. Namun, cabang pengujian hanya berisi aa.txt dan cc.txt. Kemungkinan besar membuat cabang dari cabang master.

RolandXu
sumber

Jawaban:

154

Jika Anda menggunakan bentuk branchperintah ini (dengan titik awal), tidak masalah di mana Anda HEADberada.

Apa yang kamu lakukan:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • Pertama, Anda mengatur HEADke cabang dev,

  • Kedua, Anda memulai cabang baru saat komit 07aeec98. Tidak ada bb.txt pada komit ini (menurut repo github Anda).

Jika Anda ingin memulai cabang baru di lokasi yang baru saja Anda periksa, Anda dapat menjalankan cabang tanpa titik awal:

git branch test

atau seperti yang telah dijawab oleh orang lain, buat cabang dan checkout di sana dalam satu operasi:

git checkout -b test

Saya pikir Anda mungkin bingung dengan fakta yang 07aeec98merupakan bagian dari cabang dev. Memang benar bahwa komit ini adalah leluhur dari dev, perubahannya diperlukan untuk mencapai komit terbaru di dev. Namun, itu adalah komitmen lain yang diperlukan untuk mencapai yang terbaru dev, dan ini belum tentu ada dalam riwayat 07aeec98.

8480e8ae(di mana Anda menambahkan bb.txt) misalnya tidak ada dalam riwayat 07aeec98. Jika Anda bercabang 07aeec98, Anda tidak akan mendapatkan perubahan yang diperkenalkan oleh 8480e8ae.

Dengan kata lain: jika Anda menggabungkan cabang A dan cabang B menjadi cabang C, lalu membuat cabang baru pada komit A, Anda tidak akan mendapatkan perubahan yang diperkenalkan di B.

Sama di sini, Anda memiliki dua cabang paralel master dan dev, yang Anda gabungkan di dev. Bercabang dari komit master (lebih lama dari gabungan) tidak akan memberi Anda perubahan dev.


Jika Anda ingin mengintegrasikan perubahan baru secara permanen dari master ke dalam cabang fitur Anda, Anda harus menggabungkannya masterdan melanjutkan. Ini akan membuat komit gabungan di cabang fitur Anda.

Jika Anda belum dipublikasikan cabang fitur Anda, Anda juga dapat rebase mereka pada master diperbarui: git rebase master featureA. Bersiaplah untuk menyelesaikan kemungkinan konflik.

Jika Anda menginginkan alur kerja tempat Anda dapat bekerja pada cabang fitur yang bebas dari gabungan komitmen dan masih berintegrasi dengan perubahan yang lebih baru di master, saya merekomendasikan hal berikut ini:

  • mendasarkan setiap cabang fitur baru pada komit master
  • membuat devcabang pada komit master
  • saat Anda perlu melihat bagaimana cabang fitur Anda terintegrasi dengan perubahan baru di master, gabungkan master dan cabang fitur menjadi dev.

Jangan devlangsung berkomitmen , gunakan hanya untuk menggabungkan cabang lain.

Misalnya, jika Anda mengerjakan fitur A dan B:

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

Gabungkan cabang menjadi devcabang untuk memeriksa apakah mereka bekerja dengan baik dengan master baru:

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

Anda dapat terus mengerjakan cabang fitur Anda, dan terus menggabungkan perubahan baru dari cabang master dan fitur menjadi devsecara teratur.

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

Saat tiba waktunya untuk mengintegrasikan fitur baru, gabungkan cabang fitur (bukan dev!) Ke dalam master.

Gauthier
sumber
Terima kasih. Anda menjawab pertanyaan saya. Saya salah dalam memahami mode cabang git. Dan apakah Anda punya saran untuk masalah saya. Saya memiliki cabang master yang memiliki banyak komitmen tepat waktu dari orang lain (sinkronkan dengan paksa). Saya memiliki cabang dev. Saya melakukan pekerjaan pribadi. Saya ingin cabang yang berisi semua komit dari cabang master dan cabang dev, maka saya dapat dengan mudah membuat cabang berdasarkan cabang ini, lalu memulai pekerjaan tertentu.
RolandXu
Saya tidak dapat menjawab dalam komentar, jadi saya memperbarui jawaban saya dengan alur kerja yang disarankan.
Gauthier
Hei - terima kasih atas jawaban yang brilian dan menyeluruh! Hanya penasaran: Pada akhirnya, kenapa harus merge the feature branches (not dev!) into master?
cassi.lup
Tidak ada perkembangan baru yang nyata di devcabang. Anda harus menjaga fitur cabang Anda tetap spesifik. devhanya berisi komit gabungan. Lebih masuk akal untuk menggabungkan semua fitur baru secara langsung master, daripada menggabungkan fitur-fitur tersebut kemudian menggabungkan hasilnya master.
Gauthier
@Gauthier Anda tidak menjawab pertanyaan mengapa. Bagi saya itu terdengar seperti menggabungkan devdengan hanya fitur A Bdan Cdigabungkan menjadi masteridentik dengan penggabungan individual A Bdan Cke dalam master. Jika tidak, itu menantang pemahaman saya tentang cara kerja git dan saya akan sangat penasaran mengapa!
Steven Lu
54

Anda memiliki argumen dengan urutan yang salah:

git branch <branch-name> <commit>

dan untuk itu, tidak masalah cabang mana yang diperiksa; itu akan melakukan apa yang Anda katakan. (Jika Anda menghilangkan argumen komit, defaultnya adalah membuat cabang di tempat yang sama dengan yang sekarang.)

Jika Anda ingin memeriksa cabang baru saat Anda membuatnya:

git checkout -b <branch> <commit>

dengan perilaku yang sama jika Anda menghilangkan argumen komit.

Bertingkat
sumber
22

Anda dapat melakukan ini secara lokal seperti yang disebutkan semua orang menggunakan

git checkout -b <branch-name> <sha1-of-commit>

Atau, Anda dapat melakukan ini di github itu sendiri, ikuti langkah-langkahnya:

1- Di repositori, klik file Commits.

2- pada komit yang ingin Anda buat bercabang, klik <>untuk menelusuri repositori pada titik ini di riwayat.

melakukan sejarah

3- Klik tree: xxxxxxdi kiri atas. Ketik saja nama cabang baru di sana klik Create branch xxxseperti yang ditunjukkan di bawah ini.

buat cabang baru

Sekarang Anda dapat mengambil perubahan dari cabang itu secara lokal dan melanjutkan dari sana.

Muhammad Soliman
sumber
Inilah yang saya butuhkan .. Bagaimana melakukannya di situs web
eharo2
Saya tidak pernah menyadarinya. Ini dia. GUI sangat bagus dan saya ingin jauh dari CLI.
Rohit Gupta
Ini harus ditandai sebagai Jawaban ¡
Sandeep Anand
11

Mencoba

git checkout <commit hash>
git checkout -b new_branch

Komit seharusnya hanya ada satu kali di pohon Anda, bukan di dua cabang terpisah.

Ini memungkinkan Anda untuk memeriksa komit spesifik itu dan menamainya sesuka Anda.

ZMorek
sumber
hai saya mencoba git log dev dan git log master, saya menemukan id hash komit sama untuk komit yang saya gabungkan ke cabang dev dari cabang master
RolandXu
mungkin membantu untuk menggunakan sesuatu seperti gitkuntuk memvisualisasikan log Anda
ZMorek
Saya baru saja menambahkan contoh di github. Dan Gauthier sudah menjawab pertanyaan saya bahwa saya salah paham dengan mode cabang git. Terima kasih :)
RolandXu
Saya pikir ini adalah jawaban yang tepat. Terima kasih
virusss8
9

Kamu harus melakukan:

git branch <branch_name> <commit>

(Anda menukar nama cabang dan melakukan)

Atau Anda bisa melakukan:

git checkout -b <branch_name> <commit>

Jika di tempat Anda menggunakan nama cabang, Anda mendapatkan cabang dari ujung cabang.

manojlds
sumber
Bukan itu HEADartinya. Anda bisa mengatakan "ujung cabang" atau "komit poin cabang ke" sebagai gantinya.
Cascabel
@Jefromi - Untuk menjadi purist, kita dapat mengatakan cabangnya saja, karena cabang itu sendiri adalah penunjuk ke ujung cabang.
manojlds