Dosyalar ve klasörler dahil, taahhüt edilmemiş değişiklikleri nasıl geri alabilirim?


1071

Çalışan bir ağaç ve dizindeki tüm taahhüt edilmemiş değişiklikleri geri almak ve ayrıca yeni oluşturulan dosya ve klasörleri kaldırmak için bir git komutu var mı?



1
Eh, uyarıları ve kenar davaları ve "xxx varsa işe yaramadı" ile aşağıdaki çeşitli ve hatırlanması zor cevapların hepsini okudum ve tüm düzenlenmiş ve eklenen dosyaları kaldırmak için klonlama, tüm repo silmek ile sıkışmış . Ayrıca sadece iki komut. rm -r projedir; git klon xxx. Benim için bu sık yapılan bir işlemdir - onunla bir repo oyununa bakın, sonra değiştirmeye başlayabilmem için temiz bir kasaya geri dönmek istiyorum. Harika değil, ancak% 100 çalışıyor. Bir gün bunun için basit bir komut ekleyeceklerini umuyorum.
John Little

Yanıtlar:


1771

Bu iki komutu çalıştırabilirsiniz:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
git temiz çalıştırılmadan önce değişiklikleri önizlemek için 'git clean -nd' komutunu çalıştırmak iyi bir fikirdir.
jpw

79
Birine dokümanlar gezisi kaydedin: -f kuvvet, -d dizinleri kaldırmak, -n kuru çalışma (ayrıca --dry-run; henüz hiçbir şey yapmadan çıktı göster)
Aaron Campbell

12
git clean -ietkileşimli bir mod için.
galath

İşaretlenmemiş dosyalarımı sıfırlamadı, önce onları sahneye koymak zorunda kaldım.
Aron Lorincz

4
@IgorGanapolsky Muhtemelen birleşme çatışmasının ortasındasınız. Koşmayı deneyin git merge --abort.
htanata

555

Yalnızca geçerli çalışma dizinindeki değişiklikleri geri almak istiyorsanız,

git checkout -- .

Bundan önce, gerçekte herhangi bir işlem yapmadan geri döndürülecek dosyaları listeleyebilirsiniz, sadece ne olacağını kontrol etmek için:

git checkout --

1
Bunu denediğimde "hata: pathspec '.' git için bilinen hiçbir dosyayla eşleşmedi
Mike K

34
this ve arasındaki fark git reset --hardnedir?
Felipe Almeida

104
'git reset --hard' hem aşamalı hem de işaretsiz değişiklikleri geri alırken 'git checkout -.' yalnızca dengesiz değişiklikleri geri alacak
divideByZero

Eğer ödeme kullanırsanız ve dosyaları değiştirdiyseniz, cmd sadece bu değişiklikleri geri almam gerektiğinde bile birleştirme yapmam gerektiğini geri dönecektir
Vinicius Monteiro

7
git checkout - geri döndürülecek dosyaları listeleyecektir (işlem yok, sadece liste). git checkout - işleminden önce hangi dosyaların etkileneceğini görmek istiyorsanız bu yararlıdır.
Krish Srinivasan

107

Çalışma dizinindeki değişiklikleri atmak için "git checkout - ..." kullanın

git checkout -- app/views/posts/index.html.erb

veya

git checkout -- *

git durumunda etiketlenmemiş dosyalarda yapılan tüm değişiklikleri kaldırır, ör.

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *değiştirilen dosyaların bulunduğu dizinde bulunmadıkça benim için çalışmıyor. Tüm depodaki tüm dosyaları kontrol etmek için yapmanız gerekengit checkout -- :/
waldyrious

Konumunda git checkout -- *, yıldız geçerli dizindeki tüm dosya ve dizinlerle Kabuk ile değiştirilir. Bu yüzden alt dizinlere gitmelidir. Benim için çalışıyor. Ama bence daha temiz olan sözdizimi ": /" 'yi vurguladığım için teşekkürler.
mcoolive

53

Önemsiz bir yol, bu iki komutu çalıştırmaktır:

  1. git stash Bu, değişikliklerinizi depoya taşıyacak ve sizi HEAD durumuna geri getirecektir.
  2. git stash drop Bu, son komutta oluşturulan en son saklamayı siler.

3
Bu, taahhüt edilmemiş değişiklikler için geçerli değildir, sadece taahhüt edilen değişiklikler için geçerlidir.
b0xxed1n

