Svenska ▾ Topics ▾ Latest version ▾ git-reset last updated in 2.53.0

NAMN

git-reset - Återställ aktuell HEAD till angivet tillstånd

SYNOPSIS

git reset [-q] [<trädlikt>] [--] <sökvägsspec>…​
git reset [-q] [--pathspec-from-file=<fil> [--pathspec-file-nul]] [<trädlikt>]
git reset (--patch | -p) [<trädlikt>] [--] [<sökvägsspec>…​]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<incheckning>]

BESKRIVNING

I de tre första formerna, kopiera poster från <trädlikt> till indexet. I det sista formuläret, sätt den aktuella grenhuvudet (HEAD) till <incheckning>, och modifiera eventuellt index och arbetsträd så att de matchar. <trädlikt>/<incheckning> har som standard HEAD i alla formulär.

git reset [-q] [<trädlikt>] [--] <sökvägar>...
git reset [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tträdlikt>]

Dessa former återställer indexposterna för alla sökvägar som matchar <sökvägsspec> till deras tillstånd vid <trädlikt>. (Det påverkar inte arbetsträdet eller den aktuella grenen.)

Det här betyder att git reset <sökvägsspec> är motsatsen till git add <sökvägsspec>. Detta kommando motsvarar git restore [--source=<trädlikt>] --staged <sökvägsspec>....

Efter att ha kört git reset <sökvägsspec> för att uppdatera indexposten kan du använda git-restore[1] för att checka ut innehållet från indexet till arbetskatalog. Alternativt, genom att använda git-restore[1] och ange en incheckning med --source, kan du kopiera innehållet i en sökväg från en incheckning till indexet och till arbetsträdet samtidigt.

git reset (--patch | -p) [<trädlikt>] [--] [<sökvägsspec>...]

Välj interaktivt bitar i skillnaden mellan indexet och <trädlikt> (standardinställningen är HEAD). De valda bitarna tillämpas i omvänd ordning på indexet.

Det här betyder att git reset -p är motsatsen till git add -p, d.v.s. du kan använda det för att selektivt återställa stycken. Se avsnittet "Interaktivt läge" i git-add[1] för att lära dig hur man använder --patch-läget.

git reset [<läge>] [<incheckning>]

Det här formuläret återställer den aktuella grenhuvudet till <incheckning> och uppdaterar eventuellt indexet (återställer det till trädet för <incheckning>) och arbetskatalog beroende på <läge>. Före operationen sätts ORIG_HEAD till toppen av den aktuella grenen. Om <mode> utelämnas, sätts standardvärdet till --mixed. <läge> måste vara ett av följande:

--soft

Rör inte indexfilen eller arbetsträdet alls (men återställer huvudet till <incheckning>, precis som alla lägen gör). Detta lämnar alla dina ändrade filer kvar som "Ändringar att checkas-in", som git status skulle uttrycka det.

--mixed

Återställer indexet men inte arbetskatalog (dvs. de ändrade filerna bevaras men markeras inte för incheckning) och rapporterar vad som inte har uppdaterats. Detta är standardåtgärden.

Om -N anges markeras borttagna sökvägar som avsiktliga att lägga till (se git-add[1]).

--hard

Återställer indexet och arbetskatalog. Alla ändringar av spårade filer i arbetskatalog sedan <incheckning> ignoreras. Alla ospårade filer eller kataloger som används vid skrivning av spårade filer raderas helt enkelt.

--merge

Återställer indexet och uppdaterar filerna i arbetskatalogen som skiljer sig mellan <incheckning> och HEAD, men behåller de som skiljer sig mellan indexet och arbetskatalogen (dvs. som har ändringar som inte har lagts till). Om en fil som skiljer sig mellan <incheckning> och indexet har ändringar som inte har lagts till, avbryts återställningen.

Med andra ord, --merge gör något i stil med git read-tree -u -m <incheckning>, men överför osammanfogade indexposter.

