Soru Git yönetilen projesindeki tüm yerel değişiklikleri önceki duruma nasıl geri döndürürüm?


Koştuğum bir projem var git init. Birkaç işlemden sonra yaptım git status Bana her şeyin güncel olduğunu ve hiçbir yerel değişiklik olmadığını söyledi.

Ardından birkaç ardışık değişiklik yaptım ve fark ettim ki her şeyi bir kenara atıp orijinal halime geri dönmek istedim. Bu komut benim için yapar mı?

git reset --hard HEAD

1549
2017-07-18 07:52


Menşei




Cevaplar:


Çalışan kopyanıza yapılan değişiklikleri geri almak isterseniz, şunu yapın:

git checkout .

Dizine yapılan değişiklikleri (yani eklediğiniz) geri almak isterseniz, bunu yapın. Uyarı, bu işlem yapılmayan tüm taahhütlerinizi master olarak sıfırlayacaktır!:

git reset

Yaptığınız bir değişikliği geri almak isterseniz, şunu yapın:

git revert <commit 1> <commit 2>

Programlanmamış dosyaları kaldırmak istiyorsanız (ör. Yeni dosyalar, oluşturulan dosyalar):

git clean -f

Veya izlenmeyen dizinler (ör. Yeni veya otomatik olarak oluşturulmuş dizinler):

git clean -fd

2821
2017-07-18 07:57



uzun bir süre sonra fwiw, git checkout path/to/file yerel değişiklikleri yalnızca path/to/file - Matijs
Aşağıdaki cevaplarda +1 aynı zamanda git clean -f (izlenmeyen değişiklikleri kaldırmak için) ve -fd (ayrıca izlenmeyen dizinleri kaldırmak için) - ptdev
ve eğer programlanmamış dosyalarınızı da temizlemek istiyorsanız, bunu okuyun stackoverflow.com/questions/61212/... - Surasin Tancharoen
git checkout . ve git reset [--hard HEAD] işe yaramadı, bir git clean -fd değişiklikleri geri almak için - BrainSlugs83
git reset değişikliklerinizi sıfırlamaz, git reset --hard bunu yapar. - Cerin


Not: Ayrıca çalıştırmak isteyebilirsiniz

git clean -fd

gibi

git reset --hard

irade değil Kaldırılmamış dosyaları kaldırın, burada git-clean, git izleme altında olmayan izlenen kök dizindeki dosyaları kaldıracaktır. UYARI - BU İLE DİKKATLİ OLUN! Silmek için ne olacağını görmek için, önce git-temiz ile kuru çalışma çalıştırmak için yararlı olur.

Bu, hata mesajını aldığınızda da özellikle yararlıdır

~"performing this command will cause an un-tracked file to be overwritten"

Siz ve arkadaşınız aynı ada sahip yeni bir dosya eklediklerinde, çalışan bir kopyayı güncellemek için birkaç şey yapılırken ortaya çıkabilir, ancak önce kaynak kontrolüne geçmiştir ve sizin ilgisiz kopyanızı silmeniz gerekmez. .

Bu durumda, kuru bir çalışma yapmak, üzerine yazılacak dosyaların listesini size gösterecektir.


334
2017-07-20 05:37



Dosya temiz komutu "git clean -f" dir. İzlenmeyen dizinler "git clean -d" ile kaldırılır - Jonathan Mitchell
git clean -fd (kuvvet -d için zorunludur) - electblake
-y veya --dry-run kuru çalışma için bayraklar. - stephenbez
git deponuzda başka bir git deposu varsa, temiz -ffd. Çift f olmadan bu kaldırılmayacaktı. - Trismegistos


Tüm değişiklikleri geri almak ve geçerli uzak master ile güncel olmak istiyorsanız (örneğin, master HEAD'ın siz ayrıldığınızdan ve push'iniz reddedildiğinden bu yana ilerlediğini görürsünüz)

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

59
2018-04-22 20:48





Git-reflo'ya bak. Hatırladığı tüm durumları listeleyecektir (varsayılan değer 30 gündür) ve istediğinizi kolayca belirtebilirsiniz. Örneğin:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

47
2017-07-19 12:16



git reflog için teşekkürler bir ton William. Ağacımı eski sürüme sıfırlarım ve son zamanlara nasıl geçeceğimi bilmiyorum. senin git reflog beni kurtardı. Tekrar teşekkürler. - palaniraja
beni de kurtardı! Benim durumumda benim macera git rebase -i yanlış gitmişti (bir düzenleme hatası nedeniyle bazı işlemleri iptal ettiler). Bu bahşiş sayesinde iyi bir durumda geri döndüm! - paneer_tikka
30 gün varsayılan olarak ne demek istiyorsun? - Mohe TheDreamy
@MoheTheDreamy Yani bir zaman sınırı var demek. Sonunda çöp toplayıcı, yaşları bu sınırın üzerine çıktığında erişilemeyen referansları siler. Varsayılan, eskiden (ve belki de) 30 gündür. Daha eski referanslar mevcut olmayabilir. - William Pursell


