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


1913

İçinde çalıştığım bir projem var git init. Birkaç taahhütten sonra, git statusher şeyin güncel olduğunu ve hiçbir yerel değişiklik olmadığını söyledi.

Sonra arka arkaya birkaç değişiklik yaptım ve her şeyi atmak ve orijinal durumuma geri dönmek istediğimi fark ettim. Bu komut benim için yapacak mı?

git reset --hard HEAD

Yanıtlar:


3388

Çalışan kopyanızda yapılan değişiklikleri geri almak istiyorsanız, bunu yapın:

git checkout .

Dizinde yapılan değişiklikleri (yani, eklediğiniz) geri almak istiyorsanız, bunu yapın. Bu uyarı, tüm unpushed taahhütlerinizi ustalaştıracak! :

git reset

Yaptığınız bir değişikliği geri almak istiyorsanız, bunu yapın:

git revert <commit 1> <commit 2>

İzlenmemiş dosyaları (örn. Yeni dosyalar, oluşturulan dosyalar) kaldırmak istiyorsanız:

git clean -f

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

git clean -fd

133
Bu kadar uzun bir süre sonra, fwiw git checkout path/to/filesadece yerel değişiklikleri geri alacakpath/to/file
Matijs

29
Aşağıdaki cevaplarda +1 de git clean -f (izlenmemiş değişiklikleri kaldırmak için) ve -fd (izlenmemiş dizinleri de kaldırmak için)
ptdev

3
ve izlenmeyen dosyalarınızı da temizlemek istiyorsanız, bu stackoverflow.com/questions/61212/…
Surasin Tancharoen

9
git checkout .ve git reset [--hard HEAD]işe yaramadı, git clean -fddeğişiklikleri geri almak için bir yapmam gerekiyordu .
BrainSlugs83

7
git resetdeğişikliklerinizi sıfırlamaz, git reset --hardyapar.
Cerin

388

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

git clean -fd

gibi

git reset --hard

olacak değil git-temiz git izleme altında olmayan paletli kök dizinden tüm dosyaları kaldıracak kadar izlenmeyen dosyaları, kaldırın. UYARI - BU İLE DİKKATLİ OLUN! Neyi sileceğini görmek için önce git-clean ile kuru çalışma yapmak yararlıdır.

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

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

Birkaç şey yaparken, siz ve arkadaşınız aynı ada sahip yeni bir dosya eklediğinizde çalışan bir kopyayı güncelleyerek ortaya çıkabilir, ancak önce kaynak kontrolüne adamıştır ve izlenmeyen kopyanızı silmeyi umursamazsınız. .

Bu durumda, kuru bir çalışma yapmak da üzerine yazılacak dosyaların bir listesini göstermenize yardımcı olacaktır.


13
Dosya temizleme komutu "git clean -f" dir. İzlenmeyen dizinler "git clean -d" ile kaldırılır
Jonathan Mitchell

35
git clean -fd (-d için kuvvet gerekir)
electblake

14
-n veya - kuru çalışma kuru çalışma için bayraklardır.
stephenbez

2
git deponuzda başka bir git deponuz varsa git clean -ffd. Çift f olmadan kaldırılamaz.
Trismegistos

148

Yeniden klon

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • Local Yerel, zorlanmamış taahhütleri siler
  • Track İzlenen dosyalarda yaptığınız değişiklikleri geri döndürür
  • Deleted Sildiğiniz izlenen dosyaları geri yükler
  • İn Listelenen dosyaları / dizinleri siler .gitignore(derleme dosyaları gibi)
  • ✅ İzlenmeyen ve içinde olmayan dosyaları / dizinleri siler .gitignore
  • Approach Bu yaklaşımı unutmayacaksın
  • Band Bant genişliğini boşa harcar

Günlük olarak unuttuğum diğer komutlar aşağıdadır.

Temizle ve sıfırla

git clean --force -d -x
git reset --hard
  • Local Yerel, zorlanmamış taahhütleri siler
  • Track İzlenen dosyalarda yaptığınız değişiklikleri geri döndürür
  • Deleted Sildiğiniz izlenen dosyaları geri yükler
  • İn Listelenen dosyaları / dizinleri siler .gitignore(derleme dosyaları gibi)
  • ✅ İzlenmeyen ve içinde olmayan dosyaları / dizinleri siler .gitignore

Temiz

git clean --force -d -x
  • Local Yerel, zorlanmamış taahhütleri siler
  • Track İzlenen dosyalarda yaptığınız değişiklikleri geri döndürür
  • Deleted Sildiğiniz izlenen dosyaları geri yükler
  • İn Listelenen dosyaları / dizinleri siler .gitignore(derleme dosyaları gibi)
  • ✅ İzlenmeyen ve içinde olmayan dosyaları / dizinleri siler .gitignore

Sıfırla