--keep

Återställer indexposter och uppdaterar filer i arbetskatalogen som skiljer sig mellan <incheckning> och HEAD. Om en fil som skiljer sig mellan <incheckning> och HEAD har lokala ändringar avbryts återställningen.

--recurse-submodules
--no-recurse-submodules

När arbetskatalogen uppdateras, kommer användning av --recurse-submodules också rekursivt att återställa arbetskatalogen för alla aktiva undermoduler enligt den incheckning som registrerats i superprojektet, och även ställa in undermodulernas HEAD så att de kopplas bort vid den incheckningen.

Se "Nollställ, återställ och ångra" i git[1] för skillnaderna mellan de tre kommandona.

ALTERNATIV

-q
--quiet

Var tyst, rapportera endast fel.

--refresh
--no-refresh

Uppdatera indexet efter en blandad återställning. Aktiverat som standard.

--pathspec-from-file=<fil>

Sökvägsspec skickas i <fil> istället för kommandoradsargument. Om <fil> är exakt - används standardindata. Sökvägsspec-element separeras med LF eller CR/LF. Sökvägsspec-element kan citeras enligt beskrivningen för konfigurationsvariabeln core.quotePath (se git-config[1]). Se även --pathspec-file-nul och global --literal-pathspecs.

--pathspec-file-nul

Endast meningsfullt med --pathspec-from-file. Pathspec-element separeras med tecknet NUL och alla andra tecken tolkas bokstavligt (inklusive radbrytningar och citattecken).

-U<n>
--unified=<n>

Generate diffs with <n> lines of context. Defaults to diff.context or 3 if the config option is unset.

--inter-hunk-context=<n>

Visar sammanhanget mellan olika stycken, upp till det angivna <antal> rader, och sammanfogar därmed stycken som ligger nära varandra. Standardvärdet är diff.interHunkContext eller 0 om konfigurationsalternativet inte är inställt.

--

Tolka inte fler argument som alternativ.

<sökvägsspec>...

Begränsar de sökvägar som påverkas av operationen.

För mer information, se posten sökvägsspec i gitglossary[7].

EXEMPEL

Ångra tillägg
$ edit                                     (1)
$ git add frotz.c filfre.c
$ mailx                                    (2)
$ git reset                                (3)
$ git pull git://info.example.com/ nitfol  (4)
  1. Du arbetar glatt med något och upptäcker att ändringarna i dessa filer är i god ordning. Du vill inte se dem när du kör git diff, eftersom du planerar att arbeta med andra filer och ändringar med dessa filer är störande.

  2. Somebody asks you to pull, and the changes sound worthy of merging.

  3. Du har dock redan smutsat ner indexet (dvs. ditt index matchar inte HEAD-incheckningen). Men du vet att den pull du ska göra inte påverkar frotz.c eller filfre.c, så du återställer indexändringarna för dessa två filer. Dina ändringar i arbetskatalog finns kvar där.

  4. Sedan kan du hämta och sammanfoga, och lämna ändringarna av frotz.c och filfre.c kvar i arbetskatalogen.

Ångra en incheckning och gör om
$ git commit ...
$ git reset --soft HEAD^      (1)
$ edit                        (2)
$ git commit -a -c ORIG_HEAD  (3)
  1. Detta görs oftast när du kommer ihåg att det du just checkade-in är ofullständigt, eller att du stavade ditt inchecknings-meddelande fel, eller båda. Lämnar arbetskatalogen som det var före "återställning".

  2. Gör korrigeringar till arbetskatalogs-filer.

  3. "reset" kopierar den gamla huvudet till .git/ORIG_HEAD; gör om incheckningen genom att börja med dess loggmeddelande. Om du inte behöver redigera meddelandet ytterligare kan du ge alternativet -C istället.

    Se även alternativet --amend till git-commit[1].

