Git'i kullanarak belirli bir dosyayı belirli bir revizyona sıfırlama veya iade etme.

Bir dosya grubunun parçası olarak birkaç kez aktarılan dosyada bazı değişiklikler yaptım, ancak şimdi değişiklikleri önceki sürümüne geri döndürmek / sıfırlamak istiyorum.

İhtiyacım olan seçeneği bulmak için git diff ile birlikte git log yaptım, ancak dosyayı geçmişte nasıl geri alacağımı bilmiyorum.

3786
19 окт. Hates_19 ekim ayarla . 2008-10-19 02:34 '08, 02:34, 2008-10-19 02:34
ответ 31 cevap
  • 1
  • 2

İstediğin c5f567 olduğunu c5f567 :

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

Git ödeme el kitabı sayfası daha fazla bilgi verir.

c5f567 geri dönmek istiyorsanız, ~1 ekleyin (herhangi bir sayıyla çalışır):

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

Not olarak, bu komuttan her zaman rahatsız oldum, çünkü hem sıradan şeyler (dallar arasında geçiş) hem de olağandışı, yıkıcı şeyler için (çalışma dizinindeki değişiklikler hariç) kullanıldı.

5117
19 окт. Cevap Greg Hewgill 19 Ekim 2008-10-19 02:39 '08, 02:39 2008-10-19 02:39

Diff komutunu kullanarak dosyada yapılan değişiklikleri hızlıca inceleyebilirsiniz:

 git diff <commit hash> <filename> 

Ardından, belirli bir dosyayı bu düzelticiye döndürmek için reset komutunu kullanın:

 git reset <commit hash> <filename> 

Yerel değişiklikleriniz varsa, --hard seçeneğini kullanmanız gerekebilir.

border=0

Yol noktalarınızı yönetmek için iyi bir belge akışı, zaman çizelgenizdeki noktaları temiz tutmak için etiketleri kullanmaktır. Son cümlenizi anlayamıyorum, ancak ihtiyaç duyabileceğiniz şey, şubenin önceki zamandan farklılaşması. Bunu yapmak için uygun ödeme komutunu kullanın:

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

Ardından, bu değişiklikleri birleştirmeye hazır olduğunuzda ana hattınıza göre yeniden yükleyebilirsiniz:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. Cevap 17 Aralık tarihinde Chris Lloyd tarafından verildi. 2008-12-17 09:59 '08, 09:59, 2008-12-17 09:59

Eğer en uygunsa, SHA-1 de dahil olmak üzere herhangi bir linki kullanabilirsiniz. Gerçek şu ki takım şu şekilde görünüyor:

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

319
08 апр. Cevap foxxtrot 08 nisan . 2009-04-08 00:48 '09, 0:48 2009-04-08 00:48
 git checkout -- foo 

Bu HEAD için sıfırlama foo olacaktır. Ayrıca:

 git checkout HEAD^ foo 

bir revizyon için, vs.

256
29 авг. Cevap Yazan Greg Hewgill 29 Ağu 2008-08-29 23:56 '08, saat 11:56, 2008-08-29 23:56

Ve en çok ihtiyaç duyulan en son tamamlanan sürüme geri dönmek için bu basit komutu kullanabilirsiniz.

 git checkout HEAD file/to/restore 
114
14 янв. Cevap CDR 14 Ocak'ta verilir . 2012-01-14 09:15 '12, 09:15 2012-01-14 09:15

Ben de şimdi aynı problemi yaşadım ve bu cevabı en kolay anlaşılması en kolay olanı buldum ( commit-ref , geri göndermek istediğiniz günlükteki SHA değişikliğinin değeridir):

 git checkout [commit-ref] [filename] 

Bu, bu eski sürümü çalışma dizininize yerleştirir ve isterseniz buradan düzeltebilirsiniz.

102
27 мая '09 в 20:52 2009-05-27 20:52 Cevap bbrown tarafından 27 Mayıs 09: 20 : 52'de verildi 2009-05-27 20:52

