Git'teki işaretlenmemiş değişiklikleri nasıl atarım?


4817

Çalışma kopyamdaki dizinde olmayan değişiklikleri nasıl atarım?


9
git-cleanizlenmeyen dosyaları yalnızca çalışma ağacından kaldırır git-scm.com/docs/git-clean
Yega

24
Asenar'ın yukarıdaki yorumu açıklığa kavuşturmak git-clean -dftehlikeli olabilir. Yerel izlenmemiş dosyaları silecektir (örneğin .gitignore kapsamındadır) Aşağıdakileri dikkatlice okuyun ve git checkout'u düşünün. bunun yerine
jacanterbury

15
'git clean -df' Dikkatli olun! Bunu denedim ve geri yüklenemeyen anahtar klasörlerini kaybettim ... Ah!
Gabe Karkanis

46
vurmak git status, bunun nasıl yapılacağı konusunda bir öneri verir! git checkout -- .
Paulo

4
@Paulo: Temmuz 2019 yılında başlayan, git statusöneri verir: git restore. git restorebu amaç için yeni bir komuttur. 2019 güncellememe bakın .
prosoitos

Yanıtlar:


2684

Başka bir hızlı yol:

git stash save --keep-index --include-untracked

Bu konuda --include-untrackedkapsamlı olmak istemiyorsanız dahil etmeniz gerekmez.

Bundan sonra, isterseniz bu zulayı bir git stash dropkomutla bırakabilirsiniz .


122
Ve bu konuda ayrıntılı olmak için siz --include-untrackedde istersiniz .
TJ Crowder

9
@KarimSamir: soru özellikle olan değişiklikler hakkında sorar endekste değil . git resetKomut çok endeksinde değişiklikler kaybolacak.
Greg Hewgill

146
çıkış kontrolü. çok daha hızlı
Frank

38
Ne git stash, ne de herhangi bir çeşit, git checkoutişaretlenmemiş silmeleri atmaz. Çıktısına göre git status, burada gerçek doğru cevap biraz lezzetgit reset HEAD
Chris Warth

127
Bu, yığın yığınını kirletir. git checkout -- .işi sadece bir komutla yapar.
Felipe Tonello

5336

Geçerli çalışma dizinindeki etiketlenmemiş tüm dosyalar için:

git checkout -- .

Belirli bir dosya kullanımı için:

git checkout -- path/to/file/to/revert

--argüman belirsizliğini kaldırmak için buradayız .


117
Bu git kanonik yolu gibi görünüyor. yani tam git status
yazdığınızda

27
İzlenmeyen dosyalar varsa çalışmaz. Git diyor error: The following untracked working tree files would be overwritten by checkout: ....
Michael Iles

92
acemi soru, "git checkout -." anlamsal olarak ne demek?
Kaid

120
@Ninjack , şube adını belirtmediğiniz konusunda açık olmanız dışında git checkout -- ., aynı anlama gelir git checkout .. İkisi de şu anda üzerinde bulunduğum daldaki HEAD sürümüne göz at dedi. veya './'. Bunu yaparsanız git checkout branch-name directory-or-file-namegenel olarak sen HEAD sürümü almak directory-or-file-namedala branch-name.
akgill

23
IMO bu varyant, kusurludur, çünkü değiştirilen deponuz, değişikliklerin yapıldığı anda HEAD revizyonunda değilse ve HEAD'a güncellemek istemediğiniz ve sadece değişiklikleri temizlemek istediğinizde durum ele almaz.
alexykot

1898

Tam çözüm şu şekilde görünüyor:

git clean -df
git checkout -- .

