Reset або вярнуць канкрэтны файл у канкрэтную рэвізію з дапамогай Git?

Я ўнёс некаторыя змены ў файл, які быў перададзены некалькі разоў як частка групы файлаў, але цяпер хачу reset / вярнуць змены на яго назад у папярэднюю версію.

Я зрабіў git log разам з git diff , каб знайсці патрэбны мне варыянт, але проста не ведаю, як вярнуць файл ў ранейшы стан у мінулым.

3786
19 окт. зададзены Hates_ 19 каст. 2008-10-19 02:34 '08 у 2:34 2008-10-19 02:34
ответ 31 адказ
  • 1
  • 2

Мяркуючы, што Хэш камітаў, які вы хочаце, c5f567 :

 git checkout c5f567 -- file1/to/restore file2/to/restore 

Старонка кіраўніцтва git checkout дае больш інфармацыі.

Калі вы хочаце вярнуцца да фіксацыі да c5f567 , дадайце ~1 (працуе з любым лікам):

 git checkout c5f567~1 -- file1/to/restore file2/to/restore 

Як нататка, мне заўсёды было нязручна з гэтай камандай, таму што яна выкарыстоўвалася як для звычайных рэчаў (пераключэнне паміж галінамі), так і для незвычайных, разбуральных рэчаў (выключаючы змены ў працоўным каталогу).

5117
19 окт. адказ дадзены Greg Hewgill 19 каст. 2008-10-19 02:39 '08 у 2:39 2008-10-19 02:39

Вы можаце хутка прагледзець змены, унесеныя ў файл, выкарыстоўваючы каманду diff:

 git diff <commit hash> <filename> 

Затым, каб вярнуць канкрэтны файл гэтаму фіксатар, выкарыстоўвайце каманду reset:

 git reset <commit hash> <filename> 

Магчыма, вам давядзецца выкарыстоўваць опцыю --hard , калі ў вас ёсць лакальныя мадыфікацыі.

border=0

Добрым дакументазваротам для кіравання шляхавымі кропкамі з'яўляецца выкарыстанне тэгаў для чысціні кропак на вашай часовай шкале. Я не магу зразумець ваша апошняя прапанова, але тое, што вам можа спатрэбіцца, - гэта разыходжанне галінкі з папярэдняга моманту часу. Для гэтага выкарыстоўвайце зручную каманду checkout:

 git checkout <commit hash> git checkout -b <new branch name> 

Затым вы можаце пераўсталяваць гэта супраць сваёй асноўнай лініі, калі будзеце гатовыя аб'яднаць гэтыя змены:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. адказ дадзены Chris Lloyd 17 снеж. 2008-12-17 09:59 '08 у 09:59 2008-12-17 09:59

Вы можаце выкарыстоўваць любую спасылку на фіксацыю git, уключаючы SHA-1, калі гэта найбольш зручна. Справа ў тым, што каманда выглядае так:

git checkout [commit-ref] -- [filename]

319
08 апр. адказ дадзены foxxtrot 08 крас. 2009-04-08 00:48 '09 у 0:48 2009-04-08 00:48
 git checkout -- foo 

Гэта будзе Reset foo для HEAD. Вы таксама можаце:

 git checkout HEAD^ foo 

для адной рэвізіі і г.д.

256
29 авг. адказ дадзены Greg Hewgill 29 жнів. 2008-08-29 23:56 '08 у 23:56 2008-08-29 23:56

І каб вярнуцца да апошняй завершанай версіі, якая найбольш часта неабходная, вы можаце выкарыстоўваць гэтую больш простую каманду.

 git checkout HEAD file/to/restore 
114
14 янв. адказ дадзены CDR 14 студз. 2012-01-14 09:15 '12 у 09:15 2012-01-14 09:15

У мяне была такая ж праблема толькі цяпер, і я знайшоў гэты адказ прасцей за ўсё зразумець ( commit-ref - значэнне SHA змены ў часопісе, які вы хочаце адправіць назад):

 git checkout [commit-ref] [filename] 

Гэта ставіць гэтую старую версію ў ваш працоўны каталог, і адтуль вы можаце яе зафіксаваць, калі хочаце.