Kaç tane geri ödeme yapmanız gerektiğini biliyorsanız, aşağıdakileri kullanabilirsiniz:

 git checkout master~5 image.png 

master dalda olduğunuz ve istenen sürümün 5 olduğu varsayılmaktadır.

88
07 апр. Cevap Ron DeVera tarafından verildi 07 Nis 2009-04-07 17:03 '09 5:03 PM 2009-04-07 17:03

Sanırım buldum ... http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Bazen geri dönüp belirli bir nokta için tüm değişiklikleri unutmak istiyorsun, çünkü hepsi yanlış.

İle başla:

$ git log

Bu size son taahhütlerin bir listesini ve onların SHA1 karmasını gösterir.

Ardından girin:

$ git reset --hard SHA1_HASH

Belirli bir taahhüt için durumu geri yüklemek ve tüm yeni girişleri kayıttan sonsuza dek silmek.

78
17 дек. Cevap 17 Aralık'ta jdee'ye verildi . 2008-12-17 09:53 '08, 09:53 2008-12-17 09:53

Benim için çalıştı:

 git checkout <commit hash> file 

Ardından değişikliği yapın:

 git commit -a 
61
26 авг. cevap v2k 26 ağustos verilmiştir . 2011-08-26 01:12 '11, 1:12 2011-08-26 01:12

"Geri alma" derken dikkatli olmalısınız. Dosyanın bir sürümünü $ A işlemesinde kullandıysanız, sonra $ B ve $ C olmak üzere iki ayrı komisyon için iki değişiklik yaptınız (yani, bu dosyanın üçüncü kez yinelenmesidir) ve "İlkine geri dönmek istiyorum" derseniz, Gerçekten mi demek istiyorsun?

Hem ikinci hem de üçüncü yinelemedeki değişikliklerden kurtulmak istiyorsanız, çok basit:

 $ git checkout $A file 

ve sonra sonucu düzeltin. Komut "Dosyayı $ A taahhüdü tarafından yazılan durumdan kontrol etmek istiyorum" diye soruyor.