git cleanizlenmeyen tüm dosyaları kaldırır ( uyarı : doğrudan .gitignore'da belirtilen yok sayılan dosyaları silmese de, klasörlerde bulunan yok sayılan dosyaları silebilir ) ve kaydedilmemiş git checkouttüm değişiklikleri siler.


116
Diğer iki cevap aslında işe yaramıyor, bu cevap verdi.
John Hunt

18
@dval, ilk komutun dizini kaldırılmamış dosyaları ve ikincisi de dizine eklenmemiş dosyaları (dizine alınan dosyaların) kaldırdığı anlamına gelir. Bu nedenle, herhangi bir aşamalı değişiklik yapmadıysanız, bu son taahhüdüne geri git reset --hard
dönmekle aynıdır

3
izlenmeyen dizin bir git klonu ise -dff kullanın .
accuya

87
Git temiz -df çalıştırırken dikkatli olun. Ne yaptığını anlamıyorsanız, tutmak istediğiniz dosyaları (örneğin, robots.txt, yüklenen dosyalar vb.)
Siliyor olabilirsiniz

40
@Ctlockey belirttiğimiz gibi aynı zamanda ilk komutasının göz ardı dosyadan oluşurlar eğer silme dizinleri sadece ... benim proje üzerinde yapılandırma dosyaları bir sürü Kayıp :( dikkatli olun.
Maxime Lorant

326

Bu, geçerli dizindeki geçerli dizini denetler ve dosyadaki tüm değişiklikleri geçerli dizinden aşağı atar.

git checkout .

veya dizindeki tüm dosyaları kontrol eden ve çalışma ağacı dosyalarının üzerine yazan bu.

git checkout-index -a -f

28
Merhaba, git checkout .ve arasındaki fark git checkout -- .nedir?
Evan Hu

5
@Evan: Bu durumda fark yok.
Robert Siemer

10
Robert Siemer ve genel olarak?
RJFalconer

2
@Evan: bu soruyu sormak için kötü bir yer. - OP sorunuyla ilgisi yoktur ve buradaki cevapla ilgisi yoktur.
Robert Siemer

14
Doğru bazı dosyalar hem sahnelenen sahip durumda işler olarak 1 Bu SAĞ CEVAP olduğunu ve değişiklikleri un-düzenlediler. Bu çözümün işaretsiz değişiklikleri DISCARDS olduğuna dikkat edin; eğer onları saklamak istiyorsan, @ greg-hewgill'in cevabını kullanmalısın git stash save --keep-index.
Ravent

248
git clean -df

Geçerli dizinden başlayarak sürüm denetimi altında olmayan dosyaları yinelemeli olarak kaldırarak çalışma ağacını temizler.

-d: İzlenmemiş dosyalara ek olarak izlenmeyen dizinleri kaldırın

-f: Kuvvet ( clean.requireForceayara bağlı olarak gerekli olmayabilir )

git help cleanKılavuzu görmek için çalıştırın


neden bu cevabın tüm oyları yok? 2011 yılında cevap verdi ve hala doğru.
Eugene Braginets

106

Benim favorim

git checkout -p

Bu, seçmeli olarak parçaları geri almanızı sağlar.

Ayrıca bakınız:

git add -p

9
Atılmadan önce gerçek değişikliği görme yeteneğini seviyorum.
Penghe Geng

Ben bunu kullanıyorum. git checkout -p ve sonra kabul etmek için "a".
Mattis

2
Hiç düşünmemiştim. Bu -pda hoş bir ekstra güvenlik katmanı ekler. OP'yi git clean -dgerçekten cevaplamak için ile birleştirin .
Stephan Henningsen

96

Hiçbir yanıt kullandığım seçenek kombinasyonunu tam olarak önermediğinden, işte burada:

git clean -dfx
git checkout .

Kullanılan git cleanseçenekler için çevrimiçi yardım metnidir :

-d

İzlenmemiş dosyalara ek olarak izlenmeyen dizinleri kaldırın. İzlenmeyen bir dizin farklı bir Git deposu tarafından yönetiliyorsa, varsayılan olarak kaldırılmaz. -fBöyle bir dizini gerçekten kaldırmak istiyorsanız seçeneği iki kez kullanın .

-f

Git yapılandırma değişkeni ise clean.requireForcehiç ayarlanmamış false, Git temiz verilen sürece dosyaları veya dizinleri silmek için reddeder -f, -nya -i. Git, .gitbir saniye verilmedikçe alt dizin veya dosya içindeki dizinleri silmeyi reddeder -f.

-x

Dan kurallarını görmezden kullanmayın .gitignore(dizininde başına) ve $GIT_DIR/info/exclude, ama yine de verilen kurallar gözardı kullanırım -eseçenekleri. Bu, yapı ürünleri de dahil olmak üzere izlenmeyen tüm dosyaların kaldırılmasını sağlar. Bu, git resettemiz bir yapıyı test etmek için bozulmamış bir çalışma dizini oluşturmak için (muhtemelen ile birlikte ) kullanılabilir .

Ayrıca, git checkout .repo kökünde yapılması gerekiyor.


Bu çözüm için +1. "Git kasası. Repo kökünde yapılması gereken" sözleriyle ilgili olarak, belki git reset --hardbunun yerine yapabileceğimizi söyleyebiliriz ? (bu aslında git reset --hard HEADşu anki dizinle eşdeğer ve hangisinin çalışması gerektiğidir ...)
ErikMD

2
Ayrıca ilk komutla ilgili olarak, git clean -dfxçalıştırmadan git clean -d -x -nönce güvenli tarafta olmak için kullandığım bir ipucu: sadece önce çalıştır , kaldırılacak dosyaların listesini görüntülemek için, ardından çalıştırarak işlemi onaylayın git clean -d -x -f(argümanı koydum -n, -fsonunda bir terminalde hızlı bir şekilde değiştirebilmek için)
ErikMD

5
Bunun geri döndürülemez olduğunu ve dosyalarınız .gitignorevarsa bunları kaybedeceğinizi unutmayın. Bu yüzden projenizi bundan önce yedeklemeyi düşünün.
Rob

69

Yalnızca mevcut dosyalarda yapılan değişiklikleri kaldırmak istiyorsanız , checkout( burada belgelenmiş ) kullanın .

git checkout -- .
  • Hiçbir şube belirtilmediğinden, geçerli dalı denetler.
  • Çift tire ( --) Git'e aşağıdakilerin ikinci argümanı (yol) olarak alınması gerektiğini, bir dalın belirtimini atladığınızı söyler.
  • Nokta ( .) tüm yolları gösterir.

Son işleminizden bu yana eklenen dosyaları kaldırmak istiyorsanız , clean( burada belgelenmiştir ) kullanın :

git clean -i 
  • -iOpsiyon başlatır interaktif clean, yanlış silme işlemlerini engellemek için.
  • Daha hızlı bir işlem için birkaç seçenek daha mevcuttur; belgelere bakın.

Daha sonra erişmek için değişiklikleri bir saklama alanına taşımak istiyorsanız , stash( burada belgelenmiştir ) kullanın :

git stash
  • Tüm değişiklikler daha sonra erişmek için Git'in Stash'ına taşınacaktır.
  • Daha incelikli saklama için bir avuç seçenek mevcuttur; belgelere bakın.

Bu, değişikliklerinizi tam olarak dönüştürecek ve yeni eklenen dosyaları önceki işlemden çıkaracaktır.
Yohan Chung

Bunu açıklamak için seçti :)
Archie G. Quiñones

62

Bu makaleyi hangi komutun ne zaman kullanılacağını açıklamak için gerçekten yararlı buldum: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

Birkaç farklı durum var:

  1. Dosyayı sahnelemediyseniz kullanırsınız git checkout. Checkout "çalışma ağacındaki dosyaları dizindeki sürümle eşleşecek şekilde günceller". Dosyalar sahnelenmemişse (diğer bir deyişle dizine eklenir) ... bu komut esas olarak dosyaları son taahhüdünüze geri döndürür.

    git checkout -- foo.txt

  2. Dosyayı hazırladıysanız git reset komutunu kullanın. Sıfırla, dizini bir taahhüt ile eşleşecek şekilde değiştirir.

    git reset -- foo.txt

Kullanmanın git stashpopüler bir seçim olduğundan şüpheleniyorum çünkü biraz daha az tehlikeli. Git reset kullanırken yanlışlıkla çok fazla havaya uçarsanız her zaman ona geri dönebilirsiniz. Sıfırlama varsayılan olarak özyinelemelidir.

Daha fazla tavsiye için yukarıdaki makaleye göz atın.


60

Bunu yapmanın en kolay yolu şu komutu kullanmaktır:

Bu komut, çalışma dizinindeki değişiklikleri atmak için kullanılır -

git checkout -- .

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

Git komutunda, izlenmeyen dosyaların saklanması aşağıdakiler kullanılarak gerçekleştirilir:

git stash -u

http://git-scm.com/docs/git-stash


19
İki kez buraya geldim, bu cevabı okudum .ve sonunda unuttum . Gelecekte bana: dönem çok önemli !
bejado

2
Bir alt dizindeki tüm yerel değişikliklerden kurtulmam gerekiyordu. Bu cevap çok yardımcı oldu, teşekkürler
Ally

2
Lütfen iki komutun ne yaptığını açıklayın. Hiçbir açıklama yapmak gerçekten yararsızdır.
Chris Kennedy

2
mükemmel. Ödeme bir komutta en popüler olanı ikide yapar. git clean -fddizinde olmayan dosyaları temizlemek için de takip edilebilir .
oligofren

49

Değişmemiş değişiklikleri tutmak istemiyorsanız (özellikle aşamalı değişiklikler yeni dosyalarsa), bunu kullanışlı buldum:

git diff | git apply --reverse

44

git checkout -f


man git-checkout:

-f, --force

Dalları değiştirirken, dizin veya çalışma ağacı KAFA'dan farklı olsa bile devam edin. Bu, yerel değişiklikleri atmak için kullanılır.

Dizinden yolları kontrol ederken, birleştirilmemiş girişlerde başarısız olmayın; bunun yerine birleştirilmemiş girişler yok sayılır.


2
Bu, dizindeki değişiklikleri silecektir !! (Ve OP onları olduğu gibi bırakmayı gerektirir.)
Robert Siemer

44

Git durumunu yazarken (çalışma dizinindeki değişiklikleri atmak için "git checkout - ..." kullanın) gösterilir.

Örneğin git checkout -- .


1
Tüm dosyaları hızlı bir şekilde atmaya yardımcı olmadığı için indirildi. Üç nokta, tüm dosyaları listelemenizin gerektiğini belirtir. Bu, özellikle aynı anda tonlarca dosyayı atmanız gerektiğinde kötüdür, örn. tutmak istediğiniz tüm değişiklikleri yaptıktan sonra büyük bir birleşme sırasında
usr-local-ΕΨΗΕΛΩΝ

2
Tabii ki, doğru komut "git checkout -." tek bir nokta.
Yorumda

39

Git stash kullanabilirsiniz - bir şeyler ters giderse, yine de stash'tan geri dönebilirsiniz. Buradaki diğer yanıtlara benzer, ancak bu aynı zamanda tüm tatsız dosyaları ve tüm tatsız silmeleri kaldırır:

git add .
git stash

her şeyin yolunda olup olmadığını kontrol ederseniz, zulayı atın:

git stash drop

Bilal Maqsood'un yanıtı git cleanda benim için çalıştı, ancak saklamakla daha fazla kontrole sahibim - yanlışlıkla kazaraysam, yine de değişikliklerimi geri alabilirim

GÜNCELLEME

Bence 1 değişiklik daha var (bunun neden benim için daha önce işe yaradığını bilmiyorum):

git add . -A onun yerine git add .

olmadan -Akaldırılmış dosyalar sahnelenecek olmayacak


38

2019 güncellemesi:

Yana Temmuz 2019 , tam olarak bunu yapar yeni bir komut olmuştur: git restore.

Gelen git status, şimdi Git yerine bu komutu kullanarak önerir git checkouteskisi kadar.

Bu komut, çalışma ağacını belirli bir işleme geri yüklemek veya dizinin içeriğini geri yüklemek için de kullanılabilse de, varsayılan olarak çalışma ağacı dizindeki duruma geri yüklenir (burada istenenler).

Bu nedenle, bir pathspec ile eşleşen dosyaları (geri yüklenmemiş değişikliklerinden kurtulmak için) yapmak için şunları yaparsınız:

git restore <pathspec>

Örneğin, geçerli dizindeki tüm etiketlenmemiş değişiklikleri geri yüklemek için şunu çalıştırabilirsiniz:

git restore .

Bunu projenin kökünden çalıştırırsanız, depodaki tüm değişmemiş değişiklikleri geri yükler.

Bununla birlikte git checkout -- .(Mariusz Nowak tarafından belirtildiği gibi), bunun yalnızca Git tarafından izlenen dosyalarda yapılan değişiklikleri sileceğini ve yeni izlenmeyen dosyaları atmayacağını unutmayın. İzlenmeyen yeni dosyalar da dahil olmak üzere değiştirilmemiş değişiklikleri silmek isterseniz, ek bir komut çalıştırabilirsiniz:

git clean -df

Bu komutla çok dikkatli olun, ancak kurtulmak istemediğiniz dosyaları atabilirsiniz.


Not git restore: Bu yeni bir komut olduğundan kılavuz sayfası bir uyarı verir:

Bu komut deneyseldir. Davranış değişebilir.

Dolayısıyla, eğer davranış gelecekte değişecekse bu cevabın modası geçmiş olabilir. Bu yüzden man git-restorekullanmadan önce hızlı koşmak akıllıca olabilir .


2
Dengesiz değişikliklerimi yeni eklenen dosyaları etkilemeden geri döndürmek istedim, bu yüzden git restore .mükemmel çalıştı. Teşekkürler.
Saurabh Misra

3
Yaptım git restore <filename>ve mükemmel çalıştı.
Merlin

1
Benim için iyi çalıştı.
Prometheus

1
Man sayfasına göre git restore ., depodaki tüm dosyaları değil, geçerli dizindeki tüm dosyaları geri yükler.
jarno

1
Haklısın. Teşekkürler! Sadece test ettim ve gerçekten de durum böyle. Ancak, özyinelemelidir. Bu nedenle, projenin kökünden çalıştırıldığında, tüm depo için geçerlidir. Cevabımı düzenleyeceğim.
prosoitos

35

Değişiklikleri silmek yerine, uzaktan kumandayı başlangıç ​​noktasına sıfırladım. Not - bu yöntem klasörünüzü tamamen repo klasörüne geri yüklemektir.

Bu yüzden ben sıfırlama yaptığımda orada oturmadıklarından emin olmak için yapıyorum (daha sonra - Origin / branchname üzerindeki gitignores hariç)

NOT: Henüz izlenmeyen, ancak GITIGNORE'da olmayan dosyaları tutmak istiyorsanız, uzak deponuzda bulunmayan bu izlenmemiş dosyaları sileceği için bu adımı atlamak isteyebilirsiniz (teşekkürler @XtrmJosh).

git add --all

Sonra ben

git fetch --all

Sonra başlangıç ​​noktasına sıfırlandım

git reset --hard origin/branchname

Bu onu bir kareye geri döndürür. Tıpkı şubeyi yeniden kopyalamak gibi, tüm gitignored dosyalarımı yerel ve yerinde tutarken.

Aşağıdaki kullanıcı yorumu başına güncellenmiştir: Kullanıcının bulunduğu şubeye sıfırlama varyasyonu.

git reset --hard @{u}

Bu benim tercih ettiğim seçenek, ama neden önce tüm değişiklikleri ekliyorsunuz? Git reset --hard kullanırken, bunun Git dosyalarındaki dizin listesini değiştirdiğini bildiğim kadarıyla, dizinler hala kaldırılırken bu yine de kaybolacak.
XtrmJosh

Mac veya linux kullanmıyorum, github windows powershell bazen sıfırladıktan sonra dosyaları orada bırakır. Bence onun sıfırlama depodaki tüm dosyaları orijinal durumuna ayarlar. Eğer eklenmezlerse dokunulmazlar. Masaüstü istemcisi daha sonra "hey bu dosya burada ve taahhüt edilmesi gereken" alacak
Nick

Anlam. Windows'u kullanmıyorum bu yüzden bu sorunu görmedim (en azından son birkaç aydır Windows'u kullanmadım, daha önce hatırlamıyorum - büyük bir pişmanlık bulanıklığı). Ana cevabınızdaki mantığı belirtmeye değer olabilir :)
XtrmJosh

