Git'i istifadə edərək xüsusi bir dosyanın müəyyən bir versiyaya qaytarılması və ya qaytarılması?

Bir neçə dəfə bir qrup faylın bir hissəsi kimi ötürülən faylda bəzi dəyişikliklər etdik, amma indi dəyişiklikləri əvvəlki versiyaya qaytarmaq / bərpa etmək istəyirəm.

Lazım olan variantları tapmaq üçün git diff ilə yanaşı, git diff etdi, amma faylın keçmişdə necə geri alınacağını bilmirəm.

3762
19 окт. Hates_ 19 oktyabr ayı . 2008-10-19 02:34 '08 saat 02:34 'da 2008-10-19 02:34
@ 30 cavab

c5f567 :

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

Git yoxlama təlimatı səhifəsində daha ətraflı məlumat verilir.

c5f567 əməl etmək üçün geri qayıtmaq istəyirsinizsə, ~1 (hər hansı bir sayı ilə c5f567 ) əlavə edin:

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

Qeyd kimi mən həmişə adi şeylər (şöbə arasında keçid) və qeyri-adi, dağıdıcı şeylər üçün (iş kataloqunda dəyişiklik istisna olmaqla) istifadə olunduğu üçün həmişə bu komanda ilə narahat idi.

5083
19 окт. Greg Hewgill tərəfindən verilmiş cavab 19 oktyabr 2008-10-19 02:39 '08 at 2:39 2008-10-19 02:39

Fərdi komutdan istifadə edərək faylda edilən dəyişiklikləri tez bir zamanda nəzərdən keçirə bilərsiniz:

 git diff <commit hash> <filename> 

Sonra, bu fiksatora xüsusi bir fayl qaytarmaq üçün sıfırlama əmrini istifadə edin:

 git reset <commit hash> <filename> 

Yerli dəyişiklikləriniz varsa, - --hard seçimini istifadə etmək --hard .

border=0

Səs nöqtələrini idarə etmək üçün yaxşı bir sənəd axını, zaman çizelgesinizdeki xalları təmizləmək üçün etiketləri istifadə etməkdir. Son cümləni başa düşmürəm, ancaq ehtiyac duyduğunuz şəffaflığın əvvəlki nöqtədən vaxtında ayrılmasıdır. Bunun üçün əlverişli check əmrini istifadə edin:

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

Sonra bu dəyişiklikləri birləşdirməyə hazır olduqda onu əsas xəttinizə bərpa edə bilərsiniz:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
540
17 дек. 17 dekabrda Chris Lloyd tərəfindən verilmiş cavab 2008-12-17 09:59 '08 at 9:59 2008-12-17 09:59

Siz ən uyğun olarsa, SHA-1 daxil olmaqla, git tövsiyəsi üçün hər hansı bir keçiddən istifadə edə bilərsiniz. Əslində komandanın belə olduğu görünür:

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

319
08 апр. cavab foxxtrot 08 apr verilir . 2009-04-08 00:48 '09 at 0:48 2009-04-08 00:48
 git checkout -- foo 

Bu HEAD üçün sıfırlama foo olacaq. Siz həmçinin:

 git checkout HEAD^ foo 

bir təftiş üçün və s.

256
29 авг. Greg Hewgill tərəfindən verilmiş cavab Aug 29 2008-08-29 23:56 '08 at 11:56 pm 2008-08-29 23:56

Və ən çox lazım olan sonuncu tamamlanmış versiyaya geri dönmək üçün bu sadə komandan istifadə edə bilərsiniz.

 git checkout HEAD file/to/restore 
114
14 янв. cavab CDR 14 yanvar verilir . 2012-01-14 09:15 '12 at 9:15 2012-01-14 09:15

Mən indi də eyni problemə sahib oldum və bu cavabı anlamaq üçün asanlıqla tapdım ( commit-ref salınma, geri göndərmək istədiyiniz gündəki SHA dəyişikliyinin dəyəri):

 git checkout [commit-ref] [filename] 

Bu, bu köhnə versiyanı iş kitabçanıza qoyur və istədiyiniz yerdə onu düzəldə bilərsiniz.

