Git

Sådan squash Git forpligter sig

Sådan squash Git forpligter sig

Sådan squashes forpligtelser i Git for at holde din historie ren

Når du arbejder med Git, er det en god ide at forpligte sig ofte, så du kan altid gå tilbage til kodens tilstand, hvis du ødelægger. Imidlertid er det ikke altid en god idé at begå alle disse mini-ændringer til hovedgrenen. Det gør historien rodet og svær at følge.

Git giver en måde at squash en masse af dine forpligtelser ved hjælp af rebase-kommandoen. Når du har foretaget dine ændringer lokalt til en bestemt fil eller for en bestemt funktion, kan du altid bruge squashmetoden til at kombinere ændringerne sammen, før du forpligter dig til hovedgrenen. Dette vil hjælpe andre med at forstå dine ændringer bedre.

Advarsel: Selvom du kan trække fra eksterne opbevaringssteder og squash-forpligtelser sammen, er det en dårlig idé. Det kan skabe konflikter og forvirring. Undgå at ændre historie, der allerede er offentlig. Hold dig kun til squashing-forpligtelser, der er lokale for dit arbejde.

Lad os arbejde igennem et eksempel.

Antag, vi har to filer a.py og b.py. Lad os først gennemgå processen med at oprette filerne og foretage ændringer:

$ mkdir mit projekt
$ cd myproject /
$ git init
$ echo "print (" hej A ")"> a.py
$ git add -A && git commit -m "Tilføjet en.py "
$ echo "print (" hej B ")"> b.py
$ git add -A && git commit -m "Tilføjet b.py "
$ echo "print (" hej BB ")"> b.py
$ git add -A && git commit -m "b.py Ændring 1 "
$ echo "print (" hej BBB ")"> b.py
$ git add -A && git commit -m "b.py Modifikation 2 "

Hvis vi kontrollerer historien om forpligtelser, ser vi følgende:

$ git log --oneline --graph --decorate
* dfc0295 (HEAD -> master) b.py Ændring 2
* ce9e582 b.py Ændring 1
* 7a62538 Tilføjet b.py
* 952244a Tilføjet a.py

Når vi er færdige med vores arbejde, beslutter vi at sætte alle ændringer i b.py i en enkelt forpligtelse for klarhed. Vi regner med, at der er 3 forpligtelser på b.py fra HEAD. Vi udsteder følgende kommando:

git rebase -i HEAD ~ 3

Indstillingen -i fortæller Git at bruge den interaktive tilstand.

Det skal dukke op i et vindue på din Git-teksteditor:

pick 7a62538 Tilføjet b.py
vælg ce9e582 b.py Ændring 1
vælg dfc0295 b.py Ændring 2
 
# Rebase 952244a… dfc0295 på 952244a (3 kommando (r))
#
# Kommandoer:
# p, pick = use commit
# r, reword = brug commit, men rediger commit-meddelelsen
# e, rediger = brug commit, men stop for ændring
# s, squash = brug commit, men meld til tidligere commit
# f, fixup = ligesom "squash", men kassér denne forpligtelses logmeddelelse
# x, exec = run-kommando (resten af ​​linjen) ved hjælp af shell
#
# Disse linjer kan bestilles igen; de udføres fra top til bund.
#
# Hvis du fjerner en linje her, BLIVER FORPLIGTELSEN.
#
# Hvis du imidlertid fjerner alt, afbrydes rebasen.
#
# Bemærk, at tomme forpligtelser kommenteres
~

Forpligtelserne er anført kronologisk øverst fra den tidligste til den nyeste. Du kan vælge, hvilken forpligtelse til at "vælge", og hvilken der forpligter sig til squash. For enkelheds skyld vælger vi den første forpligtelse og klemmer resten i den. Så vi vil ændre teksten sådan:

pick 7a62538 Tilføjet b.py
squash ce9e582 b.py Ændring 1
squash dfc0295 b.py Ændring 2
 
# Rebase 952244a… dfc0295 på 952244a (3 kommando (r))
#
# Kommandoer:
# p, pick = use commit
# r, reword = brug commit, men rediger commit-meddelelsen
# e, rediger = brug commit, men stop for ændring
# s, squash = brug commit, men meld til tidligere commit
# f, fixup = ligesom "squash", men kassér denne forpligtelses logmeddelelse
# x, exec = run-kommando (resten af ​​linjen) ved hjælp af shell
#
# Disse linjer kan bestilles igen; de udføres fra top til bund.
#
# Hvis du fjerner en linje her, BLIVER FORPLIGTELSEN.
#
# Hvis du imidlertid fjerner alt, afbrydes rebasen.
#
# Bemærk, at tomme forpligtelser kommenteres

Så snart du gemmer og lukker tekstfilen, skal der vises et andet tekstvindue, der ser sådan ud:

# Dette er en kombination af 3 forpligtelser.
# Den første forpligtelses besked er:
Tilføjet b.py
 
# Dette er den anden meddelelse om forpligtelse:
 
b.py Ændring 1
 
# Dette er den tredje forpligtelsesmeddelelse:
 
b.py Ændring 2
 
# Indtast venligst meddelelsesforpligtelsen for dine ændringer. Linjer starter
# med '#' ignoreres, og en tom besked afbryder forpligtelsen.
#
# Dato: Fre Mar 30 21:09:43 2018 -0700
#
# rebase i gang; på 952244a
# Du redigerer i øjeblikket en forpligtelse, mens du genbaserer gren 'master' på '952244a'.
#
# Ændringer, der skal begås:
# Ny fil: b.py
#

Gem og luk også denne fil. Du skulle se noget som dette:

$ git rebase -i HEAD ~ 3
[løsrevet HEAD 0798991] Tilføjet b.py
Dato: Fre Mar 30 21:09:43 2018 -0700
1 fil ændret, 1 indsættelse (+)
Opret tilstand 100644 b.py
Genbaseret og opdateret ref / head / master.

Hvis du tjekker forpligtelseshistorikken nu:

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

Alle forpligtelser for b.py er blevet presset sammen til en forpligtelse. Du kan bekræfte ved at se på b.py-fil:

$ kat b.py
print ("hej BBB")

Det har indholdet af ændring 2.

Konklusion

Rebasen er en stærk kommando. Det kan hjælpe dig med at holde din historie ren. Men undgå at bruge det til allerede offentlige forpligtelser, da det kan forårsage konflikter og forvirring. Brug det kun til dit eget lokale arkiv.

Yderligere studier:

Top 5 spiloptagelseskort
Vi har alle set og elsket streaming af gameplay på YouTube. PewDiePie, Jakesepticye og Markiplier er kun nogle af de bedste spillere, der har tjent mi...
Sådan udvikler du et spil på Linux
For et årti siden ville ikke mange Linux-brugere forudsige, at deres foretrukne operativsystem en dag ville være en populær spilplatform til kommercie...
Open Source-porte med kommercielle spilmotorer
Gratis, open source og cross-platform spilmotorgendringer kan bruges til at spille gamle såvel som nogle af de temmelig nylige spiltitler. Denne artik...