Ben de şimdi Mac'te bu sorunu yaşadım. Dosya Repo'da izlenmezse bazen git reset dosyaya dokunmaz. Gerçekten "NEDEN" izole edemiyorum ama bu olduğunda, eğer sıfırlar ve hala 1 ya da iki taahhütlü dosya var, ben --all ve sıfırlama --hard tekrar eklemek
Nick

2
Sevdiğim güzel küçük bir varyasyon git reset --hard @{u}, mevcut uzaktan izleme şubesinin olduğu yere şubeyi sıfırlayan
user2221343

31

Yukarıdaki tüm çözümleri denedim, ancak yeni, etiketsiz dosyalardan hala kurtulamadı.

git clean -fBu yeni dosyaları kaldırmak için kullanın - dikkatli olun! Kuvvet seçeneğini not edin.


21

basitçe söyle

git stash

Tüm yerel değişikliklerinizi kaldıracak. Daha sonra şunu kullanarak da kullanabilirsiniz:

git stash apply 

veya git stash pop


21

Sadece kullan:

git stash -u

Bitti. Kolay.

Eğer saklamak yığın gerçekten önemsiyorsanız o zaman takip edebilirsiniz git stash drop. Ancak bu noktada (Mariusz Nowak'tan) kullanmaktan daha iyidir:

git checkout -- .
git clean -df

Yine de, git stash -uen iyisini seviyorum çünkü tek bir komutta izlenen ve izlenmeyen tüm değişiklikleri "atar" . Oysa git checkout -- .sadece atar değişiklikleri ve izlenen git clean -dfyalnızca atar izlenmeyen değişiklikler ... ve her iki komutları yazarak olduğunu çok çok fazla iş :)