102
27 мая '09 в 20:52 2009-05-27 20:52 адказ дадзены bbrown 27 мая '09 а 20:52 2009-05-27 20:52

Калі вы ведаеце, колькі камітаў вам трэба вярнуцца, вы можаце выкарыстаць:

 git checkout master~5 image.png 

Мяркуецца, што вы знаходзіцеся ў галінцы master , а жаданая версія - 5.

88
07 апр. адказ дадзены Ron DeVera 07 крас. 2009-04-07 17:03 '09 у 17:03 2009-04-07 17:03

Я думаю, што знайшоў ... ад http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Часам вы проста хочаце вярнуцца і забыцца аб усіх зменах за пэўны момант, таму што ўсе яны маюць рацыі.

Пачніце з:

$ git log

які паказвае вам спіс апошніх камітаў і іх хэш SHA1.

Затым увядзіце:

$ git reset --hard SHA1_HASH

каб аднавіць стан для дадзенай фіксацыі і сцерці ўсе новыя запісы з запісу назаўжды.

78
17 дек. адказ дадзены jdee 17 снеж. 2008-12-17 09:53 '08 г. у 9:53 2008-12-17 09:53

Гэта спрацавала для мяне:

 git checkout <commit hash> file 

Затым зафіксуйце змена:

 git commit -a 
61
26 авг. адказ дадзены v2k 26 жнів. 2011-08-26 01:12 '11 у 01:12 2011-08-26 01:12

Вы павінны быць асцярожныя, калі кажаце "адкат". Калі вы выкарыстоўвалі адну версію файла ў commit $ A, а затым зрабілі два змены ў двух асобных камітаў $ B і $ C (так што вы бачыце, гэта трэцяя ітэрацыя файла), і калі вы скажаце "Я хачу вярнуцца да першага", вы сапраўды гэта маеце на ўвазе?

Калі вы хочаце пазбавіцца ад змен як другі, так і трэцяй ітэрацыі, гэта вельмі проста:

 $ git checkout $A file 

а затым вы фіксуеце вынік. Каманда запытвае "Я хачу праверыць файл з стану, запісанага фіксацыяй $ A".

З іншага боку, тое, што вы мелі на ўвазе, гэта пазбавіцца ад змены другі ітэрацыі (гэта значыць здзейсніць $ B), пры захаванні таго, што зафіксаваў файл $ C у файле, вы хацелі б вярнуць $ B

 $ git revert $B 

Звярніце ўвагу: хто б ні ствараў commit $ B, магчыма, не быў вельмі дысцыплінаваны і мог здзейсніць зусім незвязаныя змены ў адной і той жа фіксацыі, і гэта вяртанне можа тычыцца файлаў, выдатных ад файла, які вы бачыце, абразлівыя змены, таму вы можаце праверыць вынік старанна пасля гэтага.

54
11 янв. адказ дадзены gitster 11 студз. 2009-01-11 11:13 '09 у 11:13 2009-01-11 11:13

Цікава, 'git checkout foo' ня будзе працаваць, калі рабочая копія знаходзіцца ў каталогу з імем foo; аднак, як "w20> checkout HEAD foo" і "git checkout./foo" будзе:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. адказ дадзены Aaron Maenpaa 30 жнів. 2008-08-30 00:26 '08 у 0:26 2008-08-30 00:26

Тут rebase працуе:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 

Выкажам здагадку, што ў вас ёсць

 ---o----o----o----o master \---A----B <my branch> 

Першыя дзве каманды ... здзейсніць git выпіска git майстар пераўсталёўкі

... праверце галіна змяненняў, якія вы хочаце ўжыць да галінкі master . Каманда rebase бярэ камітаў з <my branch> (якія не знойдзены ў master ) і паўторна ўжывае іх да загалоўка master . Іншымі словамі, бацькоўскі элемент першага камітаў ў <my branch> больш не з'яўляецца папярэднім фіксатарам ў гісторыі master , а бягучых загалоўкам master . Дзве каманды такія ж, як:

 git rebase master <my branch> 

Магчыма, было б лягчэй запомніць гэтую каманду, так як галінкі "base" і "modify" відавочна.

