Git worktree

Git worktree

Forstil dig at du arbejder på et projekt hvor du har to branches

  1. development - basis for næste release

  2. production - reflekterer nuværende produktion

/images/cmd1.png

Production indeholder to filer

/images/cmd2.png

og development indeholder tre filer, og du har lige tilføjet en fjerde og lavet en commit på den, samt så er du ved at arejde på en femte fil

/images/cmd3.png

(git status til reference)

/images/cmd4.png

Da du får en "ALARM BUG SMID ALT HVAD DU HAR I HÆNDERNE OG FIKS DET I PRODUKTION!!!!!!"-email ind, da kunden har opdaget en h2 headline i stedet for h1, som jo selvfølgelig er mere vigtig end det du er ved at lave.

Man kunne nu lave en git checkout production, men du vil ikke lave en commit på det du sidder og laver, hvilket gør at din ændring bliver båret med over

/images/cmd5.png

/images/sadpanda.png

Du kunne bruge git stash, men det gider vi ikke. Du kunne i teorien også klone koden igen og skifte til produktion, men der er rigtig meget kode. What to do? git worktree to the rescue!!

Du kan hente din kode ned fra production=branchen med følgende =git worktree add ..production origin/production, hvilket vil

  1. oprette en ny folder ved navn production, og

  2. smide din filer fra branchen her

Du har nu en seperat folder med production kildekoden til at ligge. I en deatached HEAD, men det gør ikke noget

/images/cmd6.png

Vi kan nu debugge og finde fejlen, og rette den. Jeg fandt fejlen, i =1.txt=og har ændret filen, og reddet kundens dag!! JUBIII.

/images/cmd7.png

Alt virker. Jeg kan nu oprette en hotfix branch udfra den deatached HEAD, tilføje filen til mit index, og committe den

/images/cmd8.png

/images/cmd9.png

Jeg kan til sidst smide den op i min origin, med git push --set-upstream origin hotfix/coolfix. Jeg kan nu smide den på et miljø, teste det og smide den ind i =production=igen via et pull request

/images/fixed.png

Jeg kan nu skifte branch til =production=og se at min ændring rigtig nok er kommet med

/images/cmd10.png

Her er ændringen

/images/cmd11.png

Læg mærke til at jeg hele tiden er i min production worktree folder. Skifter jeg til min oprindelige folder, hvor jeg var igang på development branchen, har jeg 5 filer, et commit, noget jeg var igang med og ingenting i 1.txt filen

/images/cmd12.png

Det smarte er at jeg nu kan merge production ind i development, da jeg har det hele lokalt

/images/cmd13.png

BOOM

/images/cmd14.png

Jeg kan nu fræse videre med min udvikling.

Angående oprydning kan jeg slette min lokale production folder

/images/cmd15.png

og køre en git worktree prune

/images/cmd16.png

Jeg har nu ikke en linket production branch mere

/images/cmd17.png

production branchen er ikke længere markeret med + symbolet og den blå farve. Jeg antager at det er det som fortæller mig at branchen på en eller anden måde er linket. Man kan bruge git worktree list til at få vist alle ens worktrees.

Hvorfor ikke bare klone? Det smarte ved at bruge tilføje en ekstra worktree er at man:

  1. ikke henter alt ned igen,

  2. hvis det man sidder og arbejder på divergerer meget fra det man har i produktion, kan ens editor godt brokke sig lidt

  3. hvis det man sidder og arbejder på divergerer meget fra det man har i produktion kan det godt være irriterende at skulle bygge det hele igen

Det her er noget jeg selv vil til at bruge i mit workflow, i stedet for at stashe. Jeg har læst om andre som bruger det i deres workflow, hvor de bruger det til at køre tests med, mens de udvikler (da deres tests tog lidt tid om at køre), og andre igen, som diff'ede det de sad med, og sammenlignede det med produktion, hvis der var en fejl. Mulighederne er mange!

Smid endelig en kommentar nedenunder, hvis du har forslag, rettelser, eller bare gerne vil fortælle mig at det jeg gør er fuldstændig hen i vejret. Jeg er ikke selv en Gnu til Git (no prune intented .. LOL), men jeg er altid klar på at lære!

Stay git, and please covid, jeg mener, commit. Eller. SES!!

comments powered by Disqus