git reset --hard
  • Local Yerel, zorlanmamış taahhütleri siler
  • Track İzlenen dosyalarda yaptığınız değişiklikleri geri döndürür
  • Deleted Sildiğiniz izlenen dosyaları geri yükler
  • İn Listelenen dosyaları / dizinleri siler .gitignore(derleme dosyaları gibi)
  • ❌ İzlenmeyen ve içinde olmayan dosyaları / dizinleri siler .gitignore

notlar

Yukarıdakilerin tümünü doğrulamak için test örneği (bash veya sh 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 önceki taahhütleri geri alan yeni taahhütlerde bulunmak
  • git checkout önceki taahhütlere geri dönmek için (önce komutların üzerinde çalışılması gerekebilir)
  • git stashgit resetYukarıdaki ile aynı , ancak geri alabilirsiniz

Yukarıdaki cevaplardan çaldığım için üzgünüm. Bu referansı sürekli olarak kullanıyorum ve çoğunlukla benim için gönderiyorum.
William Entriken

1
Eminim, ilk seçenek ( yeniden-klon ) aslında "yerel, itilmemiş taahhütleri silmek" yapar - :)
Marandil

1
@styfle ✅ yaptığı bir şey, ❌ yapmadığı bir şey
William Entriken

3
@FullDecent Okumak biraz kafa karıştırıcı. "Local Yerel, itilmemiş işlemleri SİLMEZ". Bu, SİLMEZ anlamına gelir. Çift negatif, sildiği anlamına mı gelir?
styfle

1
About -x flag in git clean -f -d -x: -x seçeneği belirtilirse, yok sayılan dosyalar da kaldırılır. Bu, örneğin, tüm yapı ürünlerini kaldırmak için yararlı olabilir.
Alex

82

Tüm değişiklikleri geri almak ve geçerli uzak ana bilgisayarla güncel olmak istiyorsanız (örneğin, ana HEAD, dallandığınızdan ve ittiğiniz 'reddedildiğinden' ileriye doğru hareket ettiğini görürsünüz) kullanabilirsiniz.

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.

Belirtmek için önemli görünüyor originiçinde git reset --hard origin/master(çalışıyor) - (yani olmadan git reset --hard) değişen birşey yok gibi görünüyor.
Jake

Bazı yerel değişiklikler yaptım ve herhangi bir komutla onlardan kurtulamadım git reset --hard origin / master ve master'ın değişikliklerini de
çekebildi

50

Git-reflog'a bakın. Hatırladığı tüm durumları listeleyecektir (varsayılan 30 gündür) ve sadece istediğinizi kontrol edebilirsiniz. Ö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

bir ton William, git reflog için teşekkürler. Ağacımı eski sürüme sıfırladım ve son zamanlara nasıl geri çekileceğinden emin değilim. git reflog beni kurtardı. Tekrar teşekkürler.
palaniraja

1
beni de kurtardı! Benim durumumda ile maceram git rebase -iyanlış gitti (bir düzenleme hatası nedeniyle bazı taahhütleri sildi). Bu ipucu sayesinde geri döndüm!
paneer_tikka

Varsayılan 30 gün ile ne demek istiyorsun?
Mohe TheDreamy

@MoheTheDreamy Yani bir zaman sınırı var. Sonunda çöp toplayıcı, yaşları bu sınırı aştığında ulaşılamayan referansları silecektir. Varsayılan eskiden 30 gündür (ve belki de halen). Dolayısıyla daha eski referanslar mevcut olmayabilir.
William Pursell

36

TEHLİKE ÖNERİ: (lütfen yorumları okuyun. Cevabımda önerilen komutu çalıştırmak istediğinizden fazlasını silebilir)

çalıştırmak zorunda olduğum dizinler dahil tüm dosyaları tamamen kaldırmak için

git clean -f -d

13
Az önce yaşadığım acıyı kurtarmak için: bu .gitignore-d dosyalarını da silecek!
landons

Sana bir sorun çıkarırsam özür dilerim. O zamanlar o klasördeki her şeyi geri alıp silmeye çalıştım. Ben kesin koşulları hatırlamıyorum, ama "-d" benim için çalışan tek şeydi. Umarım sana çok fazla acı vermedim :-)
Tobias Gassmann

1
zarar yok. Yedeklerim vardı, ama bu muhtemelen bir feragatname;)
landons

35

Bir sürü cevabı okuduktan ve denedikten sonra, bazen çalışan kopyayı tamamen temizlemedikleri anlamına gelen çeşitli kenar durumlar buldum.

İşte bunu yapmak için mevcut bash betiğim, her zaman çalışır.

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

Çalışan kopya kök dizininden çalıştırın.


10
Son komut bana verirerror: pathspec 'HEAD' did not match any file(s) known to git.
0xC0000022L

