close
Image
Svenska ▾ Topics ▾ Latest version ▾ git-reset last updated in 2.54.0

NAMN

git-reset - Sätt HEAD eller indexet till ett känt tillstånd

SYNOPSIS

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

BESKRIVNING

git reset gör något av följande:

  1. git reset [<mode>] <commit> changes which commit HEAD points to. This makes it possible to undo various Git operations, for example commit, merge, rebase, and pull.

  2. When you specify files or directories or pass --patch, git reset updates the staged version of the specified files.

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

    Set the current branch head (HEAD) to point at <commit>. Depending on <mode>, also update the working directory and/or index to match the contents of <commit>. <commit> defaults to HEAD. Before the operation, ORIG_HEAD is set to the tip of the current branch.

    <läge> måste vara ett av följande (standard --mixed):

    --mixed

    Leave your working directory unchanged. Update the index to match the new HEAD, so nothing will be staged.

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

    --soft

    Leave your working tree files and the index unchanged. For example, if you have no staged changes, you can use git reset --soft HEAD~5; git commit to combine the last 5 commits into 1 commit. This works even with changes in the working tree, which are left untouched, but such usage can lead to confusion.

    --hard

    Overwrite all files and directories with the version from <commit>, and may overwrite untracked files. Tracked files not in <commit> are removed so that the working tree matches <commit>. Update the index to match the new HEAD, so nothing will be staged.

    --merge

    Återställ indexet och uppdatera filerna i arbetskatalogen som skiljer sig mellan <incheckning> och HEAD, men behåll de som skiljer sig mellan indexet och arbetskatalogen (dvs. som har ändringar som inte har lagts till). Finns huvudsakligen för att återställa osammanfogade indexposter, som de som lämnas kvar av git am -3 eller git switch -m i vissa situationer. Om en fil som skiljer sig mellan <incheckning> och indexet har ändringar som inte har lagts till, avbryts återställningen.

    --keep

    Återställer indexposter och uppdaterar filer i arbetsträdet 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 arbetsträdet uppdateras, kommer användning av --recurse-submodules också rekursivt att återställa arbetsträdet för alla aktiva undermoduler enligt den incheckning som registrerats i superprojektet, och även ställa in undermodulernas HEAD så att de kopplas från vid den incheckningen.

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

    For all specified files or directories, set the staged version to the version from the given commit or tree (which defaults to HEAD).

    This means that git reset <pathspec> is the opposite of git add <pathspec>: it unstages all changes to the specified file(s) or directories. This is equivalent to git restore --staged <pathspec>....

    In this mode, git reset updates only the index (without updating the HEAD or working tree files). If you want to update the files as well as the index entries, use git-restore[1].

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

    Interactively select changes from the difference between the index and the specified commit or tree (which defaults to HEAD). The index is modified using the chosen changes.

    This means that git reset -p is the opposite of git add -p, i.e. you can use it to selectively unstage changes. See the "Interactive Mode" section of git-add[1] to learn how to use the --patch option.

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ägsmönster skickas i <fil> i stället för kommandoradsargument. Om <fil> är exakt - används standardindata. Sökvägsmönster separeras med LF eller CR/LF. Sökvägsmönster kan citeras enligt beskrivningen för konfigurationsvariabeln core.quotePath (se git-config[1]). Se även --pathspec-file-nul och globala --literal-pathspecs.

--pathspec-file-nul

Endast meningsfullt med --pathspec-from-file. Sökvägsmönsterposter 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. The number of context lines defaults to diff.context or 3 if the configuration variable is unset. (-U without <n> is silently accepted as a synonym for -p due to a historical accident).

--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ägsmönster>...

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

För mer information, se posten sökvägsmönster 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. Någon begär en hämtning ("pull"), och ändringarna verkar värda att sammanslås.

  3. Indexet har dock redan smutsats ned (d.v.s. indexet matchar inte HEAD-incheckningen). Men om det är känt att den pull som ska göras inte påverkar frotz.c eller filfre.c, återställs indexändringarna för dessa två filer. Ändringarna i arbetsträdet finns kvar där.

  4. Sedan kan hämtning och sammanslagning göras, och ändringarna i frotz.c och filfre.c kvar i arbetsträdet.

Ångra en incheckning och gör om
$ git commit ...
$ git reset --soft HEAD^      (1)
$ edit                        (2)
$ git commit -a -c ORIG_HEAD  (3)
  1. Det görs oftast när det visar sig att det som just checkades in är ofullständigt, eller att incheckningsmeddelandet stavades fel, eller båda. Lämnar arbetsträdet som det var före "återställning".

  2. Gör korrigeringar till arbetsträds-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 i stä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 sammanslagningsincheckning, så git reset --hard som är en synonym för git reset --hard HEAD rensar bort röran från indexfilen och arbetsträdet.

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

  4. Men det står klart att ämnesgrenen ännu 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 indexfilen och arbetsträdet till det tillståndet, och återställer grenens toppen till den incheckningen.