101
27 мая '09 в 20:52 2009-05-27 20:52 cavab 27 may 09: 00-da 20:52, 2009-05-27 20:52 tarixində verilir

Əgər geri qayıtmaq üçün nə qədər əməlləri bilirsinizsə, istifadə edə bilərsiniz:

 git checkout master~5 image.png 

master şöbəsində olduğunuz və istədiyiniz versiyanın 5 olduğu varsayılır.

88
07 апр. Cavab Ron DeVera tərəfindən verilir 07 Apr 2009-04-07 17:03 '09 at 05:03 PM 2009-04-07 17:03

Hesab edirəm ki, tapdım ... http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Bəzən yalnız geri dönmək və müəyyən bir nöqtə üçün bütün dəyişiklikləri unutmaq istəyirsən, çünki bunların hamısı yanlışdır.

Başlanğıc:

$ git log

sizə son əməllərin siyahısı və onların SHA1 hash göstərən.

Sonra daxil edin:

$ git reset --hard SHA1_HASH

dövləti müəyyən bir əməl üçün dövləti bərpa etmək və bütün yeni qeydləri yazmadan uzaqlaşdırmaq.

78
17 дек. cavab jdee 17 dekabr verilir . 2008-12-17 09:53 '08 at 09:53 2008-12-17 09:53

Mənim üçün çalışdı:

 git checkout <commit hash> file 

Sonra dəyişikliyə əməl edin:

 git commit -a 
61
26 авг. Cavab verilir v2k 26 aug. 2011-08-26 01:12 '11 1:12 'də 2011-08-26 01:12

"Geri qaytarma" deyərkən diqqətli olmalısan. Faylın bir versiyasını $ A-da istifadə edərdinizsə, sonra $ B və $ C-ə iki fərqli dəyişiklik etdiniz (belə ki, görürsən, bu faylın üçüncü təkrarlanmasıdır) və "İlk geri dönmək istəyirəm" deyirsinizsə, həqiqətən demək mi?

Həm ikinci, həm də üçüncü iteratsiyada dəyişikliklərdən xilas olmaq istəyirsinizsə, çox sadədir:

 $ git checkout $A file 

sonra nəticəni düzəldirsiniz. Komanda "Faylın $ A öhdəliyi ilə yazılmış dövlətdən faylın yoxlanmasını istəyir" soruşur.

Digər tərəfdən, yadda saxladığınız şey, ikinci İterasyon dəyişikliyindən (yəni $ B etmək) qurtarmaqdır, faylda $ C faylını sabitlədiyinizə baxmayaraq, $ B

 $ git revert $B 

Qeyd: B-ə əməl edən hər kəs çox intizamlı ola bilər və eyni tövsiyə ilə tamamilə əlaqəsiz dəyişikliklər edə bilər və bu qaytarma gördüyünüz fayldan başqa fayllar, təhqiramiz dəyişikliklər ola bilər. bundan sonra diqqətlə nəticə çıxarmaq olar.

54
11 янв. cavab gitster tərəfindən verilir 11 yanvar. 2009-01-11 11:13 '09 at 11:13 'da 2009-01-11 11:13

Maraqlıdır ki, işlədiyi kopiya foo adlı bir kataloqda olarsa 'git checkout foo' işləməyəcək; ancaq "w20> checkout HEAD foo" və "git checkout./foo" kimi olacaq:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. Cavab Aaron Maenpaa tərəfindən verilir 30 aug. 2008-08-30 00:26 '08 at 0:26 2008-08-30 00:26

Burada rebase işləyir:

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

Söyləyin

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

İlk iki komanda ... bir git checkout git yenidən sihirbazı qurun