Ångra en incheckning, vilket gör den till en ämnesgren
$ git branch topic/wip          (1)
$ git reset --hard HEAD~3       (2)
$ git switch topic/wip          (3)
  1. Du har gjort några incheckningar, men inser att det var för tidigt att lägga dem i master-grenen. Du vill fortsätta finslipa dem i en ämnes-gren, så skapa en topic/wip-gren från den nuvarande HEAD.

  2. Spola tillbaka master-grenen för att bli av med de tre incheckningarna.

  3. Byt till grenen topic/wip och fortsätt arbeta.

Ångra incheckningar permanent
$ git commit ...
$ git reset --hard HEAD~3   (1)
  1. De tre senaste incheckningarna (HEAD, HEAD^ och HEAD~2) var dåliga och du vill inte se dem igen. Gör inte detta om du redan har gett dessa incheckningar till någon annan. (Se avsnittet "ÅTERSTÄLLA FRÅN UPSTRÖMSREBASE" i git-rebase[1] för konsekvenserna av att göra det.)

Ångra en sammanslagning eller pull
$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)
  1. Att försöka uppdatera uppströms resulterade i många konflikter; du var inte redo att lägga ner mycket tid på att sammanslå just nu, så du bestämmer dig för att göra det senare.

  2. "pull" har inte gjort sammanslagnings-incheckning, så git reset --hard som är en synonym för git reset --hard HEAD rensar bort röran från indexfilen och arbetskatalogen.

  3. Sammanfoga en ämnesgren med den aktuella grenen, vilket resulterade i en snabbspolning framåt.

  4. Men du har bestämt dig för att ämnesgrenen inte är redo för offentlig konsumtion än. "pull" eller "merge" lämnar alltid den ursprungliga toppen på den aktuella grenen i ORIG_HEAD, så att återställa den hårt till den återställer din indexfil och arbetskatalogen till det tillståndet, och återställer grenens toppen till den incheckningen.

Ångra en sammanslagning eller pull inuti ett smutsig arbetskatalog
$ git pull                         (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol                |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)
  1. Även om du kan ha lokala modifieringar i ditt arbetskatalog, kan du tryggt säga "git pull" när du vet att ändringen i den andra grenen inte överlappar dem.

  2. Efter att ha granskat resultatet av sammanslagningen, kan du upptäcka att ändringen i den andra grenen är otillfredsställande. Om du kör git reset --hard ORIG_HEAD går du tillbaka till var du var, men det kommer att ignorera dina lokala ändringar, vilket du inte vill ha. git reset --merge behåller dina lokala ändringar.

Avbrutet arbetsflöde

Anta att du blir avbruten av en brådskande åtgärdsförfrågan medan du håller på med en stor ändring. Filerna i ditt arbetsträd är ännu inte i form för att komma åt, men du behöver gå till den andra grenen för en snabb buggfix.

$ git switch feature  ;# du arbetade i "funktions"-grenen och
$ work work work      ;# blev avbruten
$ git commit -a -m "ögonblicksbild WIP"                     (1)
$ git switch master
$ fix fix fix
$ git commit ;# commit med riktig logg
$ git switch feature
$ git reset --soft HEAD^ ;# gå tillbaka till WIP-tillstånd  (2)
$ git reset                                                 (3)
  1. Denna incheckning kommer att bli bortblåst så ett meddelande om bortkastad logg är okej.

  2. Detta tar bort WIP-incheckningen från inchecknings-historiken och ställer in ditt arbetskatalog till tillståndet precis innan du skapade den ögonblicksbilden.

  3. Vid det här laget innehåller indexfilen fortfarande alla WIP-ändringar som du har checkat-in som en "ögonblicksbild WIP". Detta uppdaterar indexet så att dina WIP-filer visas som obehandlade.

    Se även git-stash[1].

Återställ en enskild fil i indexet

