Git Merge no-ff optie begrijpen
De gemakkelijke merge-mogelijkheid van git is een van zijn sterke punten. Tijdens een merge gebruikt git fast-forward merge wanneer het merkt dat de HEAD van de huidige branch een voorouder is van de commit die je probeert te mergen. In een fast-forward merge is er geen nieuwe commit. Git verplaatst alleen de aanwijzer. Als dit gedrag niet wenselijk is, kun je de no-ff-vlag gebruiken om een nieuwe vastlegging voor de samenvoeging te maken.
Hoe samenvoegen eruitziet met en zonder Fast-Forward
Na snel vooruitspoelen ziet je git-geschiedenis er als volgt uit:
C0 -> C1 -> C2-> C3
Voor hetzelfde aantal commits is hier een merge geschiedenis zonder fast-forward:
In het eerste geval is er geen indicatie dat er sprake was van vertakking. In het tweede geval toont de geschiedenis een C4-commit om aan te geven waar de samenvoeging plaatsvond.
Door een voorbeeld lopen
Je maakt een git-repository, maakt een branch en probeert dan de merges met en zonder fast-forward.
Sectie 1: Installatie
Ten eerste kun je de git-repository maken met de volgende stappen:
$ mkdir mijn_project$ cd mijn_project
$ git init
$ raak een . aan.tekst
$ git add -A
$ git commit -m "C0: a . toevoegen.tekst"
Laten we nu een branch maken met de naam features en een paar wijzigingen doorvoeren:
$ git branch-functies$ git checkout-functies
$ raak b . aan.tekst
$ git add -A
$ git commit -m "C1: b . toevoegen.tekst"
$ raak c . aan.tekst
$ git add -A
$ git commit -m "C2: c . toevoegen.tekst"
$ raak d aan.tekst
$ git add -A
$ git commit -m "C3: d . toevoegen.tekst"
Sectie 2: Samenvoegen met snel doorsturen
Laten we teruggaan naar de master-branch en de features-branch erin samenvoegen:
$ git checkout master$ git merge-functies
Uitgang:
08076fb bijwerken ... 9ee88ebVooruitspoelen
b.txt | 0
c.txt | 0
d.txt | 0
3 bestanden gewijzigd, 0 invoegingen (+), 0 verwijderingen (-)
maakmodus 100644 b.tekst
maakmodus 100644 c.tekst
maakmodus 100644 d.tekst
Als u de geschiedenis controleert, ziet u:
$ git log --oneline9ee88eb C3: d . toevoegen.tekst
c72b92c C2: C . toevoegen.tekst
2e4039e C1: b . toevoegen.tekst
08076fb C0: Een . toevoegen.tekst
Dus alle commits van de features branch zitten nu in de master branch. Als je doorgaat met het maken van wijzigingen aan de master, is er geen manier om te weten wanneer de features branch erin is samengevoegd.
Sectie 3: Zonder Fast Forwarding
Herhaal sectie 1 voor een nieuwe map.
Probeer vervolgens een samenvoeging zonder vooruitspoelen:
$ git checkout master$ git merge --no-ff functie
Het zal het volgende openen in de standaard teksteditor van je git:
Branch 'functies' samenvoegen# Voer een commit-bericht in om uit te leggen waarom deze samenvoeging nodig is,
# vooral als het een bijgewerkte upstream samenvoegt in een topic branch.
#
# Regels die beginnen met '#' worden genegeerd en een leeg bericht wordt afgebroken
# de commit.
Pas de opmerkingen aan. In dit geval kun je gewoon "C4:" toevoegen voor "Vertakking samenvoegen 'functies'". De uitvoer zou er als volgt uit moeten zien:
Samenvoeging gemaakt door de 'recursieve' strategie.b.txt | 0
c.txt | 0
d.txt | 0
3 bestanden gewijzigd, 0 invoegingen (+), 0 verwijderingen (-)
maakmodus 100644 b.tekst
maakmodus 100644 c.tekst
maakmodus 100644 d.tekst
Als u nu de geschiedenis controleert, zou deze er als volgt uit moeten zien:
$ git log --onelinee071527 C4: Tak 'functies' samenvoegen
bb79c25 C3: d . toevoegen.tekst
692bd8c C2: c . toevoegen.tekst
a0df62a C1: b . toevoegen.tekst
7575971 C0: toevoegen van a.tekst
Je kunt zien dat, ook al heb je exact dezelfde wijzigingen, deze versie van merge de extra C4 commit heeft, wat het samenvoegen van features in de master aangeeft.
Conclusie
De git merge no-ff vlag helpt een beter leesbare geschiedenis te creëren. Hiermee kunt u tags plaatsen die duidelijk laten zien waar de samenvoegingen hebben plaatsgevonden. Het kan u tijd en moeite besparen tijdens het debuggen.
Verdere studie:
- https://git-scm.com/docs/git-merge
Referenties:
- Stack Overflow: wat-is-het-verschil-tussen-git-merge-en-git-merge-no-ff
- https://www.atlassian.com/git/tutorials/using-branches/git-merge