... Magistral şöbəyə müraciət etmək istədiyiniz dəyişikliklərin filialını yoxlayın. rebase əmri, <my branch> rebase <my branch> ( rebase və onları master başlığına qaytarır. Başqa sözlə, <my branch> ilk törətmənin əsas elementi artıq master tarixdə əvvəlki fixer deyil, ancaq mövcud master başlığıdır. İki komanda eynidır:

 git rebase master <my branch> 

Yəqin ki, "əsas" və "dəyişdirmək" şöbələri açıq olduğundan bu əmri yadda saxlamaq daha asan olardı.

. Son nəticə:

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

Son iki komanda ...

 git checkout master git merge <my branch> 

... bütün <my branch> dəyişiklikləri tətbiq etmək üçün sürətli birləşməni həyata keçirin. Bu addım olmadan, bir rebase tövsiyəsi ustaya əlavə edilmir. Son nəticə:

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

master<my branch> iki istinaddır B' . Bundan əlavə, bu nöqtədən etibarlı olaraq <my branch> linkini çıxara bilərsiniz.

 git branch -d <my branch> 
32
24 февр. Cavab ccginty 24 fevralda verilir. 2009-02-24 12:43 '09 da 12:43 'de 2009-02-24 12:43

git aliases, awk və shell funksiyaları xilas üçün!

 git prevision <N> <filename> 

burada <N> fayl <filename> üçün geri qaytarma üçün fayl düzeltmelerinin sayıdır.
Məsələn, bir x/y/zc faylının əvvəlki revizyonunu yoxlamaq üçün x/y/zc

 git prevision -1 x/y/zc 

Go proqnozu necə işləyir?

Sizin gitconfig əlavə edin

aşağıdakılar:
 [alias] prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f" 

Əsaslıdır

  • git log faylını qeyd olunan faylda yerinə yetirir
  • fayl tarixçəsindəki müvafiq tövsiyə ID-i və seçir
  • müəyyən bir fayl üçün git checkout tamamlama idini yerinə yetirir.

Əslində bu vəziyyətdə əl ilə edilə biləcək hər şey
bir gözəl, təsirli git-alias - keç-prevision bükülmüş

21
01 мая '15 в 4:46 2015-05-01 04:46 Cavab TheCodeArtist tərəfindən verilir 01 May '15 4:46 2015-05-01 04:46

EasyGit'i buraya bağlamalıyam. Bu, təcrübəli istifadəçiləri qarışıqlaşdırmadan yeni başlayanlar üçün daha əlverişli olmaq üçün bir sarmalandırıcıdır. Yaptığı şeylərdən biri daha çox git revert dəyərlər verir . Bu vəziyyətdə yalnız deyirsiniz:

eg revert foo/bar foo/baz

20
19 окт. Cavab Aristotel Pagaltzis 19 oktyabr verilir . 2008-10-19 03:16 '08 saat 03:16 'da 2008-10-19 03:16

Faylı əvvəlki tövsiyələrə qaytarmaq istədiyiniz halda (və qaytarmaq istədiyiniz fayl artıq müəyyənləşdirilmişdir) istifadə edə bilərsiniz

 git checkout HEAD^1 path/to/file 

və ya

 git checkout HEAD~1 path/to/file 

Sonra sadəcə addımı yerinə yetirin və "yeni" versiyasını düzəldin.

Birləşmə halında, birləşmə halında iki valideynə sahib ola biləcəyini bildiyiniz üçün, HEAD ^ 1-i ilk valideyndir və HEAD ~ 1 ikinci valideyndir.

Və ya ağacda yalnız bir valideyn varsa, işləyəcək.

20
11 янв. Cavab ModernIncantations tərəfindən verilir . 2014-01-11 03:29 '14 da 3:29 2014-01-11 03:29

Qeyd edək ki, git checkout ./foogit checkout HEAD ./foo eyni şey deyil; Məsələn:

 $ 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 

(İkinci add , faylın indeksdə işlədilməsinə baxmayaraq, işə yaramır.)

git checkout ./foo yolunu qayıtmaq deməkdir ./foo indeksi ; bir HEAD əlavə edərək, HEAD indiyə qədər bu indeks yolunu HEAD ə qaytarmağı əmr edir.

19
31 авг. Cavab Damien Diederen tərəfindən 31 avqustda verilir 2008-08-31 14:54 '08 at 2:54 pm 2008-08-31 14:54

Hədəf faylının ilk başını sıfırlayın

 git reset HEAD path_to_file 

Bu faylın ikinci yoxlaması

 git checkout -- path_to_file 
19
04 апр. Cavab Gülshan Maurya 04 apr tərəfindən verilir . 2017-04-04 13:25 '17 saat 13:25 'də 2017-04-04 13:25

Buradakı bir çox tövsiyə var, bunların əksəriyyəti git checkout $revision -- $file ruhunda git checkout $revision -- $file . Bir neçə qaranlıq alternativ:

 git show $revision:$file > $file 

Həm də, onu tez-tez yalnız müəyyən bir versiyanı müvəqqəti olaraq görmək üçün istifadə edirəm:

 git show $revision:$file 

və ya

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

(OBS: $file prefiks ilə başlamalıdır. ./ Bu git show $revision:$file üçün git show $revision:$file nisbətən nisbi bir yoldur git show $revision:$file işə salınması)

Və daha qəribədir

 git archive $revision $file | tar -x0 > $file 
14
08 янв. Peter V. Mørch tərəfindən cavabı Jan 08 2016-01-08 01:19 '16 'da 1:19' də 2016-01-08 01:19 'da

Təqdimat faylının əvvəlki versiyasına getmək üçün, əmanət nömrəsini almaq, demək, sonra eb917a1

 git checkout eb917a1 YourFileName 

Yalnız son qeydiyyatdan keçmiş versiyaya qayıtmaq lazımdır.

 git reset HEAD YourFileName git checkout YourFileName 

Bu, faylın son qeydə alındığı dövlətə aparacaq.

11
25 февр. cavab şah1988 verildi 25 fevral. 2014-02-25 17:01 '14 da 17:01 2014-02-25 17:01

git checkout ref | commitHash - filePath

məsələn.

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 
10
26 сент. Cavab Amos Folarin 26 sep verilir . 2013-09-26 20:04 '13 at 20:04 2013-09-26 20:04

Mənim üçün heç bir cavab həqiqətən aydın görünməmişdi və buna görə də əlavə sadə görünən mina əlavə etmək istərdim.

Mən bir abc1 var və sonra bir neçə (və ya bir dəyişiklik) file.txt faylını etdik.

İndi mənə fayl file.txt faylında bir abc1 və əvvəlki abc1 .

1. git checkout file.txt : ehtiyac olmadıqda bu yerli dəyişiklikləri aradan qaldıracaq.

2. git checkout abc1 file.txt : bu faylınızı istədiyiniz versiyaya aparacaq

3. git commit -m "Restored file.txt to version abc1" : bu, çevrilməyə səbəb olacaq.

  1. git push : Bu, hər şeyi uzaq bir depoya gətirəcək

Əlbəttə, 2-ci və 3-cü addımlar arasında git status başa düşmək üçün git status edə bilərsiniz. Ümumiyyətlə, file.txt artıq əlavə edilmiş olduğunu görə bilərsiniz və bu səbəbdən git add etməliyik.

10
23 марта '17 в 0:33 2017-03-23 00:33 Cavab 23-31 Mart tarixində 0:33 2017-03-23 ​​00:33 tarixində kalmanIsAGameChanger tərəfindən verilir

Müəyyən bir versiya üçün hash düyməsini almaq üçün git log istifadə edin və sonra git checkout <hashkey>

Qeyd Sonuncudan əvvəl haşiyə daxil olmağı unutmayın. Son xaş mövcud mövqeyi göstərir (HEAD) və heç bir şey dəyişmir.

8
05 дек. Cavab verilir mustafakyr 05 dekabr . 2011-12-05 23:09 '11 at 23:09 2011-12-05 23:09

Şübhəsiz ki, kimsə sənəd və sənədlərdə bunu daha yaxşı izah etmək üçün git və ya git haqqında aydın bir kitab yazmalıdır. Eyni problemlə qarşılaşdığımda bunu təxmin etdilər

 cd <working copy> git revert master 

Ən son törətməni tərsinə çevirir.

Ian

7
16 дек. Cavab Ian Davis tərəfindən 16 dekabrda verilir . 2011-12-16 06:03 '11 'da 6:03' da 2011-12-16 06:03

Buradaki cavabların bir çoxu git reset ... <file> və ya git checkout ... <file> istifadə git reset ... <file> tələb edir, lakin qayıtmaq istədiyiniz törədildikdən sonra edilən bütün dəyişiklikləri <file> itirəcək.

Yalnız bir əməldən yalnız bir faylya dəyişiklikləri ləğv etmək istəyirsinizsə, go kimi git revert edərsiniz, ancaq yalnız bir faylda (ya da, məsələn, faylların bir alt kümesi), mən də git diffgit apply kimi istifadə etməliyəm. <sha> = qayıtmaq istədiyiniz törətmənin hashi ilə):

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

