Hämta ändringar: git fetch och git pull
Det här lär du dig
Section titled “Det här lär du dig”- Att hämta nya commits med
git fetch, och se vad som är nytt innan du för in det. - Att hämta och föra in på en gång med
git pull. - Vad du gör när
git pushnekas, och närgit pullfrågar hur grenarna ska föras ihop.
Varför behövs det här?
Section titled “Varför behövs det här?”Så fort du arbetar från två datorer, eller med någon annan, kommer det commits till fjärr-repositoryt som du inte har. GitGitEtt program som sparar versioner av filerna i ett projekt, så att man kan se vad som ändrats, gå tillbaka till tidigare versioner och arbeta flera samtidigt.Läs mer om Git hämtar dem aldrig av sig själv. Du måste hämta dem innan du kan bygga vidare på dem, och innan du får skicka dina egna.
Så hänger det ihop
Section titled “Så hänger det ihop”git fetchhämtar nya commits frånoriginoch flyttar framorigin/main. Din egenmainoch dina filer ändras inte. Det är alltid ofarligt.git pullgör engit fetchoch sedan en mergeMergeAtt föra ihop ändringarna från två branches till en. Git gör det automatiskt när det går och ber om hjälp när samma rader ändrats på olika sätt.Läs mer om merge avorigin/mainin i dinmain. Det är precis samma merge som i modul 4: en fast-forward när bara servern har nya commits, och en merge-commit när ni båda har det.
Servern tar bara emot en git push som är en fast-forward för grenen där. Har någon annan hunnit skicka
commits som du inte har nekas din push. Då hämtar du först med git pull, och skickar sedan.
Exempel
Section titled “Exempel”I exemplet delar resplan och resplan-laptop samma fjärr-repository, som i lektion 2. På laptopen läggs
dag 4 till och skickas:
$ git commit -m "Lägg till dag 4: Sundsvall"[main 223a0d9] Lägg till dag 4: Sundsvall 1 file changed, 1 insertion(+)$ git pushTo /tmp/kim/server/resplan.git 7620fac..223a0d9 main -> maingit fetch
Section titled “git fetch”I resplan vet Git ännu ingenting om det. git status jämför bara med hur origin/main såg ut senast:
$ git statusOn branch mainYour branch is up to date with 'origin/main'.
nothing to commit, working tree cleanHämta, och fråga igen:
$ git fetchFrom ../server/resplan 7620fac..223a0d9 main -> origin/main$ git statusOn branch mainYour branch is behind 'origin/main' by 1 commit, and can be fast-forwarded. (use "git pull" to update your local branch)
nothing to commit, working tree cleanNu vet Git att origin/main ligger en commit före. Du kan se vad som är nytt innan du för in det:
$ git diff main origin/maindiff --git a/resplan.txt b/resplan.txtindex d9d77fc..7893b8b 100644--- a/resplan.txt+++ b/resplan.txt@@ -3,3 +3,4 @@ Resplan sommaren Dag 1: Stockholm Dag 2: Uppsala Dag 3: Gävle+Dag 4: Sundsvallgit pull
Section titled “git pull”git pull för in ändringarna. Här blir det en fast-forward:
$ git pullUpdating 7620fac..223a0d9Fast-forward resplan.txt | 1 + 1 file changed, 1 insertion(+)När git push nekas
Section titled “När git push nekas”Nu har båda gjort en ny commit samtidigt. Laptopen hann skicka dag 5 först. När resplan försöker skicka en
ny rubrik nekas den:
$ git pushTo ../server/resplan.git ! [rejected] main -> main (fetch first)error: failed to push some refs to '../server/resplan.git'hint: Updates were rejected because the remote contains work that you do nothint: have locally. This is usually caused by another repository pushing tohint: the same ref. If you want to integrate the remote changes, usehint: 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.Inget har gått förlorat. Git skyddar bara laptopens commit från att skrivas över. Lösningen är git pull och
sedan git push.
Första gången grenarna har gått isär frågar git pull hur de ska föras ihop:
$ git pullFrom ../server/resplan 223a0d9..c290728 main -> origin/mainhint: You have divergent branches and need to specify how to reconcile them.hint: You can do so by running one of the following commands sometime beforehint: your next pull:hint:hint: git config pull.rebase false # mergehint: git config pull.rebase true # rebasehint: git config pull.ff only # fast-forward onlyhint:hint: You can replace "git config" with "git config --global" to set a defaulthint: preference for all repositories. You can also pass --rebase, --no-rebase,hint: or --ff-only on the command line to override the configured default perhint: invocation.fatal: Need to specify how to reconcile divergent branches.Kursen använder merge, som du kan från modul 4. Ställ in det en gång för alla dina repositories och hämta igen:
$ git config --global pull.rebase false$ git pullAuto-merging resplan.txtMerge made by the 'ort' strategy. resplan.txt | 1 + 1 file changed, 1 insertion(+)git pull öppnar texteditorn för merge-commitens meddelande, precis som git merge. Med git pull --no-edit
används det ifyllda meddelandet direkt. Nu går det att skicka:
$ git log --oneline --graph* fdccd6c (HEAD -> main) Merge branch 'main' of ../server/resplan|\| * c290728 (origin/main) Lägg till dag 5: Umeå* | 1578de3 Lägg till årtal i rubriken|/* 223a0d9 Lägg till dag 4: Sundsvall* 7620fac Lägg till dag 3: Gävle* 226c08c Första versionen av resplanen$ git pushTo ../server/resplan.git c290728..fdccd6c main -> mainÖvning
Section titled “Övning”Du spelar två personer, eller samma person vid två datorer. Mapparna resplan-git och resplan-andra-datorn
från förra lektionen är kopplade till samma repository på GitHub.
Vanliga problem
Section titled “Vanliga problem”Testa dig själv
Section titled “Testa dig själv”Sammanfattning
Section titled “Sammanfattning”git fetchhämtar nya commits och flyttar framorigin/main. Dina filer ändras inte.git statusochgit diff main origin/mainvisar vad som är nytt efter engit fetch.git pullärgit fetchplus en merge. Det kan bli en fast-forward, en merge-commit eller en konflikt.- En
git pushnekas när servern har commits som du inte har. Körgit pull, och sedangit push. - Ställ in
git config --global pull.rebase falseen gång, så vetgit pullatt den ska göra en merge.