. Канчатковы вынік:

 ---o----o----o----o master \----A'----B' <my branch> 

Апошнія дзве каманды ...

 git checkout master git merge <my branch> 

... выканайце хуткае зліццё для прымянення ўсіх змяненняў <my branch> на master . Без гэтага кроку фіксацыя rebase ня дадаецца да master . Канчатковы вынік:

 ---o----o----o----o----A'----B' master, <my branch> 

master і <my branch> абедзве спасылкі B' . Акрамя таго, з гэтага пункту можна бяспечна выдаліць спасылку <my branch> .

 git branch -d <my branch> 
32
24 февр. адказ дадзены cmcginty 24 февр. 2009-02-24 12:43 '09 у 12:43 2009-02-24 00:43

git -алиасы, awk і функцыі абалонкі для выратавання!

 git prevision <N> <filename> 

дзе <N> - гэта колькасць выпраўленняў файла для адкату для файла <filename> .
Напрыклад, каб праверыць неадкладную папярэднюю рэвізію аднаго файла x/y/zc , запусціце

 git prevision -1 x/y/zc 

Як працуе git предикция?

Дадайце ў свой gitconfig

наступнае:
 [alias] prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f" 

Каманда ў асноўным

  • выконвае git log ў паказаным файле і
  • выбірае адпаведны ідэнтыфікатар фіксацыі ў гісторыі файла і
  • выконвае git checkout ідэнтыфікатар commit для названага файла.

Па сутнасці, усё, што можна было б зрабіць уручную ў гэтай сітуацыі,
загорнуты ў адзін прыгожы, эфектыўны git -alias - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 адказ дадзены TheCodeArtist 01 мая '15 у 4:46 2015/05/01 04:46

Мне трэба падключыць EasyGit тут, які з'яўляецца абгорткай, каб зрабіць git больш даступным для пачаткоўцаў, ня заблытваючы дасведчаных карыстальнікаў. Адна з рэчаў, якія яна робіць, - дае больш значэнняў git revert . У гэтым выпадку вы проста скажаце:

eg revert foo/bar foo/baz

20
19 окт. адказ дадзены Aristotle Pagaltzis 19 каст. 2008-10-19 03:16 '08 у 03:16 2008-10-19 03:16

У выпадку, калі вы хочаце вярнуць файл у папярэднюю фіксацыю (і файл, які вы хочаце вярнуць ужо зафіксаваны), вы можаце выкарыстоўваць

 git checkout HEAD^1 path/to/file 

або

 git checkout HEAD~1 path/to/file 

Затым проста выканайце этап і зафіксуйце "новую" версію.

Узброіўшыся ведамі пра тое, што ў выпадку зліцця commit можа мець двух бацькоў, вы павінны ведаць, што HEAD ^ 1 з'яўляецца першым бацькам, а HEAD ~ 1 з'яўляецца другім бацькам.

Альбо будзе працаваць, калі ў дрэве ёсць толькі адзін бацька.

20
11 янв. адказ дадзены ModernIncantations 11 студз. 2014-01-11 03:29 '14 у 03:29 2014/01/11 03:29

Першая Reset Галава для мэтавага файла

 git reset HEAD path_to_file 

Другая праверка гэтага файла

 git checkout -- path_to_file 
19
04 апр. адказ дадзены Gulshan Maurya 04 крас. 2017-04-04 13:25 '17 У 13:25 2017/04/04 13:25

Звярніце ўвагу, што git checkout ./foo і git checkout HEAD ./foo не дакладна адно і тое ж; прыклад:

 $ echo A > foo $ git add foo $ git commit -m 'A' foo Created commit a1f085f: A 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 foo $ echo B >> foo $ git add foo $ echo C >> foo $ cat foo A B C $ git checkout ./foo $ cat foo A B $ git checkout HEAD ./foo $ cat foo A 

(Другі add апрацоўвае файл ў індэксе, але ён не атрымлівае здзейснена.)

git checkout ./foo азначае вяртанне шляху ./foo да індэксу ; даданне HEAD інструктуе Git вярнуць гэты шлях у індэкс адносна яго HEAD да гэтага.

