Hvordan du squash git forplikter seg

Hvordan du squash git forplikter seg

Hvordan du squash forplikter seg i git for å holde historien ren

Når du jobber med GIT, er det lurt å forplikte seg ofte, slik at du alltid kan gå tilbake til kodeens tilstand hvis du roter deg. Å begå alle disse miniendringene til hovedgrenen er imidlertid ikke alltid en god idé. Det gjør historien rotete og vanskelig å følge.

Git gir en måte å knuse en haug med forpliktelsene dine ved å bruke Rebase -kommandoen. Når du har gjort endringer i en bestemt fil eller for en bestemt funksjon, kan du alltid bruke squash -metoden for å kombinere endringene sammen før du forplikter deg til hovedgrenen. Dette vil hjelpe andre å forstå endringene dine bedre.

Advarsel: Selv om du kan trekke fra eksterne depoter og squash forplikter seg sammen, er det en dårlig idé. Det kan skape konflikter og forvirring. Unngå å endre historie som allerede er offentlig. Bare hold deg til å squashing som er lokale for arbeidet ditt.

La oss jobbe gjennom et eksempel på saken.

Anta at vi har to filer a.py og b.py. La oss først gå gjennom prosessen med å lage filene og gjøre endringene:

$ MKDIR MyProject
$ CD MyProject/
$ git init
$ ekko "print (" hallo a ")"> a.py
$ git add -a && git commit -m "la til en.py "
$ ekko "print (" hallo b ")"> b.py
$ git add -a && git commit -m "lagt til b.py "
$ ECHO "Print (" Hello BB ")"> B.py
$ git add -a && git commit -m "b.py modifikasjon 1 "
$ ECHO "Print (" Hello BBB ")"> B.py
$ git add -a && git commit -m "b.py modifikasjon 2 "

Hvis vi sjekker historien til forpliktelser, vil vi se følgende:

$ git log --oneline -graph - -decorate
* DFC0295 (Head -> Master) B.PY Modification 2
* CE9E582 b.PY Modification 1
* 7A62538 lagt til b.py
* 952244a la til en.py

Etter at vi er ferdige med arbeidet vårt, bestemmer vi oss for å legge alle endringene i B.py til en enkelt forpliktelse for klarhet. Vi regner at det er 3 forpliktelser på B.py fra hodet. Vi utsteder følgende kommando:

git rebase -i head ~ 3

Alternativet -i ber Git bruke den interaktive modusen.

Det skal dukke opp et vindu på Git Text Editor:

Velg 7A62538 Lagt til B.py
plukk CE9E582 b.PY Modification 1
Velg DFC0295 b.PY Modification 2
# Rebase 952244a ... DFC0295 på 952244a (3 kommando (er))
#
# Kommandoer:
# P, Pick = Bruk forpliktelse
# R, Reword = Bruk forpliktelse, men rediger forpliktelsesmeldingen
# e, rediger = bruk forpliktelse, men stopp for endring
# s, squash = bruk forpliktelse, men smelte sammen til tidligere forpliktelse
# F, Fixup = som "Squash", men kast denne forpliktelsesloggmeldingen
# x, exec = run command (resten av linjen) ved hjelp av shell
#
# Disse linjene kan bestilles på nytt; De blir henrettet fra topp til bunn.
#
# Hvis du fjerner en linje her som forplikter seg vil gå tapt.
#
# Imidlertid, hvis du fjerner alt, vil rebasen bli abortert.
#
# Merk at tomme forpliktelser blir kommentert
~

Forpliktelsene er oppført kronologisk på toppen fra de tidligste til de siste. Du kan velge hvilken forpliktelse til å "velge" og som forplikter seg til å squash. For enkelhets skyld vil vi velge den første forpliktelsen og klemme resten inn i den. Så vi vil endre teksten slik:

Velg 7A62538 Lagt til B.py
squash ce9e582 b.PY Modification 1
Squash DFC0295 b.PY Modification 2
# Rebase 952244a ... DFC0295 på 952244a (3 kommando (er))
#
# Kommandoer:
# P, Pick = Bruk forpliktelse
# R, Reword = Bruk forpliktelse, men rediger forpliktelsesmeldingen
# e, rediger = bruk forpliktelse, men stopp for endring
# s, squash = bruk forpliktelse, men smelte sammen til tidligere forpliktelse
# F, Fixup = som "Squash", men kast denne forpliktelsesloggmeldingen
# x, exec = run command (resten av linjen) ved hjelp av shell
#
# Disse linjene kan bestilles på nytt; De blir henrettet fra topp til bunn.
#
# Hvis du fjerner en linje her som forplikter seg vil gå tapt.
#
# Imidlertid, hvis du fjerner alt, vil rebasen bli abortert.
#
# Merk at tomme forpliktelser blir kommentert

Så snart du lagrer og lukker tekstfilen, skal et annet tekstvindu dukke opp som ser slik ut:

# Dette er en kombinasjon av 3 forpliktelser.
# Den første forpliktelsesmeldingen er:
Lagt til b.py
# Dette er den andre forpliktelsesmeldingen:
b.PY Modification 1
# Dette er den tredje forpliktelsesmeldingen:
b.PY Modification 2
# Vennligst skriv inn forpliktelsesmeldingen for endringene dine. Linjer som starter
# med '#' vil bli ignorert, og en tom melding aborterer forpliktelsen.
#
# Dato: fre 30. mars 21:09:43 2018 -0700
#
# rebase pågår; på 952244a
# Du redigerer for øyeblikket en forpliktelse mens du rebaserer filialen 'Master' på '952244A'.
#
# Endringer som skal forpliktet:
# Ny fil: B.py
#

Lagre og lukk denne filen også. Du burde se noe slikt:

$ git rebase -i head ~ 3
[frittliggende hode 0798991] Lagt til B.py
Dato: fre 30. mars 21:09:43 2018 -0700
1 Fil endret, 1 innsetting (+)
Opprett modus 100644 B.py
Vellykket rebaserte og oppdaterte refs/hoder/master.

Hvis du sjekker forpliktelseshistorikken nå:

$ git log --oneline -graph - -decorate
* 0798991 (head -> master) lagt til b.py
* 952244a la til en.py

Alle forpliktelsene for B.Py har blitt klemt inn i en forpliktelse. Du kan bekrefte ved å se på B.PY -fil:

$ katt b.py
trykk ("Hei BBB")

Den har innholdet av modifisering 2.

Konklusjon

Rebasen er en kraftig kommando. Det kan hjelpe deg med å holde historien ren. Men unngå å bruke det for allerede offentlige forpliktelser, da det kan forårsake konflikter og forvirring. Bruk den bare til ditt eget lokale depot.

Videre studier:

  • https: // git-cm.com/docs/git-rebase
  • https: // git-cm.com/bok/en/v2/git-forgrenings-rebasing
  • https: // git-cm.com/bok/en/v2/git-tools-rewriting-historie