Oletetaan, että Gitissä on seuraava tilanne:
Luotu arkisto:
mkdir GitTest2
cd GitTest2
git init
Masterissa tehdään joitakin muutoksia ja ne siirretään.
echo "On Master" > tiedosto
git commit -a -m "Alkuperäinen sitoumus"
Feature1 haarautui masterista ja osa työstä on tehty:
git branch feature1
git checkout feature1
echo "Feature1" > featureFile
git commit -a -m "Commit for feature1"
Samaan aikaan master-koodissa havaitaan virhe ja perustetaan hotfix-haara.
git checkout master
git branch hotfix1
git checkout hotfix1
Virhe korjataan hotfix-haarassa ja yhdistetään takaisin master-haaraan (ehkä pull requestin/koodin tarkistuksen jälkeen):
echo "Bugfix" > bugfixFile
git commit -a -m "Bugfix Commit"
git checkout master
git merge --no-ff hotfix1
Feature1:n kehittäminen jatkuu:
feature1: git checkout feature1
Sanotaan, että tarvitsen korjauksen feature-haaraani, ehkä siksi, että vika esiintyy myös siellä. Miten voin saavuttaa tämän ilman, että komitukset kopioidaan feature-haaraani?
Haluan estää sen, että feature-haaraani tulee kaksi uutta komitusta, joilla ei ole mitään yhteyttä feature-toteutukseen. Tämä vaikuttaa erityisen tärkeältä, jos käytän pull request -palvelua: Kaikki nämä kommitit sisällytetään myös pull requestiin, ja ne on tarkistettava, vaikka tämä on jo tehty (koska hotfix on jo masterissa).
En voi tehdä git merge master --ff-only
: "fatal: Not possible to fast-forward, aborting.", mutta en ole varma, auttoiko tämä minua.
Miten yhdistämme päähaaran ominaisuushaaraan? Helposti:
git checkout feature1
git merge master
Tässä ei ole mitään järkeä pakottaa nopeaa yhdistämistä, koska sitä ei voida tehdä. Sitouduit sekä feature-haaraan että master-haaraan. Pikahäivytys on nyt mahdotonta.
Katso GitFlow. Se on haarautumismalli gitille, jota voi noudattaa, ja sinä teit sen tiedostamattasi jo. Se on myös laajennus Gitiin, joka lisää joitakin komentoja uusiin työnkulun vaiheisiin, jotka tekevät automaattisesti asioita, jotka muuten joutuisit tekemään manuaalisesti.
Mitä teit oikein työnkulussasi? Sinulla on kaksi haaraa, joiden kanssa voit työskennellä, feature1-haara on periaatteessa "develop" -haara GitFlow-mallissa.
Loit hotfix-haaran masterista ja yhdistit sen takaisin. Ja nyt olet jumissa.
GitFlow-malli pyytää sinua yhdistämään hotfixin myös kehityshaaraan, joka on "feature1" sinun tapauksessasi.
Todellinen vastaus olisi siis:
git checkout feature1
git merge --no-ff hotfix1
Tämä lisää kaikki hotfixin sisällä tehdyt muutokset feature-haaraan, mutta vain nämä muutokset. Ne saattavat olla ristiriidassa muiden kehitysmuutosten kanssa, mutta ne eivät ole ristiriidassa master-haaran kanssa, jos feature-haara yhdistetään takaisin master-haaraan.
Ole hyvin varovainen uudelleenkytkennän kanssa. Uudelleenasennusta kannattaa tehdä vain, jos tekemäsi muutokset pysyvät paikallisesti arkistossasi, eli et ole siirtänyt mitään haaroja johonkin toiseen arkistoon. Rebasing on loistava työkalu, jolla voit järjestää paikalliset komituksesi käyttökelpoiseen järjestykseen ennen kuin työnnät ne maailmalle, mutta rebasing jälkeenpäin sotkee asiat kaltaisillesi git-aloittelijoille.
Sinun pitäisi pystyä perustamaan haara uudelleen masteriin:
git checkout feature1
git rebase master
Hallitse kaikki syntyvät ristiriidat. Kun pääset virheenkorjauksia sisältäviin kommitteihin (jotka ovat jo masterissa), Git sanoo, että muutoksia ei ollut ja että ehkä niitä on jo sovellettu. Jatkat sitten uudelleenkäyttöä (ohittaen samalla masterissa jo olevat kommitit) komennolla
git rebase --skip
Jos suoritat git log
feature-haarallesi, näet bugfix commitin näkyvän vain kerran ja master-osassa.
Jos haluat yksityiskohtaisemman keskustelun, katso Git-kirjan dokumentaatio git rebase
(https://git-scm.com/docs/git-rebase), jossa käsitellään juuri tätä käyttötapausta.
================ Edit for additional context ====================
Tämä vastaus annettiin erityisesti @theomegan esittämään kysymykseen ottaen huomioon hänen erityistilanteensa. Huomaa tämä osa:
Haluan estää [...]-kommitointeja ominaisuushaarassani, joilla ei ole mitään yhteyttä ominaisuuden toteutukseen.
Hänen yksityisen haaransa uudelleensijoittaminen masteriin on juuri se, mikä tuottaa tämän tuloksen. Sitä vastoin masterin sulauttaminen hänen haaraansa tekisi juuri sen, mitä hän erityisesti ei halua tapahtuvan: lisäisi toimituksen, joka ei liity ominaisuuden toteutukseen, jota hän työstää haaransa kautta.
Puhuttelen käyttäjiä, jotka lukevat kysymyksen otsikon, ohittavat kysymyksen varsinaisen sisällön ja asiayhteyden ja lukevat sitten vain ylimmän vastauksen sokeasti olettaen, että se soveltuu aina heidän (erilaiseen) käyttötapaukseensa, ja selitän asiaa tarkemmin:
git merge master
-ohjelmalla, kuten @Svenin vastauksessa).Lopuksi, jos olet tyytymätön siihen, että tämä vastaus ei sovi parhaiten tilanteeseesi, vaikka se sopi @theomega:lle, kommentin lisääminen alla ei ole erityisen hyödyllistä: Minä en vaikuta siihen, mikä vastaus valitaan, vain @theomega.
Voit ehkä tehdä "cherry-pick" -toiminnon vetääksesi tarkan toimituksen (toimitukset), jonka (jotka) tarvitset ominaisuushaaraan.
Tee git checkout hotfix1
päästäksesi hotfix1-haaraan. Tee sitten git log
saadaksesi SHA-1-hash (iso satunnaisten kirjainten ja numeroiden sarja, joka yksilöi commitin) kyseisestä commitista. Kopioi se (tai noin 10 ensimmäistä merkkiä).
Tee sitten git checkout feature1
palataksesi takaisin feature-haaraan.
Sitten git cherry-pick <äsken kopioimasi SHA-1-hash>
.
Tämä vetää kyseisen ja vain kyseisen toimituksen feature-haaraasi. Muutos on haarassa - juuri "kirsikkapoimit" sen sisään. Jatka sitten työskentelyä, muokkaa, tee muutoksia, lähetä, työnnä jne. sydämesi kyllyydestä.
Kun lopulta teet toisen yhdistämisen toisesta haarasta ominaisuushaaraan (tai päinvastoin), Git tunnistaa, että olet jo yhdistänyt tämän tietyn muutoksen, tietää, ettei sitä tarvitse tehdä uudelleen, ja vain "ohittaa" sen.