Diğer taraftan, aklınızdaki, ikinci yineleme değişikliğinden (yani B $ 'dan kurtulmak) kurtulmak, dosyadaki $ C dosyasını düzelttikten sonra $ B döndürmek istiyorsunuz.

 $ git revert $B 

Not: B $ 'ı kim taahhüt ederse, çok disiplinli olmayabilir ve aynı taahhütte tamamen ilgisiz değişiklikler yapabilir ve bu iade, gördüğünüz dosyadan başka, rahatsız edici değişiklikler ile ilgili olabilir. Bundan sonra sonucu dikkatlice kontrol edebilirsiniz.

54
11 янв. Cevap 11 Ocak gitster tarafından verildi . 2009-01-11 11:13 '09, 11:13 2009-01-11 11:13

İlginç bir şekilde, eğer çalışma kopyası foo adlı bir dizindeyse, 'git checkout foo' çalışmayacaktır; ancak, "w20> checkout HEAD foo" ve "git checkout./foo" gibi:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. Cevap Aaron Maenpaa 30 Ağustos tarafından verilir . 2008-08-30 00:26 '08, 0:26, 2008-08-30 00:26

İşte rebase çalışıyor:

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

Varsayalım

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

İlk iki takım ... bir git çıkış yaptı git git sihirbazı

... master şubeye uygulamak istediğiniz değişikliklerin şubesini kontrol edin. rebase komutu <my branch> rebase <my branch> ( master bulunmayan) taahhüt eder ve bunları master başlığına rebase . Başka bir deyişle, <my branch> öğesindeki ilk işlenenin ana öğesi artık master tarihçedeki önceki düzenleyici değil, geçerli master başlıktır. İki takım aynıdır:

 git rebase master <my branch> 

Belki de "temel" ve "değiştir" dalları açık olduğundan bu komutu hatırlamak daha kolay olacaktır.

. Sonuç:

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

Son iki takım ...

 git checkout master git merge <my branch> 

... tüm <my branch> değişikliklerini master uygulamak için hızlı bir birleştirme gerçekleştirin. Bu adım olmadan, bir rebase taahhüdü anaya eklenmez. Sonuç:

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

master ve <my branch> ikisi de B' referanslarıdır. Ayrıca, bu noktadan <my branch> bağlantısını güvenle kaldırabilirsiniz.

 git branch -d <my branch> 
32
24 февр. Cevap 24 Şubat'ta cmcginty tarafından verildi. 2009-02-24 12:43 '09, 12:43 2009-02-24 12:43

git takma adları, awk ve shell işlevi kurtuluş için!

 git prevision <N> <filename> 

burada <N> , <filename> dosyasının geri alınmasına ilişkin dosya düzeltmelerinin sayısıdır.
Örneğin, tek bir x/y/zc dosyasının önceki revizyonunu kontrol etmek için,

 git prevision -1 x/y/zc 

Git tahmini nasıl çalışır?

gitconfig

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

Temelde takım

  • belirtilen dosyada git log çalıştırır ve
  • dosya geçmişinde ilgili taahhüt kimliğini seçer ve
  • belirtilen dosya için git checkout taahhüt kimliğini gerçekleştirir.

Esasen, bu durumda manuel olarak yapılabilecek her şey
güzel, etkili bir git takma ad ile sarılı - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 Cevap TheCodeArtist 01 Mayıs '15 tarafından 04:46 2015-05-01 04:46 tarihinde verilmiştir.

Deneyimli kullanıcıları şaşırtmadan yenilerin daha erişilebilir olmasını sağlamak için bir sarmalayıcı olan EasyGit'i buraya bağlamalıyım. Yaptığı şeylerden biri daha fazla git revert değerleri vermek . Bu durumda, sadece diyorsunuz:

eg revert foo/bar foo/baz

20
19 окт. Cevap, Aristoteles Pagaltzis 19 ekimde verildi . 2008-10-19 03:16 '08, 03:16, 2008-10-19 03:16

Dosyayı önceki işleme döndürmek istediğinizde (ve geri vermek istediğiniz dosya zaten düzeltilmişse) kullanabilirsiniz.

 git checkout HEAD^1 path/to/file 

veya

 git checkout HEAD~1 path/to/file 

Sonra sadece adımı uygulayın ve “yeni” sürümünü düzeltin.

Bir birleşme durumunda, bir taahhüdün iki ebeveyni olabileceği bilgisi ile donanmış, HEAD ^ 1'in birinci ebeveyn, HEAD ~ 1'in ise ikinci ebeveyn olduğunu bilmelisiniz.

Veya ağaçta yalnızca bir ebeveyn varsa işe yarar.

20
11 янв. Cevap 11 Ocak'ta ModernIncantations tarafından verildi . 2014-01-11 03:29 '14, 03:29 2014-01-11 03:29

Hedef Dosya için İlk Sıfırlama Kafası

 git reset HEAD path_to_file 

Bu dosyanın ikinci kontrolü

 git checkout -- path_to_file 
19
04 апр. Cevap Gülşen Maurya tarafından 04 nisan. 2017-04-04 13:25 '17, 13: 25’te 2017-04-04 13:25

git checkout ./foo ve git checkout HEAD ./foo tamamen aynı olmadığını unutmayın; örnek:

 $ 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 , dosyayı dizinde işler, ancak işlenemez.)

git checkout ./foo yolu ./foo döndürmek anlamına gelir. ; HEAD eklemek, Git'e bu indeks yolunu bundan önce HEAD'e döndürmesini söyler.

19
31 авг. Cevap Damien Diederen tarafından verildi Ağustos 31 2008-08-31 14:54 '08, 02:54, 2008-08-31 14:54

