Menarik perubahan dari master ke cabang kerja saya?

16

Kami berdua sedang mengerjakan sesuatu. Kami menggunakan struktur cabang ini

  • menguasai
  • dev-A
  • dev-B

Kami berdua bekerja di cabang yang terpisah (dev-A, B) dan setiap kali kami selesai - kami mempromosikan perubahan kami untuk dikuasai.

Namun kekurangannya adalah kita tidak bisa mendapatkan perubahan yang dibuat pengembang lain. Semuanya ada di master tree - tetapi kami tidak bisa mendapatkan pembaruan terbaru yang dibuat pengembang lain.

Apakah ada cara untuk menyelesaikan ini atau haruskah kita mengubah struktur cabang kami (per fitur?)?

Utkarsh Sinha
sumber

Jawaban:

16

Saya telah melihat cabang pengembang yang digunakan dalam dua skenario utama:

  1. Komunitas open-source, di mana cabang-cabang ini sebenarnya garpu repositori, sehingga pengelola proyek dapat mengunci akses ke repositori master dan memerlukan integrasi melalui permintaan tarik. Ini membuat hidup lebih sulit bagi para kontributor, tetapi jauh lebih mudah bagi para pengelola, yang tentu saja adalah intinya, dan ini adalah model yang sangat sukses di GitHub.

  2. Tim dan organisasi yang tidak memiliki integrasi terus-menerus dan rekam jejak ketidakstabilan dalam penyebaran mereka, atau lebih buruk, ketidakstabilan dalam bangunan mereka. Tim-tim ini umumnya mencoba menggunakan cabang pengembang sebagai cara untuk melindungi stabilitas garis utama, dan hasilnya - biasanya - periode penggabungan yang panjang dan sangat menyakitkan sebelum rilis, diikuti oleh periode stabilisasi yang lebih lama dan lebih menyakitkan, yang kadang-kadang tidak terjadi sampai setelah rilis.

Saya tidak ingin ini menjadi kata-kata kasar tentang mengapa Anda membutuhkan CI, tetapi jelas dari pertanyaan Anda bahwa Anda tahu Anda tidak cukup sering mengintegrasikan perubahan Anda, jadi IMO tidak ada gunanya menari di sekitar masalah.

Kecuali jika Anda benar-benar bekerja dalam tim yang terdistribusi secara geografis dengan kebutuhan untuk "melakukan" perubahan dari pengembang luar, model branch-per-developer benar-benar tidak masuk akal. Ini terutama tidak masuk akal dengan git, karena setiap pengembang sudah secara teknis memiliki nya repositori / sendiri. Sebagian besar organisasi harus berintegrasi sangat sering - seperti, beberapa kali per hari.

Saat ini saya bagian dari grup yang terdiri dari 35 kontributor yang dibagi menjadi 4 tim yang terpisah, kebanyakan orang check-in setidaknya 2-3 kali sehari, beberapa orang 10-15 kali; itu tidak biasa untuk melihat bangunan rusak dan sangat jarang bagi mereka untuk tetap rusak selama lebih dari beberapa menit. Git menangani penggabungan dengan begitu mudah sebagian besar waktu sehingga cabang pengembang jarak jauh hanyalah overhead yang tidak perlu. Cukup tarik, gabungkan secara lokal, dan jalankan tes komit sebelum Anda mendorong, itu sederhana.

Jika Anda benar - benar harus menunda integrasi untuk melindungi stabilitas cabang master, model tipikal yang terbukti adalah menggunakan cabang yang tidak stabil - kadang-kadang disebut cabang pengembangan , seperti yang dijelaskan dalam model percabangan Git yang sukses . Jika pengembang tidak berhasil menggabungkan ke cabang ini (yang hanya perlu dibangun , tidak berjalan sempurna) setidaknya sekali sehari, maka Anda memiliki masalah kualitas / disiplin dan bukan masalah kontrol revisi; menutupinya dengan menggunakan cabang pengembang yang tidak terintegrasi hanya akan mengatasi masalah, dan dengan melakukan itu, sebenarnya membuat penggabungan akhirnya jauh lebih menyakitkan dan tidak stabil daripada yang seharusnya.

Cabang fitur bukan yang terburuk, tetapi IMO sangat sedikit proyek yang sebenarnya cukup besar untuk menjaminnya; jika proyek Anda sangat besar (yaitu berton-ton fitur yang sedang dikerjakan sekaligus) maka Anda akan melihat hasil yang lebih baik dari membaginya menjadi komponen otonom yang terpisah daripada jika Anda harus mengatasi masalah dengan kontrol sumber.

Anda dapat mengabaikan saran ini jika Anda mau, dan banyak tim melakukannya, tetapi salah satu alasan model percabangan yang ditautkan di atas begitu populer dan sukses adalah bahwa itu dirancang untuk bekerja dengan integrasi terus - menerus, bukan menentangnya.

Aaronaught
sumber
Saya pikir pentingnya integrasi berkelanjutan tidak dapat cukup ditekankan, baik dalam arti mengintegrasikan semuanya ke dalam satu cabang, dan dalam arti membangun harian / jam (menggunakan Jenkins atau yang serupa).
sleske
15

Di cabang kerja Anda jika Anda pergi:

git commit -am "Committing changes before merge"
git merge master

Anda juga dapat bergabung dari cabang pengembang lain

git checkout dev-A
git merge dev-B

Apa yang akan dilakukan adalah menggabungkan perubahan master ke cabang pengembangan Anda.

scaryrawr
sumber
Ya - itu satu arah. Saya berharap git akan memiliki alur kerja yang elegan untuk ini.
Utkarsh Sinha
2
Well git biasanya bekerja paling baik jika setiap pengembang memiliki repositori kerja lokal mereka sendiri dan repositori pusat bersama yang mendorong dan menarik dari pengembang. Dengan begitu Anda masing-masing dapat bekerja di cabang yang sama dan mendapatkan pembaruan dengan menarik dan melakukan perubahan dengan mendorong ke repositori pusat. Itu mungkin keanggunan yang Anda cari. git akan menangani penggabungan untuk Anda secara otomatis kecuali jika ada konflik. aliran git adalah tambahan yang bagus untuk alur kerja.
scaryrawr
Perfecto. Ada beberapa jawaban yang sangat panjang untuk pertanyaan yang tepat ini di beberapa tempat, tetapi git merge mastersementara pada fitur cabang memeriksa adalah apa yang saya cari. Terima kasih
Drenai
3

Jika dev-A dan dev-B adalah cabang yang berbeda untuk proyek yang berbeda, maka apa yang dijawab @scaryrawr adalah yang terbaik.

Tetapi jika dev-A dan dev-B sebenarnya persis kode yang sama (proyek yang sama) maka alternatifnya adalah keduanya bekerja pada salah satu cabang. Misalnya Anda membuat master cabang yang disebut 'devWork'. Anda berdua checkout devWork, mengerjakannya, komit, dan dorong perubahan. Perubahan yang didorong tidak pada Master tetapi di devWork, maka pengguna cabang lainnya hanya perlu melakukan PULL secara lokal untuk mendapatkan perubahan yang didorong.

Anda kemudian dapat mengikuti metode standar untuk menyelesaikan pekerjaan di devWork kembali ke Master dll.

David 'the botak jahe'
sumber