19
31 авг. адказ дадзены Damien Diederen 31 жнів. 2008-08-31 14:54 '08 у 14:54 2008-08-31 14:54

Тут шмат прапаноў, большасць з іх у духу git checkout $revision -- $file . Пара невыразных альтэрнатыў:

 git show $revision:$file > $file 

А таксама, я часта выкарыстоўваю гэта толькі для таго, каб часова убачыць канкрэтную версію:

 git show $revision:$file 

ці ж

 git show $revision:$file | vim -R - 

(OBS: $file павінен пачынацца з прэфікса ./ калі гэта адносны шлях для git show $revision:$file To Work)

І тым больш дзіўна

 git archive $revision $file | tar -x0 > $file 
14
08 янв. адказ дадзены Peter V. Mørch 08 студз. 2016-01-08 01:19 '16 у 01:19 2016/01/08 01:19

Каб перайсці да папярэдняй версіі файла фіксацыі, атрымаеце нумар фіксацыі, скажам, eb917a1 то

 git checkout eb917a1 YourFileName 

Калі вам проста трэба вярнуцца да апошняй зарэгістраванай версіі

 git reset HEAD YourFileName git checkout YourFileName 

Гэта прывядзе вас да апошняга зафіксаванаму стане файла

11
25 февр. адказ дадзены shah1988 25 февр. 2014-02-25 17:01 '14 у 17:01 2014/02/25 17:01

Для мяне ні адзін адказ не здаваўся сапраўды ясным, і таму я хацеў бы дадаць мой, які здаецца супер простым.

У мяне ёсць Commit abc1 , і пасля яго я зрабіў некалькі (або адну мадыфікацыю) файла file.txt .

Цяпер скажыце, што я нешта сапсаваў у файле file.txt , і я хачу вярнуцца да папярэдняга Commit abc1 .

1. git checkout file.txt : гэта прывядзе да выдалення лакальных змяненняў, калі яны вам не патрэбныя.

2. git checkout abc1 file.txt : гэта прывядзе ваш файл да вашай жаданай версіі

3. git commit -m "Restored file.txt to version abc1" : гэта прывядзе да вашай рэверсіі.

  1. git push : гэта прывядзе ўсё ў аддалены рэпазітар

Паміж крокамі 2 і 3, вядома, вы можаце зрабіць git status , каб зразумець, што адбываецца. Звычайна вы павінны бачыць, што file.txt ўжо дададзены, і таму няма неабходнасці ў git add .

10
23 марта '17 в 0:33 2017-03-23 00:33 адказ дадзены kalmanIsAGameChanger 23 сакавіка '17 у 0:33 2017/03/23 00:33

git checkout ref | commitHash - filePath

напрыклад.

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 
10
26 сент. адказ дадзены Amos Folarin 26 сент. 2013-09-26 20:04 '13 у 20:04 2013/09/26 20:04

Многія адказы тут патрабуюць выкарыстоўваць git reset ... <file> або git checkout ... <file> , але пры гэтым вы страціце ўсе змены ў <file> , учыненыя пасля камітаў, які вы хочаце вярнуць.

Калі вы хочаце адмяніць змены толькі ад аднаго фіксацыі толькі ў адным файле, як гэта зрабіў бы git revert , але толькі для аднаго файла (або, скажам, падмноства файлаў фіксацыі), я прапаную выкарыстоўваць як git diff , так і git apply як гэта ( з <sha> = хэш камітаў, які вы хочаце вярнуць):

 git diff <sha>^ <sha> path/to/file.ext | git apply -R 

У прынцыпе, ён спачатку згенеруе патч, які адпавядае зменам, якія вы хочаце вярнуць, а затым адмяніце прымяненне патча, каб адкінуць гэтыя змены.

Вядома, ён не працуе, калі ревертированные радкі былі змененыя любым фіксацыяй паміж <sha1> і HEAD (канфліктам).

8
07 дек. адказ дадзены Vince 07 снеж. 2016-12-07 17:43 '16 у 17:43 2016/12/07 17:43

Выкарыстоўвайце git log для атрымання Хэш-ключа для канкрэтнай версіі, а затым выкарыстоўвайце git checkout <hashkey>

