Отмени работните копия на един файл в git?

След последния коммит промених един куп файлове в работното си копие, но искам да отхвърля промените в един от тези файлове, както при рестартиране, в същото състояние като последния.

Въпреки това, искам само да отмените промените в работното копие само на един файл, нищо повече с него.

Как да направите това?

1386
28 марта '09 в 8:09 2009-03-28 08:09 hasen е март 28, '09 в 8:09 2009-03-28 08:09
@ 14 отговора

Можете да използвате

 git checkout -- file 

Можете да направите това без -- (както е предложено от nimrodm), но ако името на файла изглежда като клон или маркер (или друг идентификатор на ревизия), може да е объркващо, така че е по-добре да използвате -- .

Можете също да проверите конкретната версия на файла:

 git checkout v1.2.3 -- file # tag v1.2.3 git checkout stable -- file # stable branch git checkout origin/master -- file # upstream master git checkout HEAD -- file # the version from the most recent commit git checkout HEAD^ -- file # the version before the most recent commit 
1917
28 марта '09 в 9:12 2009-03-28 09:12 отговори на Brian Campbell на 28 март 2009 г. в 9:12 2009-03-28 09:12
 git checkout <commit> <filename> 

Използвах го днес, защото осъзнах, че иконата ми е презаписана от няколко коммита, когато надстроих до drupal 6.10, така че трябваше да го върна. Ето какво направих:

border=0
 git checkout 088ecd favicon.ico 
120
28 марта '09 в 13:25 2009-03-28 13:25 отговорът е даден neoneye 28 март '09 в 13:25 2009-03-28 13:25

Просто използвайте

 git checkout filename 

Това ще замени името на файла с най-новата версия от текущия клон.

ВНИМАНИЕ: промените ви ще бъдат отхвърлени - архивът не се запазва.

108
28 марта '09 в 8:55 2009-03-28 08:55 отговорът е даден nimrodm 28 март '09 в 8:55 2009-03-28 08:55

Ако вашият файл вече е бил доставен (възниква, когато правите git add и т.н. след редактиране на файла), за да забраните промените.

употреба

 git reset HEAD <file> 

след това

 git checkout <file> 

Ако все още не сте доставили, просто използвайте

 git checkout <file> 
57
03 июля '12 в 8:46 2012-07-03 08:46 отговорът е даден thanikkal 03 юли '12 в 8:46 2012-07-03 08:46

Ако просто искате да отмените предишните промени в ангажимента на този файл, можете да опитате следното:

 git checkout branchname^ filename 

Това ще провери файла по същия начин, както преди последното фиксиране. Ако искате да branchname~n малко повече, използвайте branchname~n на branchname~n .

15
28 марта '09 в 8:25 2009-03-28 08:25 отговор, даден от sykora на 28 март 2009 г. в 8:25 2009-03-28 08:25