Prinsipcə, ilk növbədə qayıtmaq istədiyiniz dəyişikliklərə uyğun bir yamaq yaradır və sonra bu dəyişiklikləri ləğv etmək üçün yamanın tətbiqini ləğv edəcəyik.

Əlbəttə ki, geri çəkilən xətlər " <sha1>HEAD (münaqişə) arasında hər hansı bir əməl ilə dəyişdirildikdə işləmir.

7
07 дек. cavab Vince 07 dekabr verilir . 2016-12-07 17:43 '16 saat 17:43 'da 2016-12-07 17:43

Son vəzifələrinizdə yanlış fayl yaratsanız, təlimatları izləyin:

  1. açıq mənbə ağacı, bu tövsiyəni dəyişdirin

2019

23 авг. saber tabatabaee tərəfindən verilmiş cavab yazdı 23 avqust . 2018-08-23 12:53 '18 at 12:53 2018-08-23 12:53
 git revert <hash> 

Göstərilən əmrləri qaytarır. git revert yalnız son törətməyə təsir edirəm.

Belirli bir dosyanın değişikliğini geri almaq və bu talebin bu dosyadan daha çox değiştiğini istəyirsinizsə, bu probleminizi çözmez.

4
17 дек. Otto 17 dekabrda cavablandırdı. 2008-12-17 21:56 '08 at 21:56 pm 2008-12-17 21:56