Заўвага. Не забудзьцеся ўвесці хэш перад апошнім. Апошні хэш паказвае бягучую пазіцыю (HEAD) і нічога не мяняе.

8
05 дек. адказ дадзены mustafakyr 05 снеж. 2011-12-05 23:09 '11 а 23:09 2011-12-05 23:09

Відавочна, каму-то трэба напісаць зразумелую кнігу на git або git, каб яе лепш растлумачыць у дакументацыі. Сутыкнуўшыся з гэтай жа праблемай, я здагадаўся, што

 cd <working copy> git revert master 

адмяняе апошняе здзяйсненне, якое, як уяўляецца, робіць.

Ян

7
16 дек. адказ дадзены Ian Davis 16 снеж. 2011-12-16 06:03 '11 у 06:03 2011-12-16 06:03

Калі вы робіце няправільны файл у вашых апошніх камітаў, выконвайце інструкцыі:

  1. дрэва з адкрытым зыходным кодам, зменіце гэты комм

2019

23 авг. адказ дадзены saber tabatabaee yazdi 23 жнів. 2018-08-23 12:53 '18 у 12:53 2018/08/23 00:53

Вы можаце зрабіць гэта ў 4 этапы:

  1. адмяніць увесь комм з файлам, які вы хочаце спецыяльна адмяніць - гэта створыць новы комм ў вашай галінцы
  2. soft reset that commit - выдаляе комм і перамяшчае змены ў працоўную вобласць
  3. адабраць файлы ўручную, каб вярнуць і зафіксаваць іх
  4. кінуць ўсе астатнія файлы ў вашай працоўнай вобласці

Што трэба набраць у сваім тэрмінале:

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> git commit -m 'reverting file'
  4. git checkout.

поспехі

4
08 мая '18 в 13:26 2018-05-08 13:26 адказ дадзены Nir M. 08 мая '18 у 13:26 2018/05/08 13:26
 git revert <hash> 

Верне зададзеную фіксацыю. Падобна на тое, вы думаеце, што git revert ўплывае толькі на апошняе здзяйсненне.

Гэта не вырашыць вашу праблему, калі вы хочаце адмяніць змяненне ў пэўным файле і што commit змяніўся больш, чым гэты файл.

4
17 дек. адказ дадзены Otto 17 снеж. 2008-12-17 21:56 '08 а 21:56 2008-12-17 21:56

Вось мой шлях.

a) У Android Studio адкрыйце файл.

b) git → Паказаць гісторыю, знайсці папярэднюю фіксацыю, да якой я хачу вярнуцца. Атрымаеце commit_id (г.зн. Commit hash).

c) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 адказ дадзены Francis Bacon 13 сакавіка '17 у 11:10 2017/03/13 11:10

Калі вы выкарыстоўваеце Git Extensions і хочаце вярнуцца да бацькоўскага фіксацыі для файла, вы можаце выбраць фіксацыю, якая змяшчае змены, якія хочаце вярнуць, затым выбраць ўкладку "Diff" ў дэталях пстрыкніце правай кнопкай мышы файл, які вы хочаце вярнуць, затым Reset файл на " .... ", затым" A "(бацькоўскі)

1
26 сент. адказ дадзены Johnny 26 сент. 2017-09-26 04:48 '17 г. ў 4:48 2017/09/26 04:48

Гэта вельмі просты крок. Выміце файл з ідэнтыфікатарам фіксацыі, які мы хочам, тут адзін ідэнтыфікатар фіксацыі раней, а затым проста выканайце каманду git commitmend, і ўсё гатова.

 # git checkout <previous commit_id> <file_name> # git commit --amend 

Гэта вельмі зручна. Калі мы хочам вывесці які-небудзь файл з любым ідэнтыфікатарам папярэдняй фіксацыі ў верхняй частцы фіксацыі, мы можам лёгка гэта зрабіць.

1
24 янв. адказ дадзены Abhishek Dwivedi 24 студз. 2019-01-24 20:21 '19 у 20:21 2019/01/24 20:21
  • 1
  • 2

Іншыя пытанні па пазнаках або Задайце пытанне