Förstå Git Merge no-ff-alternativ
Den enkla sammanslagningsförmågan hos git är en av dess styrkor. Under en sammanslagning använder git snabbspolning när den märker att HEAD för den aktuella grenen är en förfader till det engagemang du försöker slå samman. I en snabbspolning går det inte att göra något nytt. Git flyttar bara pekaren. Om detta beteende inte är önskvärt kan du använda no-ff-flaggan för att skapa ett nytt engagemang för sammanslagningen.
Hur Merge ser ut med och utan snabbspolning
Efter en snabbspolning kommer din git-historik att se ut så här:
C0 -> C1 -> C2-> C3
För samma antal åtaganden är här en sammanfogningshistorik utan snabbspolning:
I det första fallet finns det inget som tyder på att det har skett någon förgrening. I det andra fallet visar historiken ett C4-åtagande för att ange var sammanslagningen skedde.
Gå igenom ett exempel
Du skapar ett git-arkiv, skapar en gren och försöker sedan sammanslagningarna med och utan snabbspolning framåt.
Avsnitt 1: Installation
Först kan du skapa git-arkivet med följande steg:
$ mkdir my_project$ cd my_project
$ git init
$ touch a.Text
$ git add -A
$ git commit -m "C0: Lägga till en.Text"
Låt oss nu skapa en gren som heter funktioner och begå några ändringar:
$ git filialfunktioner$ git kassafunktioner
$ touch b.Text
$ git add -A
$ git commit -m "C1: Lägga till b.Text"
$ touch c.Text
$ git add -A
$ git commit -m "C2: Lägga till c.Text"
$ touch d.Text
$ git add -A
$ git commit -m "C3: Lägga till d.Text"
Avsnitt 2: Sammanfoga med snabbspolning
Låt oss gå tillbaka till huvudgrenen och slå samman funktioner gren till den:
$ git checkout master$ git merge-funktioner
Produktion:
Uppdaterar 08076fb ... 9ee88ebSnabbspola
b.txt | 0
c.txt | 0
d.txt | 0
3 filer har ändrats, 0 infogningar (+), 0 raderingar (-)
skapa läge 100644 b.Text
skapa läge 100644 c.Text
skapa läge 100644 d.Text
Om du kontrollerar historiken ser du:
$ git log - online9ee88eb C3: Lägga till d.Text
c72b92c C2: Lägga till c.Text
2e4039e C1: Lägga till b.Text
08076fb C0: Lägga till en.Text
Så alla åtaganden från funktionsgrenen finns nu i huvudgrenen. Om du fortsätter att göra ändringar i master finns det inget sätt att veta när funktionsgrenen slogs samman i den.
Avsnitt 3: Utan snabbspolning
Upprepa avsnitt 1 för en ny mapp.
Testa sedan en sammanslagning utan snabbspolning:
$ git checkout master$ git merge - no-ff-funktion
Det öppnar följande i din gits standardtextredigerare:
Slå samman filialens funktioner# Ange ett engagemangsmeddelande för att förklara varför denna sammanslagning är nödvändig,
# särskilt om det slår samman en uppdaterad uppströms till en ämnesgren.
#
# Rader som börjar med '#' ignoreras och ett tomt meddelande avbryts
# förpliktelsen.
Ändra kommentarerna. I det här fallet kan du bara lägga till "C4:" innan "Slå samman filialfunktioner" ". Utgången ska se ut så här:
Sammanfogning görs med den "rekursiva" strategin.b.txt | 0
c.txt | 0
d.txt | 0
3 filer har ändrats, 0 infogningar (+), 0 raderingar (-)
skapa läge 100644 b.Text
skapa läge 100644 c.Text
skapa läge 100644 d.Text
Om du kontrollerar historiken ska det nu se ut som följande:
$ git log - onlinee071527 C4: Slå samman filialens funktioner
bb79c25 C3: Lägga till d.Text
692bd8c C2: Lägga till c.Text
a0df62a C1: Lägga till b.Text
7575971 C0: Lägga till en.Text
Du kan se att även om du har exakt samma ändringar, har den här versionen av merge extra C4-engagemang som betyder sammanslagning av funktioner gren till master.
Slutsats
Git merge no-ff-flaggan hjälper till att skapa en mer läsbar historia. Det låter dig sätta taggar som tydligt visar var sammanslagningarna skedde. Det kan spara tid och ansträngning under felsökning.
Ytterligare studier:
- https: // git-scm.com / docs / git-merge
Referenser:
- Stack Overflow: vad-är-skillnaden-mellan-git-merge-och-git-merge-no-ff
- https: // www.atlasiska.com / git / tutorials / using-branches / git-merge