Направих го през git bash:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Git статус. [Така че, видяхме един файл модифициран.]
  2. git checkout - index.html [Промених в файла index.html:
  3. git status [тези промени вече са изтрити]

2019

10 апр. Отговорът е даден от Shivanandam Sirmarigari на 10 април. 2018-04-10 17:54 '18 в 17:54 ч. 2018-04-10 17:54

Винаги съм объркан с това, така че ето пример за проверка на напомняне; да кажем, че имаме bash скрипт за тестване на git :

 set -x rm -rf test mkdir test cd test git init git config user.name test git config user.email test@test.com echo 1 > a.txt echo 1 > b.txt git add * git commit -m "initial commit" echo 2 >> b.txt git add b.txt git commit -m "second commit" echo 3 >> b.txt 

На този етап промяната не се извършва в кеша, така че git status :

 $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a") 

Ако от този момент направим git checkout , резултатът ще бъде следният:

 $ git checkout HEAD -- b.txt $ git status On branch master nothing to commit, working directory clean 

Ако вместо това извършим git reset , резултатът е:

 $ git reset HEAD -- b.txt Unstaged changes after reset: M b.txt $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a") 

Така че, в този случай - ако промените не са зададени, git reset не е от значение, а git checkout замества промените.


Сега нека кажем, че последната промяна от скрипт по-горе е доставена / кеширана, т.е. направихме също git add b.txt в края.

В този случай, git status в този момент:

 $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: b.txt 

Ако от този момент направим git checkout , резултатът ще бъде следният:

 $ git checkout HEAD -- b.txt $ git status On branch master nothing to commit, working directory clean 

Ако вместо това извършим git reset , резултатът е:

 $ git reset HEAD -- b.txt Unstaged changes after reset: M b.txt $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a") 

Така че, в този случай - ако промените бъдат доставени, git reset ще направи основно промени в неуточнени промени, а git checkout презапише напълно промените.

7
09 февр. отговорът е даден sdaau 09 Feb. 2016-02-09 11:56 '16 в 11:56 2016-02-09 11:56

Възстановявам файловете си с SHA-id, което правя git checkout <sha hash id> <file name>

5
22 мая '12 в 23:39 2012-05-22 23:39 Отговорът е даден Beto 22 май '12 в 23:39 ч. 2012-05-22 23:39

Този отговор е за командата, необходима за отмяна на местни промени, които са в няколко конкретни файла в една или повече папки (или директории). Този отговор, по-специално, отговаря на въпроса къде потребителят има повече от един файл, но не иска да отмени всички местни промени:

ако имате един или повече файлове, можете да приложите същата команда ( git checkout -- file ) към всеки от тези файлове, като посочите всяко от техните местоположения, разделени с интервали, както е в:

 git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext 

отбележете пространството по-горе между name1 / name2 / fileOne.ext имеА / подпапка / fileTwo.ext

За няколко файла в една и съща папка:

Ако трябва да отхвърлите промените за всички файлове в определена директория, използвайте git checkout както следва:

 git checkout -- name1/name2/* 

Звездичката, посочена по-горе, изпълнява процедурата за изтриване на всички файлове в това местоположение с име / име2.

По подобен начин следното може да отмени промените във всички файлове за няколко папки:

 git checkout -- name1/name2/* nameA/subFolder/* 

отново отбележете интервала между име1 / име2 / * име А / подпапка / * в горното.

Забележка: name1, name2, nameA, subFolder - всички примери за имена на папки показват папката или пакета, в който могат да се намират въпросните файлове.

4
24 янв. Отговорът е даден на Nirmal Jan 24 2017-01-24 00:26 '17 в 0:26 2017-01-24 00:26

Ако не сте кликнали или не споделили по друг начин съобщението си:

 git diff --stat HEAD^...HEAD | \ fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ -- git commit -a --amend 
2
30 апр. Отговорът е даден от Джеси Глик на 30 април 2014-04-30 22:45 '14 в 22:45 ч. 2014-04-30 22:45

За мен само този работи

 git checkout -p filename 

2019

19 авг. отговорът е даден Ramesh Bhupathi 19 август. 2017-08-19 17:28 '17 в 17:28 2017-08-19 17:28

Ако вече е извършено, можете да отмените промяната за файла и да я обвържете отново, и след това да изтеглите новия ангажимент с последния фиксатор.

0
26 апр. отговорът е даден от Джина на 26 април. 2017-04-26 22:17 '17 в 22:17 часа 2017-04-26 22:17

Не знам защо, но когато се опитам да въведа кода си, той изглежда като изображение.

2019

31 дек. отговорът е даден на ген 31 декември. 2018-12-31 18:55 '19 в 18:55 ч. 2018-12-31 18:55

За специалния случай, когато

  • използвайте gerrit (или друг набор), за да видите кода

  • вече сте направили промяната

  • вече изпратени за преглед

  • искате да отмените промените само в определен файл.

  • Не искате да нулирате и да извикате нова сесия за преглед

Намерих следната последователност, която би била най-удобна:

  • Получете настройка за промяна за конкретно git файл HEAD [targe_file_name]> path / file.patch

  • Отхвърлете промяната, направена в конкретния файл -R path / file.patch на git

  • Извършване на преглед и преглед git add -u git commit --помощ git review

-1
24 окт. отговор, даден от Zhenhua на 24 октомври 2017-10-24 04:18 '17 в 4:18 2017-10-24 04:18

Други въпроси относно таговете или Задайте въпрос