Hogyan (és miért!) Hogyan lehet tiszta Git-elkötelezettség-előzményeket tartani

A vállalások a Git-adattár egyik kulcsfontosságú része, és még inkább: a Végleges üzenet egy életnapló a lerakat számára. Ahogy a projekt / adattár az idők folyamán fejlődik (új funkciók kerülnek fel, javításra kerülnek a hibák, az architektúra átalakításra kerül), az elkötelezett üzenetek azok a helyek, ahol láthatja, hogy mi és hogyan változott. Ezért fontos, hogy ezek az üzenetek rövid, pontos módon tükrözzék az alapul szolgáló változást.

Miért fontos az értelmes Git-elkötelezettség előzménye

Mit csinál a Git-elkötelezettség? azok az ujjlenyomatok, amelyeket a megérintett kódon hagy. Minden olyan kód, amelyet ma követ el, egy év múlva, amikor ugyanazt a változást nézi; hálás lenne egy egyértelmű, értelmes elkötelezettségért, amelyet írt, és ez is könnyebbé teszik a fejlesztőtársaitok életét. Ha az elkötelezettségeket a kontextus alapján izoláljuk, akkor egy bizonyos elkötelezettség által bevezetett hiba gyorsabban megtalálható, és annál könnyebb visszavonni a hibát okozó elkötelezettséget.

Egy nagy projekten dolgozva gyakran sok mozgó alkatrésszel foglalkozunk, amelyeket frissítenek, hozzáadnak vagy eltávolítanak. Ilyen esetekben a végrehajtási üzenetek karbantartásának biztosítása bonyolult lehet, különösen, ha a fejlesztés napokon át tart, hetek vagy akár hónapok. Tehát a concis fenntartásának egyszerűsítése érdekében Az elkötelezett előzmények alapján ez a cikk néhány gyakori helyzetet használ fel, amelyekkel a fejlesztők szembesülhetnek egy Git-adattáron való munka közben.

  • 1. helyzet: Meg kell változtatnom a legutóbbi elkötelezettséget
  • 2. szituáció: Meg kell változtatnom egy adott elkötelezettséget
  • 3. szituáció: hozzá kell adnom, el kell távolítanom vagy kombinálnom kell a kötelezettségvállalásokat
  • 4. szituáció: Az elkötelezettségem előzményei nem történnek értelemben újrakezdésre van szükségem!

De mielőtt belemerülnénk, nézzük át gyorsan, hogy néz ki egy tipikus fejlesztési munkafolyamat egy hipotetikus Ruby alkalmazásunkban.

Megjegyzés: Ez a cikk feltételezi, hogy tisztában van a Git alapjaival, az ágak működésével, az ág nem kötelező változásainak hozzáadásával az egyes szakaszokhoz és a változtatások végrehajtásával. Ha bizonytalan ezekben az áramlásokban, akkor dokumentációnk remek kiindulópont.

Egy nap az életben

Itt egy kis Ruby on Rails projekten dolgozunk, ahol hozzá kell adnia egy navigációs nézetet a kezdőlapon, amely több fájl frissítését és hozzáadását foglalja magában. Az alábbiakban részletesen bemutatjuk a teljes folyamatot:

  • Egy fájl frissítésével kezd el dolgozni egy funkción. ; hívjuk “s” application_controller.rb
  • Ez a funkció megköveteli a nézet frissítését is: index.html.haml
  • Hozzáadott egy részecskét, amelyet az indexoldalon használnak: _navigation.html.haml
  • Az oldal stílusait is frissíteni kell, hogy tükrözzék a hozzáadott részeket: styles.css.scss
  • A funkció készen áll a kívánt változtatásokkal, ideje a tesztek frissítésére is; a frissítendő fájlok a következők:
    • application_controller_spec.rb
    • navigation_spec.rb
  • A tesztek a várakozásoknak megfelelően frissülnek és átmennek, itt az ideje, hogy elvégezzük a módosításokat!

Mivel az összes fájl az architektúra különböző területeihez tartozik, elkötelezzük magunkat az egymástól elkülönített változtatások annak biztosítása érdekében, hogy minden elkötelezettség egy bizonyos kontextust képviseljen és bizonyos sorrendben történjen. Általában a backend – > frontend sorrendet részesítem előnyben, ahol először a legtöbb háttér-központú változás történik, ezt követi a középső réteg, majd a Git-lista frontend-központú változásai következnek.