Not: git stash -uyakında (Git 2.14.x / 2.15, Q3 2017) biraz gelişecek: stackoverflow.com/a/46027357/6309
VonC

Ben OP sorusunu doğru alırsanız dizinlenmiş dosyaları tutulmalıdır. Sadece dengesiz değişiklikler kaldırılmalıdır. Bence öyle olmalı git stash -k.
ek

21

Kalıcı bir atma işlemi yapmak için: git reset --hard

Değişiklikleri daha sonra kullanmak üzere kaydetmek için: git stash


16

Bu, aşağıdaki dizinlerde bile çalışır; normal git izinlerinin dışında.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Son zamanlarda bana oldu


Yine de, yok sayılan içeriğin orijinal izinlerini korumadığını unutmayın! Bu nedenle güvenlik riskine neden olabilir.
twicejr

@twicejr Yanılıyorsunuz, lütfen git help clean"-d İzlenmemiş dosyalara ek olarak izlenmeyen dizinleri kaldırın."
GlassGhost

Neden tüm dosyalarınızı dünya okuma / yazma olarak ayarladınız? İyi uygulama değil.
Ghoti

@ Kötü benim, 664 doğru mu? yanıtı düzenleyebilirsiniz.
GlassGhost

Tüm izinlerin 664 olarak ayarlanması, projenin ne tür izinlere ihtiyaç duyduğu konusunda birçok varsayım yapar. Komutun bu kısmını kullanmak bazı insanlar için sorunlara neden olacağını düşünüyorum.
ianrandmckenzie