Anta att du har lagt till en fil i ditt index, men senare bestämmer dig för att du inte vill lägga till den i din incheckning. Du kan ta bort filen från indexet samtidigt som du behåller dina ändringar med git reset.

$ git reset -- frotz.c                      (1)
$ git commit -m "Checka-in filer i index"   (2)
$ git add frotz.c                           (3)
  1. Detta tar bort filen från indexet medan den behålls i arbetskatalogen.

  2. Detta checkar-in alla andra ändringar i indexet.

  3. Lägger till filen i indexet igen.

Behåll ändringar i arbetskatalogen medan du kasta bort några tidigare incheckningar

Anta att du arbetar med något och du checkar-in det, och sedan fortsätter du att arbeta lite mer, men nu tror du att det du har i din arbetskatalog borde finnas i en annan gren som inte har något att göra med det du checkade-in tidigare. Du kan starta en ny gren och återställa den samtidigt som du behåller ändringarna i din arbetskatalog.

$ git tag start
$ git switch -c branch1
$ edit
$ git commit ...                            (1)
$ edit
$ git switch -c branch2                     (2)
$ git reset --keep start                    (3)
  1. Detta checkar-in dina första redigeringar i branch1.

  2. I den ideala världen hade du kunnat inse att den tidigare incheckningen inte hörde hemma i det nya ämnet när du skapade och bytte till branch2 (dvs. git switch -c branch2 start), men ingen är perfekt.

  3. Men du kan använda reset --keep för att ta bort den oönskade incheckningen efter att du har bytt till branch2.

Dela upp en incheckning i en sekvens av incheckningar

Anta att du har skapat många logiskt separata ändringar och checkat-in dem tillsammans. Senare bestämmer du dig för att det kan vara bättre att ha varje logisk bit associerad med sin egen incheckning. Du kan använda git reset för att spola tillbaka historiken utan att ändra innehållet i dina lokala filer, och sedan successivt använda git add -p för att interaktivt välja vilka stycken som ska inkluderas i varje incheckning, med hjälp av git commit -c för att förfylla inchecknings-meddelandet.

$ git reset -N HEAD^                        (1)
$ git add -p                                (2)
$ git diff --cached                         (3)
$ git commit -c HEAD@{1}                    (4)
...                                         (5)
$ git add ...                               (6)
$ git diff --cached                         (7)
$ git commit ...                            (8)
  1. Först, återställ historiken bakåt en incheckning så att vi tar bort den ursprungliga incheckningen, men lämnar arbetskatalogen med alla ändringar. -N säkerställer att alla nya filer som läggs till med HEAD fortfarande är markerade så att git add -p hittar dem.

  2. Därefter väljer vi interaktivt diff-stycken att lägga till med hjälp av funktionen git add -p. Detta kommer att fråga dig om varje diff-stycke i sekvens och du kan använda enkla kommandon som "ja, inkludera detta", "Nej, inkludera inte detta" eller till och med den mycket kraftfulla funktionen "redigera".

  3. När du är nöjd med de ändringar du vill inkludera, bör du verifiera vad som har förberetts för den första incheckningen genom att använda git diff --cached. Detta visar alla ändringar som har flyttats till indexet och som snart kommer att checkas-in.

  4. Sedan, checka-in ändringarna som lagras i indexet. Alternativet -c anger att inchecknings-meddelandet ska förfyllas från det ursprungliga meddelandet som du började med i den första incheckningen. Detta är praktiskt för att undvika att skriva om det. HEAD@{1} är en speciell notation för den incheckning som HEAD brukade vara vid före den ursprungliga återställnings-incheckningen (för 1 ändring sedan). Se git-reflog[1] för mer information. Du kan också använda vilken annan giltig inchecknings-referens som helst.

  5. Du kan upprepa steg 2–4 flera gånger för att dela upp originalkoden i valfritt antal incheckningar.

  6. Nu har du delat upp många av ändringarna i egna incheckningar, och kanske inte längre använder patch-läget för git add för att välja alla återstående oincheckade ändringar.

  7. Kontrollera återigen att du har inkluderat det du vill. Du kan också kontrollera att git diff inte visar några återstående ändringar som ska checkas-in senare.

  8. Och slutligen skapa den slutliga incheckningen.