Most, hogy elvégeztük a változtatásokat, létrehozunk egy egyesítési kérelmet a fiókkal. Miután megnyitotta az egyesítési kérelmet, általában a társa ellenőrzi, mielőtt a változtatások egyesülnek a repo “s master ágba. Most megtudhatjuk, milyen különböző helyzetekbe kerülhetünk kódellenőrzés során.

1. helyzet: Meg kell változtatnom a legutóbbi elkötelezettséget

Képzeljünk el egy olyan esetet, amikor az ellenőr a styles.css.scss és változtatást javasolt. Ilyen esetben nagyon egyszerű elvégezni a változtatást, mivel a stíluslap módosításai az ág legutóbbi elkötelezettségének részét képezik. Itt tudjuk ezt kezelni;

  • Ön közvetlenül elvégzi a fiókban a styles.css.scss szükséges módosításait.
  • egyszer készen állsz a változtatásokkal, add hozzá ezeket a módosításokat a szakaszhoz; futtassa git add styles.css.scss.
  • Miután a változtatásokat végrehajtották, hozzá kell adnunk ezeket a változtatásokat az utolsó elkötelezettségünkhöz; futtassa a git commit --amend.
    • Parancsbontás: Itt arra kérjük a git commit parancsot, hogy módosítsa a jelen lévő változásokat. szakasz a legutóbbi elkötelezettségig.
  • Ezzel megnyílik az utolsó elkötelezettség a Git által definiált szövegszerkesztőben, amely a Stílus hozzáadása a navigációhoz elkötelező üzenetsel rendelkezik.
  • Mivel csak a CSS-nyilatkozatot frissítettük, nem kell megváltoztatnunk az elköteleződés üzenetét.Ezen a ponton egyszerűen elmentheti és kiléphet a Git által megnyitott szövegszerkesztőből, és a módosításai megjelennek az elkötelezettségben.

Mivel módosított egy meglévő elkötelezettséget, ezekre a változtatásokra szükség van. kényszeríteni kell a távoli repóba a git push --force-with-lease <remote_name> <branch_name> használatával. Ez a parancs felülírja a távoli repóban a kötelezettségvállalást Add styles for navigation a frissített elkötelezettséggel, amelyet a helyi repóban tettünk.

Egy dolgot érdemes szem előtt tartani, miközben erővel nyomja az ágakat. az az, hogy ha ugyanazon az ágon dolgozik több emberrel, akkor az erővel történő tolás problémát okozhat más felhasználóknak, amikor megpróbálják normálisan a változtatásokat egy távoli ágon nyomni, amelynek új erővel rendelkezik. Ezért használja ezt a funkciót okosan. Itt többet megtudhat a Git force push opciókról.

2. Helyzet: Meg kell változtatnom egy adott elkötelezettséget

Az előző helyzetben a javítás meglehetősen egyszerű volt, mivel módosítanunk kellett csak az utolsó Git-elkötelezettségünk van, de képzelje el, ha az áttekintő javasolna valamit megváltoztatni a _navigation.html.haml fájlban. Ebben az esetben ez a második elkötelezettség felülről, így annak megváltoztatása nem lesz olyan közvetlen, mint az első helyzetben. Lássuk, hogyan tudjuk ezt kezelni:

Valahányszor egy elkötelezettség ágban készült, egyedi SHA1 hash karakterlánc azonosítja. Gondoljon arra, mint egy egyedi azonosítóra, amely elválasztja az egyik elkötelezettséget a másiktól. A git log futtatásával megtekintheti az összes végrehajtást, valamint az SHA1 kivonatokat egy ágban. Ezzel egy kimenetet látna, amely kissé a következőképpen néz ki, ahol a legfrissebb végrehajtások vannak a tetején;

Itt jelenik meg a git rebase parancs. Amikor egy adott elkötelezettséget szeretnénk szerkeszteni a git rebase paranccsal, először újra kell alapoznunk az águnkat úgy, hogy a HEAD-et visszavezetjük a szerkeszteni kívánt elkötelezettség előtti pontra. Esetünkben meg kell változtatnunk az elkövetést, amely a következőt írja: Page Navigation View.

Itt vegye észre az elkötelezettség hashját, amely közvetlenül a módosítani kívánt elkötelezettség előtt áll; másolja a kivonatot, és hajtsa végre a következő lépéseket:

  • Újra futtassa az elágazást, hogy a célvállalás előtt elköteleződjön; futtat git rebase -i 8d74af102941aa0b51e1a35b8ad731284e4b5a20
    • Parancsbontás: Itt “Git” s rebase parancsot futtatunk interaktív módban, mellékelt SHA1 kivonattal mint elkötelezettség az újrabázisra.
  • Ez interaktív módban futtatja a Git újrabázis parancsát, és megnyitja a szövegszerkesztőt, amely megmutatja az összes olyan elkötelezettségét, amely az újrabázolt elkötelezettség után következett be. . Némileg így fog kinézni:

Figyelje meg, hogy az egyes elkötelezetteknek van-e szó pick előtte és az alábbi tartalomban minden lehetséges kulcsszó megtalálható. Mivel egy elkötelezettséget szeretnénk szerkeszteni, a pick 4155df1cdc7 Page Navigation View -et edit 4155df1cdc7 Page Navigation View -re kell változtatnunk. Mentse el a módosításokat, és lépjen ki a szerkesztőből.

Mostantól az ága az adott időpontig közvetlenül az elvégzett elkötelezettség előtt bázisra kerül, amely tartalmazta a _navigation.html.haml fájlt. Nyissa meg a fájlt, és hajtsa végre a kívánt változtatásokat az ellenőrzés visszajelzésének megfelelően. Miután végzett a változtatásokkal, állítsa be őket a git add _navigation.html.haml futtatásával.

Mivel a változtatásokat leállítottuk, itt az ideje a HEAD ágat visszahelyezni a elköteleznünk, amellyel eredetileg rendelkezünk (miközben a hozzáadott új változtatásokat is tartalmazza), futtasd a git rebase --continue parancsot, ez megnyitja az alapértelmezett szerkesztõt a terminálban, és megmutatja az újrabázis során szerkesztett elkötelezõ üzenetet; Page Navigation View. Ha akarja, megváltoztathatja ezt az üzenetet, de mi most hagyjuk, ahogy van, ezért mentse el és lépjen ki a szerkesztőből. Ekkor a Git visszajátssza az összes elkövetést ami az imént szerkesztett elkötelezettség után következett, és most a HEAD elágazás visszatért az eredetileg elért legfelsõbb elkötelezettséghez, és tartalmazza az egyik változtatáson végrehajtott új változtatásokat is.

Mivel ismét módosítottunk egy olyan kötelezettségvállalást, amely már jelen van a távoli repóban, erővel kell újra lenyomnunk ezt az elágazást a git push --force-with-lease <remote_name> <branch_name> segítségével.

3. helyzet : Hozzá kell adnom, el kell távolítanom vagy kombinálnom kell a végrehajtásokat

Gyakori helyzet, amikor több elkötelezettséget is végrehajtottál annak érdekében, hogy kijavítsd valamilyen korábban elkövetett dolgot. Most csökkentsük őket, amennyire csak tudjuk, kombinálva őket az eredeti elkötelezettségekkel.

Csak annyit kell tennie, hogy elkezdi az interaktív újraindítást, mint a többi esetben.

Most képzelje el, hogy ezeket a javításokat a c22a3fa0c5c Render navigation partial fájlokba kívánja egyesíteni. Csak a következőkre van szüksége:

  1. Vigye a javításokat felfelé úgy, hogy azok közvetlenül a véglegesítés alatt maradjanak.
  2. Módosítsa a pick értéket squash vagy fixup mindegyik javításhoz.

Megjegyzés: squash a leírásban tartja a végrehajtott üzeneteket. fixup elfelejti a javítások végrehajtási üzeneteit, és megőrzi az eredetit.

Valami ilyesmire fogsz jutni:

Mentsd el a módosításokat, lépj ki a szerkesztőből , és kész! Ez az eredmény:

Mint korábban, most is csak git push --force-with-lease <remote_name> <branch_name> és a módosítások fel vannak állítva.

Ha teljesen el akarja távolítani az elkötelezettséget az ágról, akkor a squash vagy a fixup, egyszerűen írja be a drop parancsot, vagy egyszerűen törölje azt a sort.

Kerülje az ütközéseket

Az ütközések elkerülése érdekében győződjön meg arról, hogy elkövette-e magát “az idővonalon felfelé haladva” ne érintse meg ugyanazokat a fájlokat, amelyeket az utánuk hagyott elkövetések érintenek.

Pro-tip : Gyors javítások

Ha pontosan tudod, melyik elkötelezettséget akarod javítani, akkor az elkövetéskor nem kell pazarolnod az agyi ciklusokat a „Fix 1”, „Fix 2”,…, jó ideiglenes nevekre gondolva, “Javítás 42”.

1. lépés: Találkozzon --fixup