14
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory

12

Bence,

git clean -df

hile yapmalı. Gereğince git şekilde temizlemek üzerinde Git belgelerine

git-clean - İzlenmemiş dosyaları çalışma ağacından kaldır

Açıklama

Geçerli dizinden başlayarak sürüm denetimi altında olmayan dosyaları yinelemeli olarak kaldırarak çalışma ağacını temizler.

Normalde, yalnızca Git tarafından bilinmeyen dosyalar kaldırılır, ancak -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.

İsteğe bağlı ... bağımsız değişkenler verilirse, yalnızca bu yollar etkilenir.

Seçenekler

-d İzlenmemiş dosyalara ek olarak izlenmeyen dizinleri kaldırın. İzlenmeyen bir dizin farklı bir Git deposu tarafından yönetiliyorsa, varsayılan olarak kaldırılmaz. Böyle bir dizini gerçekten kaldırmak istiyorsanız -f seçeneğini iki kez kullanın.

-f --force Git yapılandırma değişkeni clean.requireForce, false değerine ayarlanmazsa, git clean, -f, -n veya -i verilmedikçe çalışmayı reddeder.


11

Reponunuzun durumu ne olursa olsun her zaman önceki herhangi bir taahhüde sıfırlayabilirsiniz:

git reset --hard <commit hash>