Ångra en sammanslagning eller pull inuti ett smutsig arbetsträd
$ git pull                         (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol                |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)
  1. Även om det kan finnas lokala modifieringar i arbetsträdet, går det tryggt att köra "git pull" när det är känt 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 arbetet med en stor ändring avbryts av en brådskande förfrågan om en snabb åtgärd. Filerna i arbetsträdet är ännu inte i skick att checkas in, men det finns behov av att gå till en annan gren för en snabb programfelsrättning.

$ 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. Det tar bort WIP-incheckningen från incheckningshistoriken och ställer in arbetsträdet till tillståndet precis innan ögonblicksbilden skapades.

  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. Det 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 arbetsträdet medan några tidigare incheckningar kastas bort

Anta att arbete pågår med något som checkas in, och att arbetet därefter fortsätter en stund till, men att det som finns i arbetsträdet i stället borde ligga på en annan gren som inte har något att göra med det som tidigare checkades in. Då går det att starta en ny gren och återställa den samtidigt som ändringarna i arbetsträdet behålls.

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

  2. I den ideala världen hade det kunnat stå klart att den tidigare incheckningen inte hörde hemma i det nya ämnet när branch2 skapades och växlades till (d.v.s. 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 många logiskt separata ändringar har skapats och checkats in tillsammans. Senare kan det visa sig vara bättre att ha varje logisk bit associerad med sin egen incheckning. Då kan git reset användas för att spola tillbaka historiken utan att ändra innehållet i de lokala filerna, och sedan kan git add -p användas successivt 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 incheckningsmeddelandet.

$ 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 arbetsträdet 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 checkas ändringarna som lagras i indexet in. Alternativet -c anger att incheckningsmeddelandet ska förfyllas med det ursprungliga meddelandet från den första incheckningen. Det är praktiskt för att slippa skriva om det. HEAD@{1} är en särskild notation för den incheckning som HEAD pekade på före den ursprungliga återställningsincheckningen (för 1 ändring sedan). Se git-reflog[1] för mer information. Det går också att använda vilken annan giltig incheckningsreferens 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 arbetsträdet, 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 arbetsträdet i tillstånd A och i indexet i tillstånd B. Den återställer (d.v.s. flyttar) HEAD (d.v.s. spetsen på den aktuella grenen, om HEAD pekar på en gren) 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)
arbetsindex   HUVUD mål           arbetsindex HUVUD
----------------------------------------------------
 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 är avsedd att användas vid återställning från en konfliktfylld sammanslagning. Varje sammanslagningsoperation garanterar att arbetsträds-filen som är involverad i sammanslagningen inte har en lokal förändring med avseende på indexet innan den startar, och att den skriver resultatet ut till arbetsträdet. Så om vi ser någon skillnad mellan indexet och målet och även mellan indexet och arbetsträdet, betyder det att vi inte återställer från ett tillstånd som en sammanslagningsoperation lämnade efter att ha misslyckats med en konflikt. Det är därför vi inte tillåter alternativet --merge i det här fallet.

git reset --keep är avsedd att användas när man tar bort några av de senaste incheckningarna i den aktuella grenen samtidigt som ändringarna behålls i arbetsträdet. Om det kan finnas konflikter mellan ändringarna i incheckningen vi vill ta bort och ändringarna i arbetsträdet vi vill behålla, är återställningen inte tillåten. Det är därför den inte är tillåten om det finns både ändringar mellan arbetsträdet och HEAD, och mellan HEAD och målet. För säkerhets skull är den inte heller tillåten när det finns poster som inte har sammanslagits.

Följande tabeller visar vad som händer när det finns osammanslagna poster:

arbetsindex   HEAD mål            arbetsindex HEAD
----------------------------------------------------
 X       U     A    B     --soft  (disallowed)
			  --mixed  X       B     B
			  --hard   B       B     B
			  --merge  B       B     B
			  --keep  (disallowed)
arbetsindex   HEAD mål            arbetsindex HEAD
----------------------------------------------------
 X       U     A    A     --soft  (disallowed)
			  --mixed  X       A     A
			  --hard   A       A     A
			  --merge  A       A     A
			  --keep  (disallowed)

X betyder valfritt tillstånd och U betyder ett osammanslaget index.

GIT

En del av git[1]-sviten