Yeniden klon

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  Yerel, itilmemiş taahhütleri siliyor mu?
  •  İzlenen dosyalarda yaptığınız değişiklikleri geri alır
  •  Sildiğiniz izlenen dosyaları geri yükler
  •  Listelenen dosyaları / dizinleri siler .gitignore (yapı dosyaları gibi)
  •  İzlenmeyen ve olmayan dosyaları / yönlendirmeleri siler. .gitignore
  •  Bu yaklaşımı unutmayacaksın
  •  Atık bant genişliği

Aşağıda her gün unuttuğum diğer komutlar var.

Temizle ve sıfırla

git clean -f -d -x
git reset --hard
  •  Yerel, itilmemiş taahhütleri silmez.
  •  İzlenen dosyalarda yaptığınız değişiklikleri geri alır
  •  Sildiğiniz izlenen dosyaları geri yükler
  •  Listelenen dosyaları / dizinleri siler .gitignore (yapı dosyaları gibi)
  •  İzlenmeyen ve olmayan dosyaları / yönlendirmeleri siler. .gitignore

Temiz

git clean -f -d -x
  •  Yerel, itilmemiş taahhütleri silmez.
  •  İzlenen dosyalarda yaptığınız değişiklikleri DEĞİŞTİRMEZ
  •  Sildiğiniz izlenen dosyaları geri yüklemez
  •  Listelenen dosyaları / dizinleri siler .gitignore (yapı dosyaları gibi)
  •  İzlenmeyen ve olmayan dosyaları / yönlendirmeleri siler. .gitignore

Reset

git reset --hard
  •  Yerel, itilmemiş taahhütleri silmez.
  •  İzlenen dosyalarda yaptığınız değişiklikleri geri alır
  •  Sildiğiniz izlenen dosyaları geri yükler
  •  Listelenen dosyaları / dizinleri siler .gitignore (yapı dosyaları gibi)
  •  İzlenmeyen ve olmayan dosyaları / dizinleri SİLMEZ. .gitignore

notlar

Yukarıdakilerin tümünü onaylamak için test durumu (bash veya sh komutunu kullanın):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Ayrıca bakınız

  • git revert öncelikleri iptal eden yeni taahhütler yapmak
  • git checkout önceki taahhütlere zamanında geri dönmek için (önce komutların üzerinde çalışmayı gerektirebilir)
  • git stash ile aynı git reset yukarıda, ancak bunu geri alabilirsiniz

41
2018-03-20 12:37



Yukarıdaki cevaplardan çaldığım için özür dilerim. Bu referansı sürekli kullanıyorum, çoğunlukla benim için gönderiyorum. - William Entriken
Eminim ki, bu ilk seçenek (Yeniden klon) aslında "yerel olmayan itiraf edilen işlemleri" siler :) - Marandil
Kırmızı X ve yeşil onay işareti ne anlama geliyor? Kırmızı X onun yanındaki cezayı reddeder mi? - styfle
@styfle, yaptığı bir şey değil mi? - William Entriken
@FullDecent Okuyacak kadar kafa karıştırıcı. "Yerel, itilmeyen taahhütleri silmiyor". Bu, SİLMEZ anlamına gelir. İkili negatif, sildiği anlamına mı geliyor? - styfle


TEHLİKE UYARI: (lütfen yorumları okuyun. Cevabımda önerilen komutu yürütmek istediğinizden daha fazlasını silebilir)

Ben çalıştırmak zorunda dizinler de dahil olmak üzere tüm dosyaları tamamen kaldırmak için

git clean -f -d

34
2017-09-11 07:10



Acı çeken herkesi kurtarmak için: bu da .gitignore-d dosyalarını silecektir! - landons
Üzgünüm, sana sorun çıkarsam. O zamanlar sadece o klasördeki her şeyi geri almayı ve silmeyi denedim. Tam koşulları hatırlamıyorum, ama "-d" benim için çalışan tek şeydi. Umarım seni çok fazla acı vermedim :-) - Tobias Gassmann
zarar yok. Yedeklerim vardı, ancak bu muhtemelen bir sorumluluk reddi beyan ediyor;) - landons


Bir sürü cevap okuduktan ve onları denedikten sonra, bazen çalışma kopyasını tamamen temizlemediği anlamına gelen çeşitli kenar durumları buldum.

İşte her zaman işe yarayan şu anki bash senaryom.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Kopya kök dizini çalışmadan çalıştırın.


34
2018-06-04 07:25



Son komut bana veriyor error: pathspec 'HEAD' did not match any file(s) known to git. - 0xC0000022L
"-" yi aldığımda benim için çalıştı. git checkout HEAD - Jester
git reset --hard izlenen dosyaları geri döndürür (aşamalı veya değil), git clean -f -d izlenmeyen dosyaları kaldırır git checkout -- HEAD Neden buna ihtiyacımız var? - v.shashenko
Çift tireye ihtiyacımız yok. Yazım hatası olmalı. - Farax


basitçe söyle

git stash

tüm yerel sınırlarınızı kaldıracaktır. ve sonra da diyerek kullanabilirsiniz

git stash apply 

29
2018-04-24 12:18



kullanım git stash pop otomatik olarak sizin için saklanan değişikliği otomatik olarak kaldırır - Arrow Cen
git stash drop çalışma kopyasına başvurmadan en son depolanmış durumu kaldırmak. - deerchao