Bu işlem, söz konusu taahhütten sonra yapılan tüm değişiklikleri silecektir.


2
Bu, aynı zamanda OP'nin istediği şeyin ötesinde olan, dizindeki her şeyi (yalnızca dizinde olmayan şeyler değil) atar.
Linus Arver

10

Git clean -df'den daha spesifik olan yeni dosyalardan kurtulmanın başka bir yolu da, mutlaka hepsi olmayan bazı dosyalardan kurtulmanıza izin verecektir), önce yeni dosyaları dizine eklemek, sonra stash, sonra bırakmak saklamak.

Bu teknik, herhangi bir nedenden ötürü, izlenmeyen tüm dosyaları sıradan bir mekanizma (rm gibi) ile kolayca silemediğinizde yararlıdır.


9

Bundan sonra, düzenli olarak başka bir repo ile düzenli olarak senkronize ettiğiniz (örn. Çekme talebi) bir depo çatalıyla çalışıyorsanız, gerçekten bir çözümdür. Kısa cevap: çatal ve refork silin, ancak github'daki uyarıları okuyun .

Benzer bir sorunum vardı, belki de aynı değil ve çözümümün ideal olmadığını, ancak sonuçta etkili olduğunu söylemek üzücü.

Genellikle böyle (en az 2/4 dosya içeren) git durum iletileri olurdu:

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

