O nouă ramură de "maestru" este creat, noi o numim "test".
Există mai multe dezvoltatorii care fie să se angajeze la "maestru" sau pentru a crea alte ramuri și mai târziu merge în "maestru".
Las's spun lucra pe "test" este de a lua mai multe zile și doriți să păstreze în permanență "test" la curent cu se angajează în interiorul "maestru".
Mi-ar face `git trage originea de master de la "test".
Întrebarea 1: Este abordarea corectă? Alte dezvoltatorii ar putea fi ușor de lucrat pe aceleași fișiere ca am lucrat btw.
Munca mea pe "test" este de făcut și sunt gata pentru a merge înapoi la "maestru". Aici sunt două moduri pot să cred că:
O:
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
Eu nu sunt, folosind --rebazare
pentru că din câte am înțeles, rebazare va obține modificări de la "maestru" și stiva-al meu pe partea de sus a că, prin urmare, s-ar putea suprascrie modificările alți oameni au făcut.
Întrebarea 2: Care dintre aceste două metode este corect? Care este diferența acolo?
Obiectivul în toate de acest lucru este să-mi păstrez "test" ramură la curent cu lucrurile care se întâmplă în "maestru" și mai târziu am putea merge înapoi în "maestru" în speranța de a păstra cronologie cât mai liniar posibil.
Cum aș putea face acest lucru
git checkout master
git pull origin master
git merge test
git push origin master
Dacă am avea o filiala locală la o distanță unul, nu't simt confortabil cu fuzionarea alte ramuri decât una cu telecomanda. De asemenea, nu m-ar împinge modificările mele, până când am'm fericit cu ceea ce am vrea să împingă și, de asemenea, am ar't împinge lucrurile la toate, care sunt numai pentru mine și-mi depozit local. Din descrierea ta se pare, că "test" este doar pentru tine? Deci nici un motiv să-l publice.
git încearcă întotdeauna să o respecte pe a ta și altele modificări, și așa va --rebazare
. Eu nu't cred că pot explica în mod corespunzător, astfel încât să aibă o privire la Git de carte - Rebasing sau git-gata: Introducere în rebasing pentru o descriere. L's un feature destul de cool
Aceasta este o întrebare practică, dar toate răspunsurile de mai sus nu sunt practice.
Ca
git checkout master
git pull origin master
git merge test
git push origin master
Această abordare are două aspecte:
L's nesigur, pentru că nu ne't știu dacă există vreun conflict între test de ramura și ramura master.
Ar "stoarce" toate test se angajează într-o îmbinare se angajeze pe maestru, care este de a spune pe ramura master, putem't vedea toate jurnalele modificarea de test de ramură.
Deci, atunci când suspectăm că ar exista unele conflicte, putem avea următoarele git operațiuni:
git checkout test
git pull
git checkout master
git pull
git merge --no-ff --no-commit test
Test merge
înainte de comit
, pentru a evita un fast-forward comite prin ... nu-ff
,
Dacă un conflict este întâlnit, putem rula git status
pentru a verifica detalii despre conflicte și să încerce să rezolve
git status
După ce vom rezolva conflicte, sau dacă nu există nici un conflict, am comis
și "push" le
git commit -m 'merge test branch'
git push
Dar în acest fel va pierde schimbă istoria logat test de ramură, și s-ar face maestrul ramură să fie greu pentru alți dezvoltatori pentru a înțelege istoria proiectului.
Deci, cea mai bună metodă este să folosim rebazare "în loc de" merge
(să presupunem că, atunci când în acest timp, am rezolvat ramură a conflictelor).
Ce urmează este un simplu eșantion, pentru operații avansate, vă rugăm să consultați 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
Da, când ai făcut fețe, toate Testul branch's comite va fi mutat pe cap de Master ramură. Beneficiul major al rebasing este că veți obține un liniar si mult mai curat proiectului de istorie.
Singurul lucru de care ai nevoie pentru a evita este: nu utilizați niciodată `rebazare pe publice ramură, ca maestru de ramură.
Nu fac operațiuni cum ar fi următoarele:
git checkout master
git rebase -i test
Pentru detalii https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
anexa:
Nici o schimbare de bază, nici o unificare ar trebui să suprascrie pe nimeni's modificări (dacă alegeți să faceți acest lucru atunci când a rezolva un conflict).
Abordarea obișnuită în timp ce în curs de dezvoltare este
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
Când te're gata pentru a merge înapoi în maestru,
git checkout master
git log ..test # if you're curious
git merge test
git push
Daca're îngrijorat de rupere ceva pe fuziona, git merge --abandonați
este acolo pentru tine.
Folosind push și apoi trage ca un mijloc de fuziune este o prostie. Am'm, de asemenea, nu sunt sigur de ce ai're împingând test de origine.
În primul rând aș face să fie comasate ramură cât mai curat posibil. Rula testele, asigurați-vă că statul este așa cum doriți. Curat la noi se angajează prin git de squash.
În afară de KingCrunches raspuns, îți sugerez să utilizați
git checkout master
git pull origin master
git merge --squash test
git commit
git push origin master
S-ar putea-am făcut mulți se angajează într-o altă ramură, care ar trebui să fie doar unul comis în ramura de master. Pentru a menține comite o istorie cât mai curat posibil, ați putea dori să squash toate se angajează la testul de ramură într-o comită în ramura de master (a se vedea, de asemenea: Git: Pentru suc de fructe sau să nu squash?). Apoi, puteți rescrie, de asemenea, comite un mesaj de la ceva foarte expresiv. Ceva care este ușor de citit și de înțeles, fără a săpat în cod.
edit: Ai putea fi interesat
Deci pe GitHub, am sfârși prin a face următoarele pentru o caracteristică de ramură mybranch
:
Obține cele mai recente de origine
$ git checkout master
$ git pull origin master
Găsi îmbinare de bază hash:
$ git merge-base mybranch master
c193ea5e11f5699ae1f58b5b7029d1097395196f
$ git checkout mybranch
$ git rebase -i c193ea5e11f5699ae1f58b5b7029d1097395196f
Acum, asigurați-vă că numai primul este "alege", restul este "s":
pick 00f1e76 Add first draft of the Pflichtenheft
s d1c84b6 Update to two class problem
s 7486cd8 Explain steps better
Următor alege un foarte bun comite mesaj și împinge la GitHub. Face cerere de tragere atunci.
După unificare de cerere de tragere, o puteți șterge de la nivel local:
$ git branch -d mybranch
și pe GitHub
$ git push origin :mybranch
Acest lucru este fluxul de lucru pe care le folosesc în munca mea cu echipa. Scenariul este cum ai descris-o. În primul rând, când am'm a terminat lucrul la "test" am rebazare cu maestrul de a trage în tot ce a fost adăugat de a stăpâni timpul am'am fost de lucru pe "test" ramură.
`git pull-r amonte de master
Acest lucru va trage modificările să stăpânească când ai incarcatori de "test" ramură și să le aplice, și apoi se aplică modificările'am făcut pentru a testa "pe partea de sus de" starea actuală de master. Pot exista conflicte aici, dacă alte persoane au făcut modificări la aceleași fișiere pe care le'am editat în test. Dacă există, va trebui să le rezolvați manual, și a comis-o. Odată ce ai'am făcut asta,'ll fi bine pentru a comuta la master ramură și merge "test" cu probleme.
Thread vechi, dar nu am't mi-am găsit calea de a o face. Ar putea fi valoros pentru cineva care lucrează cu rebazare și vrea să fuzioneze toate se angajează la o sucursală pe partea de sus de master. Dacă există un conflict unul la fel, puteți să le rezolve pentru fiecare commit.
Ia de Master și de Ramură up-to-data:
git checkout master
git pull --rebase origin master
git checkout <branch_name>
git pull --rebase origin <branch_name>
Merge Ramura pe partea de sus de Master:
git checkout <branch_name>
git rebase master
Dacă executați în Conflicte timpul Rebazare:
În primul rând, pentru a rezolva conflictul din fișier. Apoi:
git add .
git rebase --continue
Odată rebazare terminat, rebazare ramura pe partea de sus de master:
git checkout master
git rebase <branch_name>
git checkout master
git pull origin master
# Merge branch test into master
git merge test
După fuziune, dacă fișierul este schimbat, atunci când îmbinați va prin eroare de "Soluționarea Conflictelor"
Deci, atunci ai nevoie pentru a rezolva în primul rând toate conflictele apoi, aveți pentru a comite din nou toate modificările și apoi apăsați
git push origin master
Acest lucru este mai bine cine a făcut modificări în testul de ramură, pentru că el știa ce schimbări a făcut.
Mi-ar folosi rebazare metodă. Mai ales pentru că reflectă perfect cazul tau semantic, de exemplu. ceea ce vreau să fac este de a actualiza starea dvs. curentă ramură și "pretind" ca în cazul în care s-a bazat pe cea mai recentă.
Deci, chiar fără a verifica afară de "stăpân", mi-ar:
git fetch origin
git rebase -i origin/master
# ...solve possible conflicts here
Desigur, doar preluarea de origine nu reîmprospătare locale de stat, de "maestru" (ca să nu se efectueze o îmbinare), dar este perfect ok pentru scopul nostru - ne-am dori, pentru a evita trecerea în jur, de dragul de a salva timp.