Hva er den beste (og sikreste) måten å slå sammen en Git-gren til master?

En ny gren fra master opprettes, vi kaller den test.

Det er flere utviklere som enten forplikter seg til master eller oppretter andre grener og senere flettes inn i master.

La oss si at arbeidet med test tar flere dager, og du ønsker å holde test kontinuerlig oppdatert med commits i master.

Jeg ville gjøre git pull origin master fra test.

Spørsmål 1: Er dette riktig tilnærming? Andre utviklere kunne lett ha jobbet med samme filer som jeg har jobbet btw.


Arbeidet mitt med test er ferdig, og jeg er klar til å flette det tilbake til master. Her er de to måtene jeg kan tenke på:

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

Jeg bruker ikke --rebase fordi fra min forståelse vil rebase få endringene fra master og stable mine på toppen av det, og dermed kan det overskrive endringer andre har gjort.

Spørsmål 2: Hvilken av disse to metodene er riktig? Hva er forskjellen der?

Målet med alt dette er å holde test-grenen min oppdatert med tingene som skjer i master, og senere kan jeg slå dem sammen igjen i master i håp om å holde tidslinjen så lineær som mulig.

Løsning

Hvordan jeg ville gjort dette

git checkout master
git pull origin master
git merge test
git push origin master

Hvis jeg har en lokal filial fra en ekstern, føler jeg meg ikke komfortabel med å slå sammen andre filialer enn denne med den eksterne. Jeg vil heller ikke skyve endringene mine før jeg er fornøyd med det jeg vil skyve, og jeg vil heller ikke skyve ting i det hele tatt, som bare er for meg og mitt lokale depot. I beskrivelsen din ser det ut til at testen bare er for deg? Så ingen grunn til å publisere det.

git prøver alltid å respektere dine og andres endringer, og det vil også --rebase. Jeg tror ikke jeg kan forklare det riktig, så ta en titt på the Git book - Rebasing eller git-ready: Intro into rebasing for en liten beskrivelse. Det er en ganske kul funksjon

Kommentarer (19)

Dette er et veldig praktisk spørsmål, men alle svarene ovenfor er ikke praktiske.

Som

git checkout master
git pull origin master
git merge test
git push origin master

Denne tilnærmingen har to problemer:

  1. Det er usikkert, fordi vi ikke vet om det er noen konflikter mellom testgren og hovedgren.

  2. Det ville " klemme " alle testforpliktelser i en sammenslåingsforpliktelse på master; det vil si på mastergrenen, vi kan ikke se alle endringsloggene til testgrenen.

Så når vi mistenker at det vil være noen konflikter, kan vi ha følgende git-operasjoner:

git checkout test
git pull 
git checkout master
git pull
git merge --no-ff --no-commit test

Test merge før commit, unngå en fast-forward commit med --no-ff,

Hvis det oppstår konflikt, kan vi kjøre git status for å sjekke detaljer om konfliktene og prøve å løse dem.

git status

Når vi har løst konfliktene, eller hvis det ikke er noen konflikt, kan vi commit og push dem.

git commit -m 'merge test branch'
git push

Men denne måten vil miste endringshistorikken som er logget i testgrenen, og det vil gjøre det vanskelig for andre utviklere å forstå prosjektets historie.

Så den beste metoden er at vi må bruke rebase i stedet for merge (anta at vi i denne tiden har løst grenkonfliktene).

Følgende er et enkelt eksempel, for avanserte operasjoner, vennligst se 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

Jepp, når du har overdeler gjort, vil alle testgrenens forpliktelser bli flyttet til hodet til hovedgrenen. Den største fordelen med rebasing er at du får en lineær og mye renere prosjekthistorikk.

Det eneste du trenger å unngå er: bruk aldri rebase på offentlig gren, som hovedgren.

Utfør aldri operasjoner som følgende:

git checkout master
git rebase -i test

Detaljer for https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing

vedlegg:

Kommentarer (8)

Verken en rebasering eller en sammenslåing skal overskrive noens endringer (med mindre du velger å gjøre det når du løser en konflikt).

Den vanlige fremgangsmåten under utvikling er

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

Når du'er klar til å fusjonere tilbake til master,

git checkout master
git log ..test # if you're curious
git merge test
git push

Hvis du er bekymret for å ødelegge noe på sammenslåingen, er git merge --abort der for deg.

Å bruke push og deretter pull som et middel til å slå sammen er dumt. Jeg er heller ikke sikker på hvorfor du skyver test til opprinnelse.

Kommentarer (7)