Keskin bir göz, bu dosyaların durumda tek bir harf olan dopplegangerlara sahip olduğunu not edecektir. Her nasılsa, ve beni bu yola başlamak için neyin yol açtığına dair hiçbir fikrim yok (bu dosyalarla yukarı akış deposundan kendim çalışmadığım için), bu dosyaları değiştirmiştim. Bu sayfada listelenen birçok çözümü deneyin (ve diğer sayfalar) yardımcı olmadı.

Çatallı depomu ve tüm yerel depoları silerek ve yeniden kaydettirerek sorunu çözebildim. Bu tek başına yeterli değildi; upstream, söz konusu dosyaları yeni dosya adlarıyla yeniden adlandırmak zorunda kaldı. Taahhütsüz herhangi bir işiniz, wiki'leriniz ve yukarı akış deposundan sapan hiçbir sorun olmadığı sürece, iyi olmalısınız. Memba en azından söylemek gerekirse, seninle çok mutlu olmayabilir. Benim sorunum için ise, git konusunda o kadar uzman olmadığımdan şüphesiz bir kullanıcı hatası, ama git ile ilgili bir soruna işaret etmek çok kolay değil.


7

Bir zulayı başka birine aktarmak istediğinizde:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

Yorumlandığı gibi, stashes adını vermek mümkündür. Eh, saklamak paylaşmak istiyorsanız bunu kullanın;)


5
Aslında Git stash'ın bir başlığı olabilir. Mesela git stash save "Feature X work in progress".
Colin D Bennett

7

Nasıl tanımlayıcı bir şekilde yapılacağını açıklayan kendi takma adınızı oluşturabilirsiniz.

Değişiklikleri atmak için bir sonraki diğer adı kullanıyorum.


Çalışma ağacındaki (listeler) dosya (lar) daki değişiklikleri sil

discard = checkout --

Ardından, tüm değişiklikleri atmak için onu sonraki olarak kullanabilirsiniz:

discard .

Veya sadece bir dosya:

discard filename

Aksi takdirde, tüm değişiklikleri ve ayrıca izlenmeyen dosyaları silmek istiyorsanız, bir ödeme karışımı ve temiz kullanın:

Çalışma ağacındaki değişiklikleri ve izlenmeyen dosyaları temizleme ve atma

cleanout = !git clean -df && git checkout -- .

Yani kullanımı bir sonraki kadar basit:

cleanout

Şimdi birçok takma ad içeren bir sonraki Github deposunda kullanılabilir:


7

Bir dosyanın her zaman unstaged olduğu garip bir durum vardı, bu çözmemde bana yardımcı olur.

git rm .gitattributes
git add -A
git reset --hard

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.