-
1. Kom igång
- 1.1 Om versionshantering
- 1.2 En kort historik om Git
- 1.3 Vad är Git?
- 1.4 Kommandoraden
- 1.5 Installera Git
- 1.6 Första gången med Git
- 1.7 Få hjälp
- 1.8 Sammanfattning
-
2. Grunderna i Git
- 2.1 Att få tag i ett Git‑kodförråd
- 2.2 Spara ändringar i kodförrådet
- 2.3 Visa incheckningshistoriken
- 2.4 Ångra saker
- 2.5 Arbeta med fjärrkodförråd
- 2.6 Att tagga
- 2.7 Git-alias
- 2.8 Sammanfattning
-
3. Git-grenar
- 3.1 Grenar i korthet
- 3.2 Grundläggande gren- och sammanfogningsarbete
- 3.3 Grenhantering
- 3.4 Arbetsflöden med grenar
- 3.5 Fjärrgrenar
- 3.6 Ombasering
- 3.7 Sammanfattning
-
4. Git på servern
- 4.1 Protokollen
- 4.2 Konfigurera Git på en server
- 4.3 Generera din publika SSH-nyckel
- 4.4 Konfigurera servern
- 4.5 Git-demon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Tredjepartsalternativ
- 4.10 Sammanfattning
-
5. Distribuerat Git
-
6. GitHub
-
7. Git-verktyg
- 7.1 Revisionsurval
- 7.2 Interaktiv köläggning
- 7.3 Lägga undan och städa
- 7.4 Signera ditt arbete
- 7.5 Sökning
- 7.6 Skriva om historik
- 7.7 Nollställning förklarad
- 7.8 Avancerad sammanslagning
- 7.9 Rerere
- 7.10 Felsöka med Git
- 7.11 Undermoduler
- 7.12 Bunta
- 7.13 Ersätt
- 7.14 Lagring av inloggningsuppgifter
- 7.15 Sammanfattning
-
8. Anpassa Git
- 8.1 Git‑konfiguration
- 8.2 Git‑attribut
- 8.3 Git‑krokar
- 8.4 Ett exempel på Git‑upprätthållen policy
- 8.5 Sammanfattning
-
9. Git och andra system
- 9.1 Git som klient
- 9.2 Migrera till Git
- 9.3 Sammanfattning
-
10. Git bakom kulisserna
- 10.1 Lågnivådel och användardel
- 10.2 Git-objekt
- 10.3 Git-referenser
- 10.4 Packfiler
- 10.5 Refspecen
- 10.6 Överföringsprotokoll
- 10.7 Underhåll och dataåterställning
- 10.8 Miljövariabler
- 10.9 Sammanfattning
-
A1. Bilaga A: Git i andra miljöer
- A1.1 Grafiska gränssnitt
- A1.2 Git i Visual Studio
- A1.3 Git i Visual Studio Code
- A1.4 Git i IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git i Sublime Text
- A1.6 Git i Bash
- A1.7 Git i Zsh
- A1.8 Git i PowerShell
- A1.9 Sammanfattning
-
A2. Bilaga B: Bädda in Git i dina applikationer
- A2.1 Git på kommandoraden
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Bilaga C: Git-kommandon
- A3.1 Uppstart och konfiguration
- A3.2 Skaffa och skapa projekt
- A3.3 Grundläggande ögonblicksbilder
- A3.4 Grening och sammanslagning
- A3.5 Dela och uppdatera projekt
- A3.6 Inspektion och jämförelse
- A3.7 Felsökning
- A3.8 Patchning
- A3.9 E‑post
- A3.10 Externa system
- A3.11 Administration
- A3.12 Lågnivåkommandon
3.2 Git-grenar - Grundläggande gren- och sammanfogningsarbete
Grundläggande gren- och sammanfogningsarbete
Låt oss gå igenom ett enkelt exempel på gren- och sammanfogningsarbete i ett arbetsflöde som är vanligt i verkligheten. Du kommer att följa dessa steg:
-
Gör lite arbete på en webbplats.
-
Skapa en gren för en ny användarberättelse du jobbar på.
-
Gör arbete i den grenen.
I det här läget får du ett samtal om att ett annat problem är mer kritiskt och att det behövs en snabbkorrigering. Då gör du följande:
-
Byt till produktionsgrenen.
-
Skapa en gren för snabbkorrigeringen.
-
När den är testad, sammanfoga snabbkorrigeringsgrenen och skicka till produktion.
-
Byt tillbaka till användarberättelsen och fortsätt arbeta.
Grundläggande grenarbete
Anta att du arbetar på ett projekt och redan har gjort några incheckningar på master-grenen.
Du har bestämt dig för att jobba med ärende #53 i organisationens ärendehanteringssystem.
För att skapa en ny gren och byta till den samtidigt kan du köra git checkout med flaggan -b:
$ git checkout -b iss53
Switched to a new branch "iss53"
Det här är kort för:
$ git branch iss53
$ git checkout iss53
Du arbetar på webbplatsen och gör några incheckningar.
Då flyttas iss53-grenen framåt, eftersom du har den växlad till (det vill säga HEAD pekar på den):
$ vim index.html
$ git commit -a -m 'Create new footer [issue 53]'
iss53 rör sig framåt med ditt arbeteNu får du samtalet om att det finns ett problem med webbplatsen som måste fixas omgående.
Med Git behöver du inte distribuera din fix tillsammans med iss53-ändringarna, och du behöver inte lägga tid på att ångra dem innan du kan jobba mot produktion.
Allt du behöver göra är att byta tillbaka till master.
Notera dock att om arbetskatalogen eller köytan innehåller icke checkade in ändringar som krockar med grenen du vill växla till, kommer Git att hindra bytet.
Det är bäst att ha en ren arbetskatalog när du byter gren.
Det finns sätt att komma runt detta (gömma ändringar eller göra en tilläggsincheckning), vilket vi går igenom senare i Lägga undan och städa.
För tillfället antar vi att du har checkat in allt och kan byta tillbaka till master:
$ git checkout master
Switched to branch 'master'
Nu ser arbetskatalogen ut exakt som den gjorde innan du började jobba på ärende #53, och du kan fokusera på snabbkorrigeringen. Det är viktigt att komma ihåg: när du byter gren återställer Git arbetskatalogen till hur den såg ut senast du checkade in på den grenen. Git lägger till, tar bort och ändrar filer automatiskt så att arbetskopian motsvarar grenen vid senaste incheckningen.
Nu ska du göra en snabbkorrigering.
Låt oss skapa en hotfix-gren att arbeta i tills den är klar:
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'Fix broken email address'
[hotfix 1fb7853] Fix broken email address
1 file changed, 2 insertions(+)
master
Du kan köra testerna, säkerställa att fixen är korrekt och sedan sammanfoga hotfix-grenen tillbaka till master för att publicera till produktion.
Det gör du med git merge:
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
I utskriften ser du att Git snabbspolar.
Eftersom incheckningen C4 som hotfix pekar på ligger direkt framför C2 som du står på, flyttar Git helt enkelt pekaren framåt.
Med andra ord: när du försöker sammanfoga en incheckning med en incheckning som redan finns i historiken, gör Git saken enkel genom att flytta pekaren framåt – det finns ingen divergerad historik att sammanfoga.
Din ändring finns nu i ögonblicksbilden som master pekar på och du kan rulla ut fixen.
master snabbspolas till hotfix
Efter att den viktiga korrigeringen är ute är du redo att gå tillbaka till arbetet du gjorde innan du blev avbruten.
Men först tar du bort hotfix-grenen, eftersom du inte längre behöver den – master pekar på samma ställe.
Du tar bort den med -d till git branch:
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
Nu kan du byta tillbaka till grenen för ärende #53 och fortsätta där:
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'Finish the new footer [issue 53]'
[iss53 ad82d7a] Finish the new footer [issue 53]
1 file changed, 1 insertion(+)
iss53
Det är värt att notera att arbetet du gjorde i hotfix-grenen inte finns i iss53.
Om du behöver få in ändringarna kan du sammanfoga master in i iss53 med git merge master, eller vänta tills du senare sammanfogar iss53 till master.
Grundläggande sammanslagning
Anta att du bestämt dig för att arbetet med ärende #53 är klart och att det ska slås samman med master.
Då slår du ihop iss53 med master, precis som du gjorde med hotfix tidigare.
Allt du behöver göra är att växla till grenen du vill sammanfoga till och köra git merge:
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
Det här ser annorlunda ut än hotfix-sammanslagningen.
Nu har historiken divergerat från en äldre punkt.
Eftersom incheckningen på grenen du står på inte är en direkt förfader till grenen du slår ihop måste Git göra mer arbete.
I det här fallet gör Git en enkel trevägssammanfogning, där två ögonblicksbilder och den gemensamma förfadern används.
I stället för att bara flytta grenpekaren framåt skapar Git en ny ögonblicksbild som är resultatet av trevägssammanfogningen och skapar automatiskt en ny incheckning som pekar på den. Detta kallas en sammanslagningsincheckning och den är speciell eftersom den har fler än en förälder.
Nu när arbetet är sammanfogat behöver du inte iss53 längre.
Du kan stänga ärendet i ärendehanteringen och ta bort grenen:
$ git branch -d iss53
Grundläggande sammanslagningskonflikter
Ibland går inte processen helt smärtfritt.
Om du har ändrat samma del av samma fil på olika sätt i två grenar kan Git inte sammanfoga dem rent.
Om din fix för ärende #53 ändrade samma del av en fil som hotfix-grenen får du en sammanslagningskonflikt som kan se ut så här:
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Git har inte skapat någon sammanslagningsincheckning.
Den har pausat processen medan du löser konflikten.
Om du vill se vilka filer som inte är sammanfogade kan du köra git status:
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
Allt som har konflikter och inte har lösts listas som osammanfogat. Git lägger till standardmarkörer i filerna med konflikter så att du kan öppna dem och lösa konflikten manuellt. Din fil innehåller ett avsnitt som ser ut ungefär så här:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
Detta betyder att versionen i HEAD (din master-gren, eftersom den var växlad till när du körde sammanslagningen) är den övre delen av blocket, medan versionen i iss53 är den nedre.
För att lösa konflikten måste du välja en sida eller sammanfoga innehållet själv.
Du kan till exempel ersätta hela blocket med:
<div id="footer">
please contact us at email.support@github.com
</div>
Den lösningen har lite av båda, och raderna med <<<<<<<, ======= och >>>>>>> har tagits bort.
När du löst varje konflikt i filen kör du git add på filen för att markera den som löst.
Att köa filen markerar den som löst i Git.
Om du vill använda ett grafiskt verktyg kan du köra git mergetool, som startar ett lämpligt visuellt sammanslagningsverktyg och hjälper dig igenom konflikterna:
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html
Normal merge conflict for 'index.html':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):
Om du vill använda ett annat verktyg än standard (Git valde opendiff här eftersom kommandot kördes på macOS) kan du se alla stödda verktyg i listan.
Ange bara namnet på det verktyg du föredrar.
|
Notera
|
Om du behöver mer avancerade verktyg för kluriga konflikter går vi igenom mer sammanslagning i Avancerad sammanslagning. |
Efter att du avslutat verktyget frågar Git om sammanslagningen lyckades.
Svarar du ja köas filen som löst.
Du kan köra git status igen för att kontrollera att alla konflikter är lösta:
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html
Om du är nöjd och har verifierat att allt är köat kan du skriva git commit för att slutföra sammanslagningsincheckningen.
Standardmeddelandet för en sammanslagning ser ut ungefär så här:
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
#
Om du tycker att det vore hjälpsamt för andra att förstå vad som hände kan du skriva ett meddelande med detaljer om hur du löste konflikten och varför du gjorde vissa ändringar.