1
"-" i çıkardığımda benim için çalıştı. git checkout HEAD
Jester

4
git reset --hardizlenen dosyaları geri alır (aşamalı veya değil), git clean -f -dizlenmeyen dosyaları kaldırır, git checkout -- HEADneden buna ihtiyacımız var?
v.shashenko

Çift tireye ihtiyacımız yok. Bir yazım hatası olmalı.
Farax

35

sadece yürüt -

git stash

tüm yerel değişikliklerinizi kaldıracaktır. ve daha sonra şu komutları kullanarak da kullanabilirsiniz -

git stash apply 

3
kullanımı git stash popotomatik olarak sizin için en üst düzeyde saklanan değişikliği kaldıracaktır
Arrow Cen

8
git stash dropçalışma kopyasına başvurmadan en son saklanan durumu kaldırmak için.
deerchao

git stash uygulamak alışkanlık eklemek yeni oluşturulan dosyalar
Ravistm

27

Benzer bir sorunla karşılaştım. Çözüm, git logyerel taahhüdün hangi sürümünün uzaktan kumandadan farklı olduğunu aramak için kullanmaktır . (Ör. Sürüm 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Ardından git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ecdeğişikliği geri almak için düğmelerini kullanın .


16

Benzer bir sorun aradım,

Yerel taahhütleri atmak istedim:

  1. havuzu klonladı (git clone)
  2. geliştirici şubesine geçildi (git checkout dev)
  3. az sayıda taahhütte bulundu (git kesin -m "taahhüt 1")
  4. ancak uzaklara geri dönmek için bu yerel taahhütleri atmaya karar verdi (origin / dev)

Aşağıdakiler de öyle:

git reset --hard origin/dev

Kontrol:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

şimdi yerel taahhütler kaybolur, ilk klonlanan duruma geri dönülür, yukarıdaki nokta 1.


1
teşekkürler, bu benim için çalışan tek şey - "git reset --hard origin"
Nisim Naim

yardımcı olduğunu bilmek mutlu.
Manohar Reddy Poreddy

7

Çalışmalarınızı / dosyalarınızı çalışma dizininizde saklamak istemeyebilirsiniz / ihtiyacınız olmayabilir, bunun yerine bunlardan tamamen kurtulun. Komut git cleanbunu sizin için yapacak.

Bunu yapmak için bazı yaygın kullanım durumları, birleştirme veya harici araçlar tarafından oluşturulan kiri kaldırmak veya diğer dosyaları kaldırmak, böylece temiz bir yapı çalıştırabilirsiniz.

Yerel çalışma dizininizden TAKİP EDİLMEYEN dosyaları kaldırmak üzere tasarlandığından, bu komut konusunda çok dikkatli olmak isteyeceğinizi unutmayın. bu komutu uyguladıktan sonra aniden fikrinizi değiştirirseniz, kaldırılan dosyaların içeriğini görmeye geri dönüş yoktur. Daha güvenli bir alternatif,

git stash --all

bu da her şeyi kaldıracak, ancak hepsini saklamak için saklayacaktır. Bu saklanma daha sonra kullanılabilir.

Ancak, tüm dosyaları gerçekten kaldırmak ve çalışma dizininizi temizlemek istiyorsanız,

git clean -f -d

Bu işlem, komutun sonucunda herhangi bir öğe içermeyen tüm dosyaları ve alt dizinleri kaldıracaktır. git clean -f -dKomutu çalıştırmadan önce yapılacak akıllı şey,

git clean -f -d -n

yürüttükten sonra nelerin kaldırılacağını gösteren bir önizleme gösterir git clean -f -d

İşte en agresif olandan en az agresif olana seçeneklerinizin bir özeti


Seçenek 1 : Tüm dosyaları yerel olarak kaldırma (En agresif)

git clean -f -d

2. Seçenek : Yukarıdaki etkiyi önizleyin (Önizleme en agresif olanı)

git clean -f -d -n

Seçenek 3 : Tüm dosyaları sakla (En az agresif)

`git stash --all` 

6

Yerel şubede işlem görmeyen tüm değişiklikleri geri almak için bunu deneyin

$ git reset --hard HEAD

Ancak böyle bir hata görürseniz:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

'.Git' klasörüne gidip index.lock dosyasını silebilirsiniz:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Son olarak, komutu tekrar çalıştırın:

$ git reset --hard HEAD

0

Bu soru daha geniş depo sıfırlama / geri alma ile ilgili, ancak bireysel değişikliği geri almakla ilgileniyorsanız - Buraya benzer bir cevap ekledim:

https://stackoverflow.com/a/60890371/2338477

Soruların cevapları:

  • Git geçmişinde değişiklik koruyarak veya koruyarak bireysel değişiklik nasıl geri alınır

  • Aynı durumdan yeniden başlatmak için eski sürüme nasıl dönülür

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.