Git Squash megmagyarázva

Mi az a Git Squash?

Az egyik dolog, amit a fejlesztők elég gyakran hallanak a lekérési kérelmeik kapcsán, valami ilyesmi: „Ez nekem jól néz ki, kérlek, összezárd és egyesítsd”. A szórakoztató rész az, hogy nincs ilyen parancs, mint git squash(hacsak nem hoz létre álnevet hozzá).

A squashkérés előhívása azt jelenti, hogy a kérelemben szereplő összes elkötelezettséget egybe (ritkán más számba) tömörítik, hogy tömörebb, olvashatóbb legyen, és ne szennyezzék a főág történetét. Ennek eléréséhez a fejlesztőnek a Git Rebase parancs interaktív módját kell használnia .

Elég gyakran, amikor valami új funkciót fejlesztesz ki, több időszakos elkötelezettséggel jársz a történelmed során - végül is fokozatosan fejlődsz. Ez csak néhány elírási hiba vagy lépés lehet a végső megoldáshoz. Legtöbbször nincs haszna annak, ha mindezek a kód végső nyilvános verziójában szerepelnek, ezért előnyösebb, ha mindegyiket egy, egy és egy végső változatba tömörítik.

Tehát tegyük fel, hogy a következő lekérdezési naplóval rendelkezik abban az ágban, amelyet egyesíteni kíván a pull kérelem részeként:

$ git log --pretty=oneline --abbrev-commit 30374054 Add Jupyter Notebook stub to Data Science Tools 8490f5fc Minor formatting and Punctuation changes 3233cb21 Prototype for Notebook page

Nyilvánvaló, hogy inkább csak egy elkötelezettséget vállalnánk itt, mivel semmi haszna nincs annak tudatában, hogy mit kezdtünk az írással, és melyik hibákat javítottuk ki később. Csak a végeredmény a fontos.

Tehát azt tesszük, hogy egy interaktív újraindítási munkamenetet indítunk a jelenlegi HEAD-ből ( 30374054 kötelezettségvállalás ) a 3233cb21 végrehajtására azzal a szándékkal, hogy a 3 legújabb elkötelezettséget egybe egyesítsük :

$ git rebase -i HEAD~3

Ez megnyit egy szerkesztőt az alábbiakkal:

pick 3233cb21 Prototype for Notebook page pick 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools # Rebase # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Mint mindig, a Git is nagyon kedves segítségüzenetet küld nekünk, ahol láthatja a kívánt squashlehetőséget.

Jelenleg az interaktív újraindításra vonatkozó utasítások pickminden megadott elkötelezettségre szólnak, és megőrzik a megfelelő elkötelező üzenetet. Vagyis - ne változtasson semmit. De azt akarjuk, hogy végül csak egy elkötelezettség legyen.

Tehát egyszerűen szerkesztheti a szöveget akkor szerkesztő helyett pickaz squash(vagy csak s) a következő yo minden követ el akarunk megszabadulni, és mentse / kilépés a szerkesztő. Ez így nézhet ki:

s 3233cb21 Prototype for Notebook page s 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools

Amikor bezárja a szerkesztőt a változás mentése után, az azonnal újra megnyílik, és javasolja, hogy válassza ki és írja át ezeket a végrehajtási üzeneteket. Valami ilyesmi:

# This is a combination of 3 commits. # The first commit's message is: Prototype for Notebook page # This is the 2nd commit message: Minor formatting and Punctuation changes # This is the 3rd commit message: Add Jupyter Notebook to Data Science Tools # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.

Ezen a ponton törölheti az összes olyan üzenetet, amelyet nem szeretne felvenni a végleges véglegesítési verzióba. Átfogalmazhatja őket, vagy csak a nulláról írhat végrehajtási üzenetet.

Ne felejtsük el, hogy az új verzió minden sort tartalmaz, amelyek nem a #karakterrel kezdődnek . Még egyszer mentse el és lépjen ki a szerkesztőből.

A terminálnak most egy sikeres üzenetet kell tartalmaznia Successfully rebased and updated , a git naplónak pedig egy szép és tömörített előzményt kell tartalmaznia, csak egy elkötelezettséggel. Minden közvetítői kötelezettségvállalás eltűnt, és készen állunk az egyesítésre!

Figyelmeztetés a helyi és távoli elkötelezettség előzményeinek eltéréseiről

Ez a művelet kissé veszélyes, ha fiókját már közzétette egy távoli adattárban - végül is módosítja a végrehajtási előzményeket. Tehát a legjobb, ha a squash műveletet egy helyi fióktelepen hajtja végre, mielőtt megtolja .

Néha már nyomni is fogják - hogyan hozna létre egy pull kérést? Ebben az esetben a módosításokat a távoli ágra kell kényszerítenie, miután elvégezte a tökötést, mivel a távoli adattár helyi és fióktörténete eltér egymástól:

$ git push origin +my-branch-name

Tegyen meg mindent annak érdekében, hogy megbizonyosodjon róla, hogy egyedül Ön használja ezt a távoli elágazást, különben megnehezíti a másik fejlesztő életét, ha a történelem nem felel meg egymásnak. De mivel a tökötést általában egy ág végső műveleteként hajtják végre, mielőtt megszabadulna tőle, általában nem olyan nagy a gond.