4
Taahhütsüz değişiklikler için kullandım ve işe yarıyor.
Paul D. Eden

7
@ b0xxed1n Stashing tamamen taahhüt edilmemiş değişikliklerle ilgilidir ve açıkçası onlar için de işe yarar.
TJ

git stash, taahhüt edilmemiş değişiklikleri kaydetmek için yapıldı, böylece ... taahhütte bulunmadan kaydedin.
Rob

git stash şu hatayla sonuçlanır:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

yardımcı olmadı, yeni dosyalar kaldı. Yaptığım şey tüm çalışan ağacı tamamen silmek ve sonra

git reset --hard

"Bkz Ben git benim yerel çalışma dizinini temizlemek nasıl? " Tavsiye eklemek için -xtemiz seçeneği:

git clean -fdx

Not -x bayrağı Git tarafından yok sayılan tüm dosyaları silecektir, bu yüzden dikkatli olun (bahsettiğim cevaptaki tartışmaya bakın).


-fdx nedir? "kuvvet, dizin ve x?
Adi Prasetyo

@AdiPrasetyo -x bayrağı yok sayılan tüm dosyaları da kaldırır; istenmeyen bir etki olabilir, bu yüzden cevabımı güncelledim.
Fr0sT

Hala tembellik edemiyorum. Hatayı alıyorum: hata: Değişiklikler birleştirilemedi. Düzeltme eki
0003'de

13

Aşağıdaki komutu kullanabileceğinizi düşünüyorum: git reset --hard


hhmm ... Bunu yaptım ama dosyalarım hala orada. Sonra bir şey yapmalı mıyım?
MEM

1
git reset yalnızca çalışma ağacındaki değiştirilmemiş değişiklikleri geri alır. Yeni dosya ve klasörleri kaldırmaz. Git ile nasıl yapılacağından emin değilim
Josnidhin

1
Dolayısıyla, bir sistem dizinini yeni dosyalar ve klasörler ekleyerek değiştirirsek ve daha sonra bu dizini önceki bir duruma (bu dosya ve klasörleri hariç) geri döndürmek istiyorsak, git? Yani yapabileceğimiz en iyi şey dosya durumlarını geri döndürmek Ancak bir dosya oluşturduktan sonra, manuel olarak yapmadıkça bu dosyayı kaldıramayız?
MEM

6

Hala kaybolmayacak gibi görünen dosyalar olabileceğini, bunların düzenlenmemiş olabileceğini, ancak git'in CRLF / LF değişiklikleri nedeniyle düzenlenmiş olarak işaretlenmiş olabileceğini lütfen unutmayın. .gitattributesSon zamanlarda bazı değişiklikler yapıp yapmadığınızı görün .

Benim durumumda CRLF ayarlarını .gitattributesdosyaya ekledim ve bu nedenle tüm dosyalar "değiştirilmiş dosyalar" listesinde kaldı. .Gitattributes ayarlarının değiştirilmesi, bunların kaybolmasına neden oldu.


6

En son taahhüdünüzde kopyaya geri dönmek istediğiniz taahhüt edilmemiş bir değişikliğiniz varsa (yalnızca çalışma kopyanızda), aşağıdakileri yapın:

git checkout filename

Ben bir taahhütsüz sonra deniyorum git rm filename, ve çalışmıyor. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

Geri almadan çözüm git rmolduğunugit checkout master -- filename
falsePockets

3

Git 2.23, git restoreçalışan ağaç dosyalarını geri yükleme komutunu verdi.

https://git-scm.com/docs/git-restore

Geçerli dizindeki tüm dosyaları geri yüklemek için

geri yükle.

Tüm C kaynak dosyalarını dizindeki sürümle eşleşecek şekilde geri yüklemek isterseniz,

git restore '* .c'


1
öyle git 2.23 değil, 2.13
phuclv

2

Deponuzda yapılan tüm taahhüt edilmemiş değişiklikleri geri alabilen aşağıdaki git komutunu kullanabilirsiniz:

git checkout .

Misal:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/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:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

Genellikle iyi çalışan bu şekilde kullanın:

mv fold/file /tmp
git checkout fold/file

357 "beğeni" ile önerilen adam tam olarak aynı. Sadece yeni teslim edilen dosyanın yedeğini bile oluşturursunuz.
Matthias

-3

Güvenli ve uzun bir yol:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

kullanın:

git reset HEAD filepath

Örneğin:

git reset HEAD om211/src/META-INF/persistence.xml
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.