A Git egy elosztott verziószabályozó rendszer - eszköz, amely nyomon követi a fájlkészletben végrehajtott változásokat vagy koordinálja a munkát az idő múlásával. A programozók gyakran használják a szoftver forráskódjainak változásainak koordinálására és a legjobb részre; felhasználható bármilyen tartalom nyomon követésére. Kifejezetten arra tervezték, hogy mindent kezeljen a kicsitől a nagyméretű projektekig, maximális sebességgel és hatékonysággal. Rendkívül rugalmas jelentése: az egyének közvetlenül megoszthatják munkájukat személyes adattáraik között, és a csoportok központi adattáron keresztül tudják koordinálni a munkafolyamatot. Ez egyszerűen lehetővé teszi két, különböző helyszínen ülő két fejlesztő számára, hogy függetlenül végezzen és rögzítsen változásokat, mindegyik központi adattár nélkül.
Az egyesülés a Gitben szokásos gyakorlat, amely a változások egyik ágaból a másikba történő integrálására szolgál. A Git egyesítése olyan parancs, amely változtatásokat hajt végre egy másik helyre. Ez lehetővé teszi a fejlesztőknek, hogy a Git ág által létrehozott független kódsorokat átvegyék és egyetlen ágakba integrálják. Ez csak megváltoztatja a célágot, amíg a forráság története megmarad. A Git rebase egy újabb parancs, amelyet alapvetően ugyanazon célra használnak, azzal a különbséggel, hogy egészen másképp teszi. Mindketten ugyanazt csinálják - egyesítik az elkötelezettségeket az egyik ágaból a másikba -, de a különbség abban rejlik, hogyan teszik. Kiemelünk néhány kulcsfontosságú megkülönböztető pontot, összehasonlítva a kettőt.
A Git egyesítése olyan parancs, amely két vagy több elkötelezett történeti ágot egyesít. Az egyesülés gyakran csak két ágot egyesít, bár a Git három, négy vagy több ág egyesítését támogatja egyszerre. A Git egyesítést a Git pull használja az egyes ágakból a másikba vagy egy másik adattárból a változások beépítéséhez. Az egyesítésnek egyetlen lerakaton belül kell történnie, azaz az összes egyesítendő ágnak ugyanabban a lerakatban kell lennie. Az egyesítési helyzetek általában két vagy több felhasználó következményei, amelyek megpróbálják frissíteni a közös kódot. Leggyakrabban a felhasználó egyesíti az ágot egy másik ághoz a helyi lerakatban egy helyi környezetben. A Git egyesítés kifejezetten integrálja a forráságazat tartalmát a célággal. A cél ág megváltozik, míg a forrás ág megmarad.
A Git rebase egy újabb alternatíva az egyesítéshez, amelyet arra használnak, hogy egy másik ágot integráljon az ágba, ahol jelenleg dolgozik, azzal a különbséggel, hogy lineáris átadási előzményekkel rendelkezik. A Git rebase célja egy fióktelep mozgatása egyik helyről a másikra. Mivel a kötelezettségvállalások változatlanok, azokat nem lehet áthelyezni, ezért ehhez új elkötelezettségeket kell készíteni ugyanazokkal a változtatásokkal és metaadatokkal. A rebase alapvetően megváltoztatja azt a gondolatot, hogy mikor és hol dolgozták ki a kötelezettségvállalások sorozatát, ami a fejlesztési történelem bizonyos aspektusainak elvesztését eredményezi. Ez azt jelenti, hogy megváltozik az eredeti kötelezettségvállalás, amelyen a fejlesztés eredetileg alapult. A történelem átírásával hatékonyan beépíti az összes új kötelezettségvállalást a mesterágba. Ennek eredményeként új kötelezettségvállalásokat hoz létre az eredeti ágazat minden egyes kötelezettségvállalására.
- Bár mind az egyesülés, mind a visszatükrözés a leggyakoribb módszer a változások integrálására a Gitben, és ugyanazt a célt szolgálják - több ág egyesítését -, a különbség abban rejlik, hogy miként érik el azt. A Git merge integrálja a forráság tartalmát a célággal, miközben megőrzi az egyes kötelezettségvállalási előzmények őseit, míg a Git rebase magában foglalja a fő ág minden új kötelezettségvállalását azáltal, hogy átírja a történetet, új forgatókönyvek létrehozásával a forráságazat minden egyes kötelezettségvállalására.
- A Git merge funkcióval először átvált az egyesíthető ágra, majd az merge paranccsal választja ki az egyesítendő ágot. Tekintettel arra, hogy az ág egy kötelezettségvállalásra mutat, és hogy egy kötelezettségvállalás az a granularitás, amelyhez társítasz, az egyesítés a parancs egyesül az ág vagy az elkötelezettség szintjén. A Rebase viszont egy kicsit más. Először ki kell választania egy ágat az újbóli létrehozáshoz, majd a rebase paranccsal válassza ki, hogy hová tegye.
- Az egyesülés új kötelezettségvállalást hoz létre, amely a két ág közötti összeolvadást képviseli. Összevonja az egyes párhuzamos fejlődési vonalak (ágak) változásait egyesítési kötelezettség létrehozásával. A cél két vagy több ág összekapcsolása, beleértve az összes változást, amely az aktuális ág felé való eltérés pontja óta megtörtént. A gyors előretekerés az alapértelmezett egyesítési viselkedés a Gitben. A rebasing viszont megváltoztatja az egyéni kötelezettségvállalásokat úgy, hogy átírja a projekt történetét azáltal, hogy új elkötelezettségeket hoz létre az eredeti ág minden egyes elkötelezettségére, ami viszont lineáris történetet eredményez, eltérő ágak nélkül.
- A Git egyesítése nem változtatja meg az előzményeket, miközben megőrzi az ág kontextusát, azaz a meglévő ágakat semmilyen módon nem változtatják meg. Új elkötelezettséget hoz létre (kivéve, ha gyors előrehaladás volt), de az elkötelezettség továbbra is elérhető az ágból. A Git rebase viszont egy potenciálisan összetett történetet korszerűsít. A kötelezettségvállalásokat átírják, a régi verziókat elfelejtik, és a javítások DAG-ját megváltoztatják. A kötelezettségvállalások már nem érhetők el a rebase-sel, azaz már nem tudsz újból bázist adni a közzétett ágaknak.
Nos, dióhéjban, mind az egyesülés, mind az újrabecslés a Gitben bekövetkező változások integrálásának két módja, ám ezek különböznek egymástól. Az egyesítés egylépéses művelet egy helyen, a konfliktusok megoldására, és az ágból elérhető célok továbbra is elérhetők. A Rebase viszont az egyes kötelezettségvállalásokat egyedileg alkalmazza azáltal, hogy átírja a történetet azáltal, hogy új kötelezettségvállalásokat hoz létre a forráságazat minden egyes kötelezettségvállalására. Tehát, ami valaha elérhető volt, már nem érhető el. A rebase alapvetően megváltoztatja azt az elképzelést, hogy mikor és hol alakították ki a kötelezettségvállalások sorozatát.