Jag lär mig för närvarande att använda Git genom att läsa Pro Git . Just nu lär jag mig om grenning och taggar. Min fråga är när ska jag använda en gren och när ska jag använda en tagg?
Till exempel, säg att jag skapar en gren för version 1.1 av ett projekt. När jag avslutar och släpper den här versionen, ska jag lämna filialen för att markera versionen? Eller ska jag lägga till en tagg? Om jag lägger till en tagg, ska jag ta bort versiongrenen (förutsatt att den slås samman till master eller någon annan gren )?
Svar
Kort sagt: Bästa praxis är grenar ut, slå samman ofta och håll alltid synkroniserade .
Det finns ganska tydliga konventioner om att hålla din kod i en separat gren från huvudgrenen:
- Du håller på att genomföra en större eller störande förändring
- Du handlar om att göra några ändringar som kanske inte används
- Du vill experimentera med något som du inte är säker på att det kommer att fungera
- När du blir tillsagd att förgrena dig kan andra ha något de behöver göra i master
Tumregeln är efter att du har förgrenat dig, du bör hålla dig synkroniserad med master gren. För så småningom måste du slå samman det till mästaren. För att undvika en enorm komplicerad röra av konflikter när du slår samman, bör du begå ofta, slå samman ofta.
God praxis att följa
En framgångsrik Git-förgreningsmodell av Vincent Driessen har bra förslag. Om den här förgreningsmodellen tilltalar dig, överväg flödetillägget till git . Andra har kommenterat om flöde .
Märkningsmetoder
Som du redan vet ger Git dig engagemangsidentifierare som 1.0 -2-g1ab3183 men det är inte taggar! Märkning görs med git-taggen, och taggarna som skapas med git-taggen är basen för de engagemangsidentifierare som git beskriver skapar. Med andra ord, i Git, taggar du inte grenar. Du märker åtaganden. Det är korrekt att säga att taggen bara är en kommenterad pekare till ett engagemang.
Låt oss titta på praktiska exempel som visade det,
/-- [v1.0] v ---.---.---.---S---.---A <-- master \ \-.---B <-- test
Låt ”s begå” S ”begås pekas av taggen” v1.0 ”. Detta åtagande är både på gren ”master” och på gren ”test”. Om du kör " git beskriv " ovanpå commit ” En ”(överst i” master ”-grenen) skulle du få något som v1.0-2-g9c116e9
. Om du kör " git beskriv " ovanpå begå ”B” (aka ”test” -grenen) skulle du få något som v1.0-2-g3f55e41
, det är fallet med standard git-beskrivningskonfiguration. Observera att detta resultat är något annorlunda. v1.0-2-g9c116e9
betyder att vi håller på med sorterad SHA-1-id för 9c116e9
, 2 begår efter taggen v1.0
. Det finns ingen tagg v1.0-2
!
Om du vill att din tagg ska visas endast på filialens ”master” kan du skapa en ny kommission (t.ex. endast uppdatera standard / fallback versioninformation i GIT-VERSION-FILE) efter förgreningspunkten för ”test” -grenen. Om du taggar åtar sig ”test” -gren med t.ex. ”v1.0.3` det skulle bara vara synligt från” test ”.
Referenser
Jag har hittat många, många användbara bloggar och inlägg att lära av. Men de som är professionellt illustrerade är sällsynta. Jag vill därför rekommendera ett inlägg – En framgångsrik Git-förgreningsmodell av @nvie. Jag har lånat hans illustration:)
Kommentarer
- 1.0-2-g1ab3183 är en identifierare konstruerad av git beskriv från information tillgänglig från git, men att kalla det en git-identifierare är lite för mycket. Git identifierar med SHA-hash; taggar och grenar är mänskliga konstruktioner som git hjälper till att hålla reda på. Som sådan gör du en tagg när du tror att någon människa en dag vill hitta ett bekvämt bokmärke för ett engagemang.
- en underbar illustration av flerdimensionalitet i gituniversumet. vackert. tack
- Det är värt konstaterar att många projekt inte har något behov av några av banorna som visas i detta diagram. Vissa projekt behöver bara det som ' kallas utvecklas och visas här. Detta gäller ofta för webbappar som kan distribueras efter eget val.
- Även författaren till git flow rekommenderar inte längre det för många projekttyper, till exempel webbutveckling. Många tror att det är mycket mer komplext än de allra flesta projekt behöver, vilket gör det besvärligt att genomföra och lätt att få fel.I andra änden av spektrumet använder vissa avancerade utövare förespråkslag ' trunkbaserad utveckling ', som nästan aldrig använder grenar alls, och leverera framgångsrika projekt som det. För något mellanliggande, överväg " anti-gitflow '
Svar
En gren används om du har två olika versioner av arkivet samtidigt. En tagg är ett sätt att markera en tidpunkt i ditt arkiv.
Du bör lägga till en tagg för att markera en släppt version. Om du sedan behöver göra felkorrigeringar för den versionen skulle du skapa en gren vid taggen.
Du vill bara ta bort grenar som har slogs samman till HEAD [eller någon annan gren].
Kommentarer
- oh … och jag antar att du menar att filialen slås samman till en annan gren, till exempel master. HEAD flyttar varje gång jag checkar ut, eller hur?
- HEAD pekar vanligtvis på en gren (såvida du inte ' befinner sig i fristående HEAD-läge), så HEAD flyttar med den gren den pekar på