Bunu 4 addımda edə bilərsiniz:

  1. lütfən ləğv etmək istədiyiniz faylla bütün öhdəliyi ləğv edin - bu, işinizdə yeni bir öhdəlik yaradır
  2. təyini yerinə yetirən yumşaq sıfırlama - təyanı aradan qaldırır və dəyişiklikləri iş sahəsinə daşıyır
  3. qayıtmaq və kilidləmək üçün faylları əl ilə seçin
  4. iş yerinizdeki bütün digər faylları buraxın

Terminalinizə yığmaq üçün nə lazımdırsa :

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

uğurlar

3
08 мая '18 в 13:26 2018-05-08 13:26 cavab Nir M. 08 may, saat 18: 00-da verilir. 2018-05-08 13:26

Mənim yolum.

a) Android Studiyada, faylını açın.

b) keçmək → Tarix göstər, geri dönmək istədiyim əvvəlki işi tapın. Commit_id edin (məsələn, hash əmri).

c) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 Cavab Francis Bacon tərəfindən 13 Mart 'da 11:10' də 2017-03-13 11:10 'də verilir

Git Extensions istifadə etsəniz və fayl üçün üst törətməyə qayıtmaq istəyirsən, qayıtmaq istədiyiniz dəyişiklikləri ehtiva edən öhdəliyi seçə bilərsiniz, daha sonra "Diff" sekmesini ətraflı olaraq seçə bilərsiniz, sonra qaytarmaq istədiyiniz faylın üzərinə sağ basın, .... ", sonra" A "(ana)

1
26 сент. cavab johnny 26 sentyabr tərəfindən verilmişdir . 2017-09-26 04:48 '17 'da 4:48' də 2017-09-26 04:48 'də

Bu, çox sadə bir addımdır. Dosyayı istediğimiz kalıcı kimlik ile çıxarın, burada əvvəl bir tecil kimliği var, sonra git commitmend komutunu çalıştırın ve bitirdiniz.

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

Bu çox rahatdır. Hər hansı bir faylın əvvəlki törətmənin hər hansı bir identifikatoru ilə üst səviyyədə çıxmasını istəyiriksə, bunu asanlıqla edə bilərik.

0
24 янв. Abhishek Dwivedi tərəfindən 24 yanvarda cavab verildi 2019-01-24 20:21 '19 saat 20:21 'də 2019-01-24 20:21' də

bağlı digər suallar və ya bir sual verin