Git's lette fusionsevne er en af dens styrker. Under en fletning bruger git fast-forward fletning, når den bemærker, at HEAD'en for den aktuelle gren er en forfader til den forpligtelse, du forsøger at flette. I en hurtigt fremadgående fusion er der ingen ny forpligtelse. Git flytter bare markøren. Hvis denne adfærd ikke er ønskelig, kan du bruge no-ff-flag til at oprette en ny forpligtelse til fusionen.
Hvordan fletning ser ud med og uden hurtigt fremad
Efter en hurtig fremspoling vil din git-historie se sådan ud:
C0 -> C1 -> C2—> C3
For det samme antal forpligtelser er her en fletningshistorik uden hurtig fremspoling:
I det første tilfælde er der ingen indikation af, at der var nogen forgrening. I det andet tilfælde viser historien en C4 -forpligtelse for at angive, hvor fusionen fandt sted.
Gå gennem et eksempel
Du opretter et git-lager, opretter en gren og derefter prøver at fusionere med og uden hurtig fremspoling.
Afsnit 1: Opsætning
Først kan du oprette git -depotet med følgende trin:
$ mkdir mit_projekt$ cd mit_projekt
$ git init
$ touch a.txt
$ git tilføj -A
$ git commit -m 'C0: Tilføjelse af a.txt'
Lad os nu oprette en gren kaldet funktioner og foretage et par ændringer:
$ git filialfunktioner$ git checkout -funktioner
$ touch b.txt
$ git tilføj -A
$ git commit -m 'C1: Tilføjelse af b.txt'
$ touch c.txt
$ git tilføj -A
$ git commit -m 'C2: Tilføjelse af c.txt'
$ touch d.txt
$ git tilføj -A
$ git commit -m 'C3: Tilføjelse af d.txt'
Sektion 2: Flet med hurtig videresendelse
Lad os gå tilbage til hovedgrenen og flette funktioner forgrenes til den:
$git checkoutmestre$git fusionfunktioner
Produktion:
Opdaterer 08076fb..9ee88ebSpol frem
b.txt | 0
c.txt | 0
d.txt | 0
3 filer ændret, 0 indsættelser (+), 0 sletninger (-)
Opret tilstand 100644 b.txt
Opret tilstand 100644 c.txt
Opret tilstand 100644 d.txt
Hvis du tjekker historikken, ser du:
$ git log -online9ee88eb C3: Tilføjelse af d.txt
c72b92c C2: Tilføjelse af c.txt
2e4039e C1: Tilføjelse af b.txt
08076fb C0: Tilføjelse af a.txt
Så alle forpligtelser fra funktioner gren er i master gren nu. Hvis du fortsætter med at foretage ændringer til master, er der ingen måde at vide, hvornår funktionsgrenen blev flettet ind i den.
Afsnit 3: Uden hurtig videresendelse
Gentag afsnit 1 for en ny mappe.
Prøv derefter en fletning uden at videresende hurtigt:
$git checkoutmestre$git fusion --no-fffunktion
Det åbner følgende i din gits standardteksteditor:
Flet gren'funktioner'# Indtast venligst en forpligtelsesmeddelelse for at forklare, hvorfor denne fletning er nødvendig,
# især hvis det fusionerer en opdateret opstrøms til en emnegren.
#
# Linjer der starter med '#' ignoreres, og en tom besked afbrydes
# forpligtelsen.
Rediger kommentarerne. I dette tilfælde kan du bare tilføje C4: før Flet filial 'funktioner'. Outputtet skal se sådan ud:
Fletning foretaget af den 'rekursive' strategi.b.txt | 0
c.txt | 0
d.txt | 0
3 filer ændret, 0 indsættelser (+), 0 sletninger (-)
Opret tilstand 100644 b.txt
Opret tilstand 100644 c.txt
Opret tilstand 100644 d.txt
Hvis du nu tjekker historikken, skal den ligne følgende:
$ git log -onlinee071527 C4: Flet filial 'funktioner'
bb79c25 C3: Tilføjelse af d.txt
692bd8c C2: Tilføjelse af c.txt
a0df62a C1: Tilføjelse af b.txt
7575971 C0: Tilføjelse af a.txt
Du kan se, at selvom du har nøjagtig de samme ændringer, har denne version af fletning den ekstra C4 -forpligtelse, der betyder, at sammensmeltning af funktioner forgrenes til master.
Konklusion
Git fusion no-ff flag hjælper med at skabe en mere læsbar historie. Det giver dig mulighed for at sætte tags, der tydeligt viser, hvor fusionerne fandt sted. Det kan spare dig tid og kræfter under fejlfinding.