Git

Hur Squash Git begår

Hur Squash Git begår

Hur man squashar sig i Git för att hålla din historia ren

När du arbetar med Git är det en bra idé att begå dig ofta, så att du alltid kan gå tillbaka till kodens tillstånd om du förstör. Det är dock inte alltid en bra idé att utföra alla dessa mini-ändringar i huvudgrenen. Det gör historien rörig och svår att följa.

Git ger ett sätt att squasha en massa av dina åtaganden med kommandot rebase. När du lokalt har gjort dina ändringar i en viss fil eller för en viss funktion kan du alltid använda squashmetoden för att kombinera ändringarna innan du förbinder dig till huvudgrenen. Detta hjälper andra att förstå dina förändringar bättre.

Varning: Även om du kan dra från externa förvar och squashförpliktelser tillsammans, är det en dålig idé. Det kan skapa konflikter och förvirring. Undvik att ändra historik som redan är offentlig. Håll dig bara till squashing-åtaganden som är lokala för ditt arbete.

Låt oss arbeta igenom ett exempel.

Anta att vi har två filer a.py och b.py. Låt oss först gå igenom processen att skapa filer och göra ändringarna:

$ mkdir myproject
$ cd myproject /
$ git init
$ echo "print (" hej A ")"> a.py
$ git add -A && git commit -m "Lagt till en.py "
$ echo "print (" hej B ")"> b.py
$ git add -A && git commit -m "Lagt till b.py "
$ echo "print (" hej BB ")"> b.py
$ git add -A && git commit -m "b.py Modification 1 "
$ echo "print (" hej BBB ")"> b.py
$ git add -A && git commit -m "b.py Modification 2 "

Om vi ​​kontrollerar historiken för åtaganden ser vi följande:

$ git log --oneline --graph --decorate
* dfc0295 (HEAD -> master) b.py Ändring 2
* ce9e582 b.ändring 1
* 7a62538 Tillagd b.py
* 952244a Tillagt a.py

När vi är färdiga med vårt arbete bestämmer vi oss för att lägga till alla ändringar i b.py till ett enda åtagande för tydlighet. Vi räknar med att det finns 3 åtaganden på b.py från HEAD. Vi utfärdar följande kommando:

git rebase -i HEAD ~ 3

Alternativet -i säger till Git att använda det interaktiva läget.

Det ska dyka upp ett fönster i din Git-textredigerare:

plocka 7a62538 Tillagd b.py
välj ce9e582 b.ändring 1
välj dfc0295 b.py Ändring 2
 
# Rebase 952244a ... dfc0295 till 952244a (3 kommando)
#
# Kommandon:
# p, pick = use commit
# r, reword = använd commit, men redigera commit-meddelandet
# e, edit = use commit, men sluta för ändring
# s, squash = använd commit, men smälta in i tidigare commit
# f, fixup = som "squash", men kasta detta engagements loggmeddelande
# x, exec = kör kommando (resten av raden) med shell
#
# Dessa rader kan beställas om; de utförs från topp till botten.
#
# Om du tar bort en rad här KOMMER ÅTAGANDEN TAPT.
#
# Om du tar bort allt kommer dock rebasen att avbrytas.
#
# Observera att tomma åtaganden kommenteras
~

Åtagandena listas kronologiskt på toppen från det tidigaste till det senaste. Du kan välja vilket åtagande du ska "plocka" och vilka som åtar sig att squasha. För enkelhetens skull väljer vi det första åtagandet och klämmer resten i det. Så vi kommer att ändra texten så här:

plocka 7a62538 Tillagd b.py
squash ce9e582 b.ändring 1
squash dfc0295 b.py Ändring 2
 
# Rebase 952244a ... dfc0295 på 952244a (3 kommando)
#
# Kommandon:
# p, pick = use commit
# r, reword = använd commit, men redigera commit-meddelandet
# e, edit = use commit, men sluta för ändring
# s, squash = använd commit, men smälta in i tidigare commit
# f, fixup = som "squash", men kasta detta engagements loggmeddelande
# x, exec = kör kommando (resten av raden) med shell
#
# Dessa rader kan beställas om; de utförs från topp till botten.
#
# Om du tar bort en rad här KOMMER ÅTAGANDEN TAPT.
#
# Om du tar bort allt kommer dock rebasen att avbrytas.
#
# Observera att tomma åtaganden kommenteras

Så snart du sparar och stänger textfilen ska ett annat textfönster dyka upp som ser ut så här:

# Detta är en kombination av tre åtaganden.
# Det första engagemangets meddelande är:
Tillagt b.py
 
# Detta är det andra meddelandet:
 
b.py Ändring 1
 
# Detta är det tredje meddelandet:
 
b.py Ändring 2
 
# Ange engagemangsmeddelandet för dina ändringar. Linjer börjar
# med '#' ignoreras och ett tomt meddelande avbryter åtagandet.
#
# Datum: fre 30 mars 21:09:43 2018 -0700
#
# rebase pågår; till 952244a
# Du redigerar för närvarande ett åtagande när du omarbetar filialens "master" på "952244a".
#
# Ändringar som ska göras:
# Ny fil: b.py
#

Spara och stäng den här filen också. Du borde se något så här:

$ git rebase -i HEAD ~ 3
[fristående HEAD 0798991] Tillagt b.py
Datum: Fre Mar 30 21:09:43 2018 -0700
1 fil ändrad, 1 infogning (+)
skapa läge 100644 b.py
Omarbetade och uppdaterade ref / head / master.

Om du kontrollerar åtagandeshistoriken nu:

$ git log --oneline --graph --decorate
* 0798991 (HEAD -> master) Tillagt b.py
* 952244a Tillagt a.py

Alla åtaganden för b.py har blivit klämd i ett åtagande. Du kan verifiera genom att titta på b.py-fil:

$ katt b.py
tryck ("hej BBB")

Den har innehållet i modifiering 2.

Slutsats

Rebasen är ett kraftfullt kommando. Det kan hjälpa dig att hålla din historia ren. Men undvik att använda den för redan offentliga åtaganden eftersom det kan orsaka konflikter och förvirring. Använd den bara för ditt eget lokala arkiv.

Ytterligare studier:

Bästa Gamepad Mapping Apps för Linux
Om du gillar att spela spel på Linux med en gamepad istället för ett typiskt tangentbord och musinmatningssystem, finns det några användbara appar för...
Användbara verktyg för Linux-spelare
Om du gillar att spela spel på Linux är chansen att du kan ha använt appar och verktyg som Wine, Lutris och OBS Studio för att förbättra spelupplevels...
HD Remastered Games för Linux som aldrig tidigare hade en Linux-version
Många spelutvecklare och utgivare kommer med HD-remaster av gamla spel för att förlänga livstiden för franchisen, snälla fans som begär kompatibilitet...