Burada birçok öneri var, çoğu git checkout $revision -- $file . Birkaç belirsiz alternatif:

 git show $revision:$file > $file 

Ayrıca, yalnızca belirli bir sürümü geçici olarak görmek için de kullanırım:

 git show $revision:$file 

veya

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

(OBS: $file önekle başlamalıdır. ./ Bu git show $revision:$file için göreceli bir yol ise git show $revision:$file çalışacak git show $revision:$file )

Ve hepsi daha garip

 git archive $revision $file | tar -x0 > $file 
14
08 янв. Tarafından cevap Peter V. Mørch Ocak 08 2016-01-08 01:19 '16, 1:19 2016-01-08 01:19

Taahhüt dosyasının önceki sürümüne gitmek için, taahhüt numarası, eb917a1

 git checkout eb917a1 YourFileName 

Sadece en son kayıtlı sürüme dönmeniz gerekiyorsa.

 git reset HEAD YourFileName git checkout YourFileName 

Bu, dosyanın son kaydedilen durumuna götürür.

11
25 февр. cevabı shah1988 25 Feb. 2014-02-25 17:01 '14, 17:01 2014-02-25 17:01

Benim için hiçbir cevap çok net görünmüyordu ve bu yüzden benimki eklemek çok kolay görünüyordu.

Ben abc1 bir taahhüt var ve ondan sonra birkaç (veya bir değişiklik) file.txt dosyası yaptım.

Şimdi bana file.txt dosyasında bir şeyleri mahvettiğimi ve abc1 önceki abc1 geri dönmek istediğimi abc1 .

1. git checkout file.txt : Bu, gereksiniminiz yoksa yerel değişiklikleri kaldıracaktır.

2. git checkout abc1 file.txt : bu, dosyanızı istediğiniz sürüme götürecektir

3. git commit -m "Restored file.txt to version abc1" : bu tersine çevrilmenize neden olur.

  1. git push : bu her şeyi uzak bir havuza getirecek

Elbette, 2. ve 3. adımlar arasında, neler olduğunu anlamak için git status yapabilirsiniz. Genellikle, file.txt zaten eklendiğini görmelisiniz ve bu nedenle git add gerek yoktur.

10
23 марта '17 в 0:33 2017-03-23 00:33 Cevap kalmanIsAGameChanger tarafından 23 Mart 17: 00'da 0:33 2017-03-23 ​​00:33 tarihinde verilmiştir.

git ödeme ref | commitHash - filePath

örneğin

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 
10
26 сент. Cevap 26 Eylül Amos Folarin verilmiştir . 2013-09-26 20:04 '13 20:04 2013-09-26 20:04

Buradaki yanıtların çoğu git reset ... <file> veya git checkout ... <file> kullanmanızı gerektirir, ancak geri dönmek istediğiniz işlemden sonra yapılan <file> öğesindeki tüm değişiklikleri kaybedeceksiniz.

git revert yapacağı gibi yalnızca bir dosyadaki değişiklikleri tek bir dosyaya atmak istiyorsanız, ancak yalnızca tek bir dosyaya (veya işleme dosyalarının bir alt kümesine) atmak istiyorsanız, hem git diff hem de git diff bu şekilde git apply öneririz ( <sha> = dönmek istediğiniz taahhüdün karması):

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

Prensip olarak, ilk önce geri dönmek istediğiniz değişikliklere karşılık gelen bir yama üretecek ve daha sonra bu değişiklikleri atmak için yamanın uygulanmasını iptal edecektir.

Elbette, ters çevrilmiş çizgiler <sha1> ile HEAD (çatışma) arasındaki herhangi bir taahhütle değiştirilmişse çalışmaz.

8
07 дек. Cevap Vince 07 dec verilir . 2016-12-07 17:43 '16, 17:43, 2016-12-07 17:43

Belirli bir sürüm için karma anahtarını almak için git log kullanın ve ardından git checkout <hashkey>

