Cabang baru dari master
dibuat, kita menyebutnya sebagai test
.
Ada beberapa pengembang yang baik berkomitmen untuk master
atau membuat cabang-cabang lain dan kemudian bergabung menjadi master
.
Let's mengatakan bekerja di test
adalah mengambil beberapa hari dan anda ingin terus menjaga test
diperbarui dengan berkomitmen dalam master
.
Saya akan melakukan git pull asal master
dari test
.
Pertanyaan 1: ini Adalah pendekatan yang tepat? Pengembang lain bisa dengan mudah bekerja pada file yang sama seperti yang saya telah bekerja btw.
Saya bekerja di test
yang dilakukan dan saya siap untuk bergabung kembali ke master
. Berikut ini adalah dua cara yang dapat saya pikirkan:
A:
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 guru
dan tumpukan tambang di atas itu maka hal itu bisa menimpa perubahan lain yang dilakukan orang-orang.
Pertanyaan 2: Mana salah satu dari dua metode yang benar? Apa perbedaan yang ada?
Tujuan semua ini adalah untuk menjaga saya test
cabang diperbarui dengan hal-hal yang terjadi di master
dan kemudian saya bisa menggabungkan mereka kembali ke master
berharap untuk terus timeline linear seperti mungkin.
Bagaimana aku akan melakukan ini
git checkout master
git pull origin master
git merge test
git push origin master
Jika saya memiliki sebuah cabang lokal dari jauh, aku don't merasa nyaman dengan penggabungan cabang-cabang lain dari yang satu ini dengan remote. Juga saya tidak akan mendorong perubahan saya, sampai saya'm senang dengan apa yang saya ingin mendorong dan juga saya tidak't mendorong hal-hal yang sama sekali, yang hanya untuk saya dan saya repositori lokal. Dalam deskripsi anda tampaknya, bahwa test
hanya untuk anda? Jadi tidak ada alasan untuk mempublikasikannya.
git selalu mencoba untuk menghormati anda dan lain-lain perubahan, dan akan --rebase
. Saya don't pikir saya bisa menjelaskan dengan tepat, jadi kita lihat di Git buku - Rebasing atau git-siap: Intro ke rebasing untuk sedikit keterangan. It's cukup fitur keren
Ini adalah pertanyaan praktis, tapi semua jawaban di atas tidak praktis.
Seperti
git checkout master
git pull origin master
git merge test
git push origin master
Pendekatan ini memiliki dua masalah:
It's tidak aman, karena kami don't tahu jika ada konflik antara uji cabang dan cabang master.
Itu akan "memeras" semua tes berkomitmen menjadi satu menggabungkan komit pada guru, yang mengatakan pada cabang master, kita bisa't melihat semua log perubahan dari uji cabang.
Jadi, ketika kami menduga akan ada beberapa konflik, kita bisa mengikuti operasi git:
git checkout test
git pull
git checkout master
git pull
git merge --no-ff --no-commit test
Tes menggabungkan
sebelum berbuat
, menghindari fast-forward komit dengan --no-ff
,
Jika konflik yang dihadapi, kita dapat menjalankan git status
untuk memeriksa rincian tentang konflik dan mencoba untuk memecahkan
git status
Setelah kami menyelesaikan konflik, atau jika tidak ada konflik, kita melakukan
dan push
mereka
git commit -m 'merge test branch'
git push
Tapi cara ini akan menurunkan perubahan sejarah dicatat dalam uji cabang, dan itu akan membuat master cabang menjadi sulit bagi pengembang lain untuk memahami sejarah dari proyek.
Jadi metode terbaik adalah kita harus menggunakan rebase
bukan menggabungkan
(misalkan, ketika di waktu ini, kami telah memecahkan cabang konflik).
Berikut adalah salah satu contoh sederhana, untuk operasi lanjutan, silakan merujuk ke http://git-scm.com/book/en/v2/Git-Branching-Rebasing
git checkout master
git pull
git checkout test
git pull
git rebase -i master
git checkout master
git merge test
Ya, ketika anda memiliki bagian atasnya dilakukan, semua Uji cabang's berkomitmen akan pindah ke kepala cabang Master. Manfaat utama dari rebasing adalah bahwa anda mendapatkan linear dan jauh lebih bersih proyek sejarah.
Satu-satunya hal yang perlu anda hindari adalah: jangan pernah menggunakan rebase
di semua cabang, seperti master cabang.
Pernah melakukan operasi seperti berikut:
git checkout master
git rebase -i test
Rincian untuk https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
lampiran:
Tidak rebase atau gabungan harus menimpa siapa saja's perubahan (kecuali jika anda memilih untuk melakukannya ketika menyelesaikan konflik).
Pendekatan yang biasa sedangkan berkembang adalah
git checkout master
git pull
git checkout test
git log master.. # if you're curious
git merge origin/test # to update your local test from the fetch in the pull earlier
Bila anda're siap untuk bergabung kembali ke master,
git checkout master
git log ..test # if you're curious
git merge test
git push
Jika anda're khawatir tentang melanggar sesuatu di merge, git merge --batalkan
ada untuk anda.
Menggunakan push dan kemudian tarik sebagai sarana penggabungan adalah konyol. I'm juga tidak yakin mengapa anda're mendorong tes ke asal.
Pertama saya ingin membuat untuk-akan digabung cabang sebersih mungkin. Menjalankan tes anda, pastikan keadaan ini seperti yang anda inginkan. Membersihkan baru melakukan dengan git squash.
Selain KingCrunches jawaban, saya sarankan untuk menggunakan
git checkout master
git pull origin master
git merge --squash test
git commit
git push origin master
Anda mungkin telah membuat banyak melakukan di cabang lainnya, yang hanya boleh melakukan satu di induk cabang. Untuk menjaga komit sejarah sebersih mungkin, anda mungkin ingin menghentikan anda dari melakukan tes cabang ke salah satu komit dalam cabang utama (lihat juga: Git: Untuk squash atau tidak untuk squash?). Kemudian anda juga dapat menulis ulang pesan komit untuk sesuatu yang sangat ekspresif. Sesuatu yang mudah untuk membaca dan memahami, tanpa menggali ke dalam kode.
edit: Anda mungkin akan tertarik
Jadi di GitHub, saya akhirnya melakukan hal berikut untuk fitur cabang mybranch
:
Dapatkan terbaru dari negara asal
$ git checkout master
$ git pull origin master
Menemukan menggabungkan dasar hash:
$ git merge-base mybranch master
c193ea5e11f5699ae1f58b5b7029d1097395196f
$ git checkout mybranch
$ git rebase -i c193ea5e11f5699ae1f58b5b7029d1097395196f
Sekarang pastikan hanya yang pertama adalah biasa
, sisanya adalah s
:
pick 00f1e76 Add first draft of the Pflichtenheft
s d1c84b6 Update to two class problem
s 7486cd8 Explain steps better
Berikutnya memilih sangat baik pesan commit dan push ke GitHub. Membuat tarikan permintaan itu.
Setelah penggabungan dari tarikan permintaan, anda dapat menghapusnya secara lokal:
$ git branch -d mybranch
dan di GitHub
$ git push origin :mybranch
Ini adalah alur kerja yang saya gunakan di pekerjaan saya dengan tim. Skenario ini seperti yang anda gambarkan. Pertama, ketika saya'm dilakukan bekerja pada test
saya rebase dengan guru untuk menarik apa pun yang telah ditambahkan ke master selama waktu saya've telah bekerja di test
cabang.
git pull-r hulu master
Ini akan menarik perubahan untuk menguasai karena anda bercabang test
cabang dan menerapkan mereka, dan kemudian menerapkan perubahan anda've dilakukan untuk menguji "di atas" saat ini keadaan guru. Mungkin ada konflik di sini, jika orang lain telah membuat perubahan ke file yang sama yang anda've diedit di uji. Jika ada, anda akan memiliki untuk memperbaikinya secara manual, dan melakukan. Setelah anda've dilakukan dengan itu, anda'akan baik untuk beralih ke master branch dan merge test
dengan tidak ada masalah.
Thread lama, tapi aku belum't menemukan cara untuk melakukannya. Ini mungkin berharga untuk seseorang yang bekerja dengan rebase dan ingin menggabungkan semua komit dari cabang di atas master. Jika ada konflik satu cara, anda dapat menyelesaikan mereka untuk setiap melakukan.
Dapatkan Master dan Cabang up-to-date:
git checkout master
git pull --rebase origin master
git checkout <branch_name>
git pull --rebase origin <branch_name>
Merge Branch di atas Master:
git checkout <branch_name>
git rebase master
Jika anda mengalami Konflik selama Rebase:
Pertama, menyelesaikan konflik dalam file. Maka:
git add .
git rebase --continue
Setelah rebase selesai, rebase cabang di atas master:
git checkout master
git rebase <branch_name>
git checkout master
git pull origin master
# Merge branch test into master
git merge test
Setelah penggabungan, jika file tersebut berubah, maka ketika anda bergabung akan melalui kesalahan "Menyelesaikan Konflik"
Jadi anda harus terlebih dahulu menyelesaikan semua konflik maka, anda harus lagi melakukan semua perubahan anda dan kemudian mendorong
git push origin master
Ini lebih baik apa yang telah dilakukan perubahan pada uji cabang, karena ia tahu perubahan apa yang telah dia lakukan.
Saya akan menggunakan rebase metode. Sebagian besar karena sangat sesuai dengan kasus anda semantik, yaitu. apa yang anda ingin lakukan adalah untuk me-refresh keadaan anda saat ini cabang dan "berpura-pura" seolah-olah itu didasarkan pada terbaru.
Jadi, bahkan tanpa memeriksa master
, saya akan:
git fetch origin
git rebase -i origin/master
# ...solve possible conflicts here
Tentu saja, hanya mengambil dari asal tidak me-refresh lokal negara anda master
(karena tidak melakukan merge), tapi hal ini sangat ok untuk tujuan kami - kami ingin menghindari beralih sekitar, demi menghemat waktu.