DISKUSSION

Tabellerna nedan visar vad som händer vid körning:

git reset --option target

att återställa HEAD till en annan incheckning (target) med olika återställningsalternativ beroende på filernas tillstånd.

I dessa tabeller är A, B, C och D några olika tillstånd för en fil. Till exempel betyder den första raden i den första tabellen att om en fil är i tillstånd A i arbetskatalogen, i tillstånd B i indexet, i tillstånd C i HEAD och i tillstånd D i målet, så kommer git reset --soft target att lämna filen i arbetskatalogen i tillstånd A och i indexet i tillstånd B. Den återställer (dvs. flyttar) HEAD (dvs. spetsen på den aktuella grenen, om du är på en) till target (som har filen i tillstånd D).

arbetande index HEAD target     arbetande index HEAD
----------------------------------------------------
 A       B     C    D     --soft   A       B     D
			  --mixed  A       D     D
			  --hard   D       D     D
			  --merge (otillåten)
			  --keep  (otillåten)
arbetande index HEAD target     arbetande index HEAD
----------------------------------------------------
 A       B     C    C     --soft   A       B     C
			  --mixed  A       C     C
			  --hard   C       C     C
			  --merge (otillåten)
			  --keep   A       C     C
arbetande index HEAD target     arbetande index HEAD
----------------------------------------------------
 B       B     C    D     --soft   B       B     D
			  --mixed  B       D     D
			  --hard   D       D     D
			  --merge  D       D     D
			  --keep  (otillåten)
arbetande index HEAD target     arbetande index HEAD
----------------------------------------------------
 B       B     C    C     --soft   B       B     C
			  --mixed  B       C     C
			  --hard   C       C     C
			  --merge  C       C     C
			  --keep   B       C     C
arbetande index HEAD target     arbetande index HEAD
----------------------------------------------------
 B       C     C    D     --soft   B       C     D
			  --mixed  B       D     D
			  --hard   D       D     D
			  --merge (otillåten)
			  --keep  (otillåten)
working index HEAD target         working index HEAD
----------------------------------------------------
 B       C     C    C     --soft   B       C     C
			  --mixed  B       C     C
			  --hard   C       C     C
			  --merge  B       C     C
			  --keep   B       C     C

git reset --merge is meant to be used when resetting out of a conflicted merge. Any mergy operation guarantees that the working tree file that is involved in the merge does not have a local change with respect to the index before it starts, and that it writes the result out to the working tree. So if we see some difference between the index and the target and also between the index and the working tree, then it means that we are not resetting out from a state that a mergy operation left after failing with a conflict. That is why we disallow --merge option in this case.

git reset --keep is meant to be used when removing some of the last commits in the current branch while keeping changes in the working tree. If there could be conflicts between the changes in the commit we want to remove and the changes in the working tree we want to keep, the reset is disallowed. That’s why it is disallowed if there are both changes between the working tree and HEAD, and between HEAD and the target. To be safe, it is also disallowed when there are unmerged entries.

The following tables show what happens when there are unmerged entries:

working index HEAD target         working index HEAD
----------------------------------------------------
 X       U     A    B     --soft  (disallowed)
			  --mixed  X       B     B
			  --hard   B       B     B
			  --merge  B       B     B
			  --keep  (disallowed)
working index HEAD target         working index HEAD
----------------------------------------------------
 X       U     A    A     --soft  (disallowed)
			  --mixed  X       A     A
			  --hard   A       A     A
			  --merge  A       A     A
			  --keep  (disallowed)

X means any state and U means an unmerged index.

GIT

En del av git[1]-sviten