Miután a változtatásokat javítás nélkül állította össze, bármi is javításra szorul, just Git hajtsa végre az összes ilyen módosítást:

(Ne feledje, hogy ez a kivonat az elkövetéshez c22a3fa0c5c Render navigation partial)

Ez létrehozza ezt az elkötelezett üzenetet: fixup! Render navigation partial.

2. lépés: És az oldalkick --autosquash

Könnyű interaktív újraindítás. Megadhatja, hogy git automatikusan elhelyezze a fixup eket a megfelelő helyre.

git rebase -i 4155df1cdc7 --autosquash

Az előzmények a következőképpen jelennek meg:

Készen áll, hogy csak áttekintés és folytatás.

Ha kalandosnak érzed magad, akkor megtehetsz egy nem interaktív újraindítást git rebase --autosquash, de csak akkor, ha szereted veszélyesen élni, ahogy ” nincs alkalmam áttekinteni az elkészített tököket, mielőtt újrakezdenék őket.

4. helyzet: A Git elkötelezettségem történetének nincs értelme, újrakezdésre van szükségem!

Ha “Egy nagy funkción dolgozva gyakran előfordul, hogy számos javítási és áttekintési-visszacsatolási változtatást hajtanak végre, amelyeket gyakran végrehajtanak. A fióktelep folyamatos újrabázolása helyett a vállalások megtisztítását a fejlesztés végéig hagyhatjuk.

Itt a patch fájlok létrehozása rendkívül hasznos. Valójában a patch fájlok voltak az elsődleges módszerek a kód megosztására e-mailben az együttműködés során nagy nyílt forráskódú projekteken, mielőtt a Git-alapú szolgáltatások, például a GitLab elérhetővé váltak a fejlesztők számára. Képzelje el, hogy van egy ilyen ága (pl; add-page-navigation), ahol rengeteg olyan elkötelezettség van, amelyek nem közvetítik egyértelműen a mögöttes változásokat. Itt hozhatunk létre javítófájlt az összes számára az ebben az ágban végrehajtott változtatások:

  • A javítófájl létrehozásának első lépése az, hogy megbizonyosodjon arról, hogy az ág minden változást tartalmaz-e a master elágazás, és nincs ütközése azzal.
  • Futtathatja az git rebase master vagy a git merge master futtatást, amíg újra be van jelölve. ki a add-page-navigation ágban, hogy a master összes változását átvihesse az ágra.
  • Most hozza létre a javítófájlt ; run git diff master add-page-navigation > ~/add_page_navigation.patch.
    • Parancsbontás: Itt a Git diff szolgáltatását használjuk, és a master elágazás és add-page-navigation elágazás, és a kimenet átirányítása (> szimbólum révén) egy bennünk er otthoni könyvtár (általában ~/ * nix operációs rendszerekben).
  • Bármely útvonalat megadhat, amelyet meg akar tartani a fájlban és a fájlnév és kiterjesztés bármi lehet.
  • Miután a parancs futtatásra került, és nem lát hibákat, a patch fájl jön létre.
  • Most fizessen master ág; futtassa git checkout master.
  • Törölje a add-page-navigation ágat a helyi repóból; futtatás git branch -D add-page-navigation. Ne feledje, hogy az ágnak már vannak változásai egy létrehozott javítófájlban.
  • Most hozzon létre egy új ágat ugyanazzal a névvel (miközben a master be van jelölve); futtassa git checkout -b add-page-navigation.
  • Ezen a ponton ez egy új ág, és nincsenek változtatásai.
  • Végül alkalmazza a javítás fájlból végrehajtott módosításaid; git apply ~/add_page_navigation.patch.
  • Itt az összes módosításod egy ágban lesz alkalmazva, és nem jelennek meg, mintha minden módosításod ahol elkészült, de a módosítások egyikét sem hajtották végre az ágban.
  • Mostantól folytathatja az egyes fájlokat vagy a hatásterület szerint csoportosított fájlokat a kívánt sorrendben, tömör véglegesítési üzenetekkel.

A korábbi helyzetekhez hasonlóan alapvetően az egész ágat módosítottuk, így itt az ideje a kényszerítésnek!

Következtetés

Bár a mindennapi munkafolyamat során felmerülő leggyakoribb és alapvető helyzeteket a Git-tel áttekintettük, a Git-előzmények átírása óriási téma, és ahogy megismered A fenti tippek alapján a témával kapcsolatos fejlettebb fogalmakat a Git hivatalos dokumentációjában ismerheti meg. Boldog git “!

Pan xiaozhen fotója az Unsplash

-en

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük