Cabang baru dari master
dibuat, kami menyebutnya test
.
Ada beberapa pengembang yang berkomitmen master
atau membuat cabang lain dan kemudian bergabung master
.
Katakanlah pekerjaan test
sedang berlangsung beberapa hari dan Anda ingin terus test
diperbarui dengan komitmen di dalamnya master
.
Saya akan lakukan git pull origin master
dari test
.
Pertanyaan 1: Apakah ini pendekatan yang tepat? Pengembang lain dapat dengan mudah bekerja pada file yang sama seperti saya telah bekerja dengan baik.
Pekerjaan saya test
selesai dan saya siap untuk menggabungkannya kembali master
. Berikut adalah dua cara yang dapat saya pikirkan:
SEBUAH:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
B:
git checkout test
git pull origin master
git checkout master
git merge test
Saya tidak menggunakan --rebase
karena dari pemahaman saya, rebase akan mendapatkan perubahan dari master
dan menumpuk milik saya di atas itu karena itu bisa menimpa perubahan yang dilakukan orang lain.
Pertanyaan 2: Mana dari dua metode ini yang benar? Apa bedanya di sana?
Tujuan dari semua ini adalah untuk menjaga test
cabang saya diperbarui dengan hal-hal yang terjadi di dalam master
dan kemudian saya dapat menggabungkan mereka kembali dengan master
berharap untuk menjaga garis waktu ser lini mungkin.
Jawaban:
Bagaimana saya akan melakukan ini
Jika saya memiliki cabang lokal dari yang jauh, saya tidak merasa nyaman dengan menggabungkan cabang lain dari yang ini dengan remote. Juga saya tidak akan mendorong perubahan saya, sampai saya senang dengan apa yang ingin saya dorong dan juga saya tidak akan mendorong semuanya, yang hanya untuk saya dan repositori lokal saya. Dalam uraian Anda tampaknya, itu
test
hanya untuk Anda? Jadi tidak ada alasan untuk mempublikasikannya.git selalu berusaha menghargai perubahan Anda dan orang lain, dan demikian juga halnya
--rebase
. Saya rasa saya tidak bisa menjelaskannya dengan tepat, jadi lihatlah buku Git - Rebasing atau git-ready: Intro rebasing untuk penjelasan singkat. Ini fitur yang cukup kerensumber
git merge test
memberi sayafatal: 'test' does not point to a commit
. Saya harus mencarigit log
titik komit di cabang tes, beralih kembali ke cabang master lalu lakukangit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
harus ada. Tentu, Anda bisa menggunakan hash sebagai gantinya, tetapi biasanya lebih mudah menggunakan nama cabang. Secara internal itu hanya mengambil hashHEAD
cabang.Ini adalah pertanyaan yang sangat praktis, tetapi semua jawaban di atas tidak praktis.
Suka
Pendekatan ini memiliki dua masalah :
Itu tidak aman, karena kita tidak tahu apakah ada konflik antara cabang uji dan cabang master.
Itu akan "memeras" semua tes yang dilakukan menjadi satu gabungan komit pada master; artinya di cabang master, kita tidak bisa melihat semua log perubahan dari cabang uji.
Jadi, ketika kami menduga akan ada beberapa konflik, kami dapat melakukan operasi git berikut:
Tes
merge
sebelumnyacommit
, hindari komitmen fast-forward oleh--no-ff
,Jika konflik ditemukan, kita dapat lari
git status
untuk memeriksa detail tentang konflik dan mencoba menyelesaikannyaBegitu kita menyelesaikan konflik, atau jika tidak ada konflik, kita
commit
danpush
merekaTetapi cara ini akan kehilangan histori perubahan yang dicatat dalam cabang uji, dan itu akan membuat cabang utama menjadi sulit bagi pengembang lain untuk memahami sejarah proyek.
Jadi metode terbaik adalah kita harus menggunakan
rebase
alih-alihmerge
(misalkan, saat ini, kita telah menyelesaikan konflik cabang).Berikut ini adalah satu contoh sederhana, untuk operasi lanjutan, silakan merujuk ke http://git-scm.com/book/en/v2/Git-Branching-Rebasing
Yap, ketika Anda telah menyelesaikan bagian atasnya, semua komit dari cabang Uji akan dipindahkan ke kepala cabang Master. Manfaat utama rebasing adalah Anda mendapatkan sejarah proyek yang linier dan lebih bersih.
Satu-satunya hal yang perlu Anda hindari adalah: jangan pernah gunakan
rebase
di cabang publik, seperti cabang utama.Jangan pernah melakukan operasi seperti berikut:
Detail untuk https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
lampiran:
sumber
Baik rebase maupun gabungan tidak boleh menimpa perubahan siapa pun (kecuali jika Anda memilih untuk melakukannya saat menyelesaikan konflik).
Pendekatan biasa saat berkembang adalah
Ketika Anda siap untuk bergabung kembali menjadi master,
Jika Anda khawatir tentang melanggar sesuatu pada penggabungan,
git merge --abort
apakah ada untuk Anda.Menggunakan dorongan dan kemudian menarik sebagai sarana penggabungan adalah konyol. Saya juga tidak yakin mengapa Anda mendorong tes ke tempat asal.
sumber
git stash
adalah untuk.Pertama-tama saya akan membuat cabang yang akan digabung sebersih mungkin. Jalankan tes Anda, pastikan statusnya sesuai keinginan Anda. Bersihkan komit baru dengan git squash .
Selain jawaban KingCrunches , saya sarankan untuk menggunakannya
Anda mungkin telah membuat banyak komitmen di cabang lain, yang seharusnya hanya satu komit di cabang utama. Untuk menjaga riwayat komit sebersih mungkin, Anda mungkin ingin memeras semua komit Anda dari cabang uji menjadi satu komit di cabang master (lihat juga: Git: Untuk squash atau tidak untuk squash? ). Kemudian Anda juga dapat menulis ulang pesan komit ke sesuatu yang sangat ekspresif. Sesuatu yang mudah dibaca dan dipahami, tanpa menggali ke dalam kode.
sunting: Anda mungkin tertarik
Jadi pada GitHub, saya akhirnya melakukan hal berikut untuk cabang fitur
mybranch
:Dapatkan yang terbaru dari asal
Temukan hash basis gabungan:
Sekarang pastikan hanya yang pertama
pick
, sisanyas
:Selanjutnya pilih pesan komit yang sangat baik dan dorong ke GitHub. Buat permintaan tarik itu.
Setelah penggabungan permintaan tarik, Anda dapat menghapusnya secara lokal:
dan di GitHub
sumber
Utas lama, tapi saya belum menemukan cara saya melakukannya. Mungkin bermanfaat bagi seseorang yang bekerja dengan rebase dan ingin menggabungkan semua komitmen dari cabang (fitur) di atas master. Jika ada konflik di jalan, Anda dapat menyelesaikannya untuk setiap komit. Anda tetap memegang kendali penuh selama proses dan dapat membatalkan kapan saja.
Dapatkan Master dan Cabang terkini:
Gabungkan Cabang di atas Master:
Opsional: Jika Anda mengalami Konflik selama Rebase:
Pertama, atasi konflik dalam file. Kemudian:
Dorong Cabang rebased Anda:
Sekarang Anda punya dua opsi:
Selesai
sumber
Ini adalah alur kerja yang saya gunakan di pekerjaan saya dengan tim. Skenario seperti yang Anda gambarkan. Pertama, ketika saya selesai bekerja
test
saya rebase dengan master untuk menarik apa pun yang telah ditambahkan ke master selama saya bekerja ditest
cabang.git pull -r upstream master
Ini akan menarik perubahan untuk dikuasai sejak Anda bercabang
test
cabang dan menerapkannya, dan kemudian menerapkan perubahan yang Anda buat untuk menguji "di atas" kondisi master saat ini. Mungkin ada konflik di sini, jika orang lain telah membuat perubahan pada file yang sama yang telah Anda edit dalam pengujian. Jika ada, Anda harus memperbaikinya secara manual, dan melakukan. Setelah Anda selesai melakukannya, Anda akan baik untuk beralih ke cabang master dan bergabungtest
tanpa masalah.sumber
Setelah penggabungan, jika file diubah, maka ketika Anda menggabungkannya akan melalui kesalahan "Selesaikan Konflik"
Jadi, Anda harus menyelesaikan semua konflik Anda terlebih dahulu, Anda harus melakukan lagi semua perubahan Anda dan kemudian mendorong
Ini lebih baik dilakukan siapa yang telah melakukan perubahan di cabang tes, karena dia tahu perubahan apa yang telah dilakukannya.
sumber
Saya akan menggunakan metode rebase. Terutama karena itu secara sempurna mencerminkan kasus Anda secara semantik, yaitu. yang ingin Anda lakukan adalah menyegarkan keadaan cabang Anda saat ini dan "berpura-pura" seolah-olah itu didasarkan pada yang terbaru.
Jadi, tanpa memeriksa
master
, saya akan:Tentu saja, hanya mengambil dari tempat asal tidak menyegarkan keadaan lokal Anda
master
(karena tidak melakukan penggabungan), tetapi sangat baik untuk tujuan kami - kami ingin menghindari beralih, demi menghemat waktu.sumber
@Jawaban KingCrunch harus bekerja dalam banyak kasus. Salah satu masalah yang dapat muncul adalah Anda mungkin berada pada mesin yang berbeda yang perlu menarik yang terbaru dari pengujian. Jadi, saya sarankan menarik tes terlebih dahulu. Revisi terlihat seperti ini:
sumber
Anda harus memeriksa cabang untuk menarik, karena menarik berarti menggabungkan diri dengan master, dan Anda memerlukan pohon kerja untuk bergabung.
Tidak perlu memeriksa dulu; rebase melakukan hal yang benar dengan dua argumen
git push secara default mendorong semua cabang yang ada di sini dan di remote
sumber
Seperti judulnya "Cara terbaik", saya pikir itu ide yang baik untuk mempertimbangkan strategi kesabaran menggabungkan.
Dari: https://git-scm.com/docs/merge-strategies
Pemakaian:
Git Alias
Saya selalu menggunakan alias untuk ini, misalnya jalankan sekali:
Sekarang Anda bisa melakukannya:
sumber
Ini dari GitLab: Cukup ikuti instruksi:
sumber
Saya akan menjawab sesuai mengembangkan dan fitur cabang,
jika Anda menggunakan fitur branch dan perlu memperbaruinya dengan perintah use use di bawah ini: git checkout mengembangkan fitur git pull git checkout / xyz git merge mengembangkan
Sekarang fitur Anda diperbarui dengan pengembangan Anda dapat mendorong perubahan Anda.
sumber