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 ~ 3Indstillingen -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.pyvæ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.pysquash 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.pyprint ("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:
- https: // git-scm.com / docs / git-rebase
- https: // git-scm.com / book / da / v2 / Git-Branching-Rebasing
- https: // git-scm.com / book / da / v2 / Git-Tools-Rewriting-History