Not. Sonuncusundan önce karma girmeyi unutma. Son karma geçerli konumu (HEAD) gösterir ve hiçbir şeyi değiştirmez.

8
05 дек. Cevap mustafakyr 05 dec verilir . 2011-12-05 23:09 '11 23:09 2011-12-05 23:09

Açıkçası, birinin belgelerde daha iyi açıklamak için git ya da git üzerine açık bir kitap yazması gerekir. Aynı problemle karşı karşıya kaldım, sanırım

 cd <working copy> git revert master 

Yaptığı son taahhüdü tersine çevirir.

Yang

7
16 дек. Cevap 16 Aralık'ta Ian Davis tarafından verildi . 2011-12-16 06:03 '11 6:03 2011-12-16 06:03

En son yaptığınız taahhütnamede yanlış dosyayı yaparsanız, talimatları izleyin:

  1. açık kaynak ağaç, bu taahhüdü değiştir

2019

23 авг. Cevapla sabre tabatabaee yazdi 23 ağustos . 2018-08-23 12:53 '18, 12:53 2018-08-23 12:53

Bunu 4 adımda yapabilirsiniz:

  1. Tamamen iptal etmek istediğiniz dosyaya yapılan taahhüdün tamamını iptal edin - bu işlem dizinizde yeni bir sonuç yaratır
  2. taahhüdün alındığı yumuşak sıfırlama - taahhüdü kaldırır ve değişiklikleri çalışma alanına taşır
  3. dosyaları döndürmek ve kilitlemek için el ile seçme
  4. diğer tüm dosyaları çalışma alanınıza bırakın

Terminalinizde aramanız gerekenler :

  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.

iyi şanslar

4
08 мая '18 в 13:26 2018-05-08 13:26 Cevap Nir M. Mayıs 08, 18'de 01:26 de 2018-05-08 13:26
 git revert <hash> 

Belirtilen taahhüdü döndürür. git revert yalnızca son taahhüdü etkilediğini düşünüyor gibisin.

Belirli bir dosyadaki değişikliği geri almak istiyorsanız ve bu işlem bu dosyadan daha fazla değiştiyse, bu sorunu çözmez.

4
17 дек. Otto 17 Aralık'ta cevap verdi. 2008-12-17 21:56 '08, 09:56, 2008-12-17 21:56

İşte benim yolum.

a) Android Studio'da dosyayı açın.

b) git → Geçmişi göster, geri dönmek istediğim önceki taahhüdü bul. Commit_id (al, karma yap).

c) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 Cevap Francis Bacon tarafından 13 Mart 17'de 11:10 2017-03-13 11:10 tarihinde verilmiştir.

Git Extensions kullanıyorsanız ve dosya için üst işleme geri dönmek istiyorsanız, geri dönmek istediğiniz değişiklikleri içeren işlemi seçip ardından ayrıntılı olarak "Diff" sekmesini seçin, geri dönmek istediğiniz dosyayı sağ tıklayın, ardından Dosyayı sıfırlamak için " .... ", sonra" A "(ebeveyn)

1
26 сент. Tarafından cevap johnny 26 eylül. 2017-09-26 04:48 '17, 04:48 2017-09-26 04:48

Bu çok basit bir adım. Dosyayı, istediğimiz taahhüt kimliğiyle çıkarın, işte daha önce bir taahhüt kimliği, sonra da git commitmend komutunu çalıştırın ve bitirdiniz.

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

Bu çok uygun. Herhangi bir dosyayı, önceki taahhüdün herhangi bir tanımlayıcısına sahip bir taahhüdün başında vermek istiyorsak, bunu kolayca yapabiliriz.

1
24 янв. Cevap 24 Ocak tarihinde Abhishek Dwivedi tarafından verilmiştir. 2019-01-24 20:21 '19 , 20 : 21'de 2019-01-24 20:21
  • 1
  • 2

etiketleri veya soru sor ile ilgili diğer sorular