Taahhüt etmeden önce 'git add' i nasıl geri alabilirim?


8961

Yanlışlıkla Git komutunu kullanarak dosyaları ekledim:

git add myfile.txt

Henüz kaçmadım git commit. Bunu geri almanın bir yolu var mı, bu yüzden bu dosyalar işleme dahil edilmeyecek mi?


22
Git v1.8.4 ile başlayarak , bunun yerine aşağıdaki kullanan HEADveya headartık kullanabileceğiniz tüm cevaplar . Bkz bu cevabı (son bölüm) bunu yapabilir nedenini öğrenmek için. @HEAD

3
Bir dosyayı bozmak için tüm yolları gösteren küçük bir yazlık yaptım: stackoverflow.com/questions/6919121/…
Daniel Alder

5
Neden git kasası olmasın?
Erik Reppen

13
@ErikReppen git checkout, hazırlama dizinindeki aşamalı değişiklikleri kaldırmaz. Sadece son taahhüt edilen revizyona aşamalı olmayan değişiklikleri geri döndürür - bu arada ben de istediğim gibi değil, bu değişiklikleri istiyorum, sadece daha sonraki bir taahhütte istiyorum.
paxos1977

4
Eclipse kullanıyorsanız, iletişim kutusundaki dosyaların işaretini
kaldırmak

Yanıtlar:


10367

Taahhüt git addetmeden önce geri alabilirsiniz.

git reset <file>

başka bir şey değiştirmeden mevcut dizinden kaldıracak ("kaydedilmek üzere" listesi).

Kullanabilirsiniz

git reset

tüm dosya değişikliklerini bozmak için herhangi bir dosya adı olmadan. Makul bir sürede tek tek listelenecek çok fazla dosya olduğunda bu kullanışlı olabilir.

Git'in eski sürümlerinde, yukarıdaki komutlar sırasıyla git reset HEAD <file>ve eşdeğeridir ve tanımsızsa (deponuzda henüz herhangi bir taahhütte bulunmadığınız için) veya belirsiz ( aptalca bir şey olarak adlandırılan bir şube oluşturduğunuz için) git reset HEADbaşarısız olur. yapmamalısınız). Bu Git 1.8.2'de değiştirildi , bu yüzden Git'in modern sürümlerinde ilk taahhüdünüzü yapmadan önce bile yukarıdaki komutları kullanabilirsiniz:HEADHEAD

"git reset" (seçenekler veya parametreler olmadan), geçmişinizde herhangi bir taahhüt olmadığında hata vermek için kullanılır, ancak şimdi size boş bir dizin verir (var olmayan taahhüdü eşleştirmek için bile değil).


92
Tabii ki, bu gerçek bir geri alma değil, çünkü yanlış git addönceki aşamalı bir komite olmayan sürümün üzerine yazılırsa, onu kurtaramayız. Aşağıdaki cevabımda bunu açıklığa kavuşturmaya çalıştım.
leonbloy

7
git reset HEAD *.extexteklemek istediğiniz verili uzantının dosyaları nerede ? Benim için oldu *.bmp&*.zip
boulder_ruby

18
@Jonny, dizin (sahne alanı olarak da bilinir) yalnızca değiştirilmiş dosyaları değil , tüm dosyaları içerir . HEAD tarafından belirtilen taahhütteki tüm dosyaların bir kopyası olarak "hayata başlar" (bir taahhüdü kontrol ettiğinizde veya bir repoyu klonladığınızda). Yani bir dosyayı index ( ) ' den kaldırırsanız , o dosyayı silengit rm --cached bir taahhütte bulunmaya hazırsınız demektir . diğer yandan dosyayı HEAD'den dizine kopyalar, böylece bir sonraki işlem o dosyada yapılan değişiklikleri göstermez. git reset HEAD <filename>
Wildcard

11
Az git reset -pönce bunun gibi bir şey olduğunu keşfettim git add -p. Bu harika!
donquixote

10
Aslında önceden yazılmış ancak değiştirilmemiş değişiklikleri üzerine yazabilirsiniz ancak % 100 güvenli olmayan (en azından hiçbiri bulamadım): goto .git / objects, git addkurtarmak istediğiniz zaman oluşturulan dosyaları arayın ( 61/3AF3...- > nesne kimliği 613AF3...), o zaman git cat-file -p <object-id>(birkaç saat çalışmanın yanı sıra daha sık işlenmesi gereken bir dersi kurtarmaya
Peter Schneider

2151

İstediğiniz:

git rm --cached <added_file_to_undo>

Akıl Yürütme:

Bu konuda yeni olduğumda, önce denedim

git reset .

(tüm ilk eklememi geri almak için), yalnızca bu (o kadar değil) yararlı mesajı almak için:

fatal: Failed to resolve 'HEAD' as a valid ref.

Bunun nedeni, HEAD ref (şube?) İlk taahhütten sonraya kadar mevcut olmadığıdır. Yani, benimki gibi iş akışınız şunun gibi bir şeyse, benimle aynı acemi problemiyle karşılaşacaksınız:

  1. Yeni hotness Git'i denemek için harika yeni proje dizinime cd
  2. git init
  3. git add .
  4. git status

    ... bir sürü saçmalık ...

    => Lanet olsun, hepsini eklemek istemedim.

  5. google "eklentiyi geri al"

    => Yığın Taşması'nı bul - yay

  6. git reset .

    => fatal: 'HEAD' geçerli bir ref olarak çözümlenemedi.

Ayrıca , posta listesinde bunun yararsızlığına karşı günlüğe kaydedilen bir hata olduğu ortaya çıkıyor .

Ve doğru durumun Git durum çıktısında olduğunu (ki, evet, 'saçmalık olarak parladım)

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...

Ve çözüm gerçekten kullanmaktır git rm --cached FILE.

- Başka yerde burada uyarıları Not git rmama, dosyanın yerel çalışma kopyası siler değil kullanırsanız --cached . İşte sonucu git help rm:

--cached Yolları yalnızca dizinden kaldırmak ve kaldırmak için bu seçeneği kullanın. Değiştirilmiş olsun olmasın çalışan ağaç dosyaları bırakılacaktır.

Kullanmaya devam ediyorum

git rm --cached .

her şeyi kaldırmak ve yeniden başlamak için. Yine de işe yaramadı, çünkü add .özyinelemeli olsa da, tekrarlaması rmgerekiyor -r. İç çekmek.

git rm -r --cached .

Tamam, şimdi başladığım yere geri döndüm. Bir dahaki sefere -nkuru bir koşu yapmak ve ne ekleneceğini görmek için kullanacağım:

git add -n .

Hiçbir şeyi yok etmeme git help rmkonusunda güvenmeden önce her şeyi güvenli bir yere sıkıştırdım --cached(ya da yanlış yazmışsam).


15
Hah. Aynı süreci takip ettim. Sadece vazgeçtim ve dedim rm -rf .git, git initçünkü git rm --cachedçalışma kopyamı saklamak için güvenmedim . Git'in bazı yerlerde hala aşırı derecede karmaşık olduğu için biraz söylüyor. git unstagestandart bir komut olmalı, takma ad olarak ekleyip eklemeyeceğimi umursamıyorum.
Adrian Macneil

5
Benim için git diyorgit reset HEAD <File>...
drahnr

16
git rm - önbellek <dosya>, depoya <dosya> öğesinin ilk içe aktarılmasıysa, aslında doğru yanıttır. Dosyadaki bir değişikliği atlatmaya çalışıyorsanız, git reset doğru cevaptır. Bu cevabın yanlış olduğunu söyleyen insanlar farklı bir soru düşünüyorlar.
Barry Kelly

14
Bu aslında işe yarayacaktır, ancak yalnızca dosyanın daha önce bulunmadığı veya git addkomutun yeni dosyalar eklediği ancak varolan dosyalarda değişiklik yapmadığı ilk işlemde çalışır .
naught101

4
sadece sezgisel olmayan ve kıvrımlı git'in ne olduğunu göstermeye gider. paralel "geri al" komutlarına sahip olmak yerine, bunların nasıl geri alınacağını öğrenmeniz gerekir. Bacağınızı hızlı kumda serbest bırakmaya çalışmak ve sonra kolunuzu sıkıştırarak, sonra diğer kolunuzu takmak gibi ... her komut, seçenekler için açılır menüler öğeleri ile GUI aracılığıyla yapılmalıdır ... Tüm kullanıcı arayüzünü düşünün, üretkenlik kazançları elde ettik, ancak retro komut satırı arayüzünün bu karmaşasına sahibiz. Git GUI programları bunu daha sezgisel yapmak gibi değil.
ahnbizcad

532

Eğer yazarsanız:

git status

Git size nasıl sahnelendiğini, vb.

use "git reset HEAD <file>..." to unstage

Git'in böyle durumlarda doğru şeyi yapmam için beni teşvik etmenin oldukça iyi bir işi olduğunu düşünüyorum.

Not: Son Git sürümleri (1.8.4.x) bu mesajı değiştirdi:

(use "git rm --cached <file>..." to unstage)

19
Mesaj, added dosyasının zaten izlenip izlenmediğine bağlı olarak farklı olacaktır ( addyalnızca önbelleğe yeni bir sürüm kaydetti - burada mesajınızı gösterecektir). Başka yerde, dosya daha önce hazırlanmamışsa görüntülenecektiruse "git rm --cached <file>..." to unstage
leonbloy

Harika! git reset HEAD <file>Bir vakada çalışacak tek sen silme dosya unstage istediğim
skerit

2
Git git reset HEADsürümüm 2.14.3, değişmeden diyor .
SilverWolf - Monica'yı geri yükle

246

Açıklığa kavuşturmak için: git adddeğişiklikleri geçerli çalışma dizininden hazırlama alanına taşır (dizin) .

Bu işleme evreleme denir . En doğal komut So sahne değişiklikleri (değişti dosyaları) belirgin olanıdır:

git stage

git add için yazması daha kolay bir takma addır git stage

Yazık ki git unstagene git unaddkomut ne de . İlgili olanı tahmin etmek veya hatırlamak daha zordur, ancak oldukça açıktır:

git reset HEAD --

Bunun için kolayca bir takma ad oluşturabiliriz:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

Ve son olarak, yeni komutlarımız var:

git add file1
git stage file2
git unadd file2
git unstage file1

Şahsen ben daha kısa takma adlar kullanıyorum:

git a # For staging
git u # For unstaging

3
"hamle"? Bu, çalışma dizininden gittiğini gösterir. Konu bu değil.
Thomas Weller

4
Neden belli?
Lenar Hoyt

Aslında, Git ve diğer SCM'deki tarihi komut olan git stagetakma git addaddır. 2008 yılının Aralık ayında, "Git'in git deposunda" 11920d28da taahhüdü ile birlikte ekleyebilirdim.
Obsidiyen

1
Bu alakasız olabilir, ancak yararlı bir fikir bile eklemeden önce dosyayı doğrulamayı buldum, check-komut dosya adı & git git dosya adı gibi bir şey, git'i makinemde daha kısa bir g ile değiştirdim ve şimdiye kadar çalıştı benim için ok: github.com/dataf3l/g , bunun birisi için yararlı olup olmayacağını bilmiyorum, ama buraya bazı insanların zaman kazandıracağı umuduyla koyacağım.
Felipe Valdes

167

Kabul edilen cevaba ek olarak, yanlışlıkla eklenen dosyanız çok büyükse, muhtemelen ' git reset' ile dizinden çıkardıktan sonra bile .gitdizinde yer işgal ettiğini göreceksiniz .

Bu endişelenecek bir şey değil; dosya gerçekten de hala depoda, ama sadece "gevşek bir nesne" olarak. Diğer depolara kopyalanmayacak (klon, itme yoluyla) ve alan belki de çok yakında olmasa da sonunda geri kazanılacak. Endişeli iseniz, şunları yapabilirsiniz:

git gc --prune=now

Güncelleme (aşağıdaki, en çok oylanan cevaplardan kaynaklanabilecek karışıklığı giderme girişimimdir):

Gerçek Yani, geri alma ait git add?

git reset HEAD <file> ?

veya

git rm --cached <file>?

Kesinlikle konuşmak gerekirse ve eğer yanılmıyorsam: hiçbiri .

git add Geri alınamayanGenel .

Önce git add <file>gerçekte ne yaptığını hatırlayalım :

  1. Eğer <file>edilmiştir daha önce izlenmeyen , git add cache ekler bugünkü içeriğiyle.

  2. Eğer <file>edildi zaten izlenir , git add güncel içerik kaydeder önbelleğe (enstantane, sürüm). Git'te, bu eyleme yine de add adı verilir (sadece güncellemez ), çünkü bir dosyanın iki farklı sürümü (anlık görüntüleri) iki farklı öğe olarak kabul edilir: dolayısıyla, sonunda önbelleğe gerçekten yeni bir öğe ekliyoruz sonra taahhüt.

Bunun ışığında, soru biraz belirsiz:

Yanlışlıkla komutu kullanarak dosya ekledim ...

OP'nin senaryosu ilk (izlenmemiş dosya) gibi görünüyor, "geri al" ın izlenen öğelerden dosyayı (yalnızca geçerli içeriği değil) kaldırmasını istiyoruz. Eğer durum böyle ise, o zaman çalıştırmak için Tamam git rm --cached <file> .

Ve biz de koşabiliriz git reset HEAD <file> . Bu genellikle tercih edilir, çünkü her iki senaryoda da çalışır: zaten izlenen bir öğenin sürümünü yanlış eklediğimizde de geri alır.

Ama iki uyarı var.

Birincisi: (cevapta belirtildiği gibi), çalışmayan yalnızca bir senaryo var git reset HEAD, ancakgit rm --cached yeni bir havuz (taahhüt yok) . Ama, gerçekten, bu pratik olarak alakasız bir durum.

İkincisi: git reset HEAD Önceden önbelleğe alınan dosya içeriğini sihirli bir şekilde kurtaramayacağının farkında olun , sadece HEAD ile yeniden senkronize eder. Yanlış yönlendirilmiş git addbir önceki aşamalı taahhütlü olmayan sürümün üzerine yazmışsa, onu kurtaramayız. Bu yüzden, kesinlikle, [*] 'i geri alamayız.

Misal:

$ git init
$ echo "version 1" > file.txt
$ git add file.txt   # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add  file.txt   # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff  file.txt
-version 2
+version 3
$ git add  file.txt    # Oops we didn't mean this
$ git reset HEAD file.txt  # Undo?
$ git diff --cached file.txt  # No dif, of course. stage == HEAD
$ git diff file.txt   # We have irrevocably lost "version 2"
-version 1
+version 3

Tabii ki, sadece yeni dosyalar eklemek için 'git add' yapmanın her zamanki tembel iş akışını takip edersek ve çok yeni bir içeriği, exec, git commit -akomutu ile güncellersek, bu çok kritik değildir .


Düzenle


4
Açıkça söylemek gerekirse git add ile değiştirilmiş zaten hazırlanmış bir dosyayı kurtarmanın bir yolu var. Bahsettiğiniz gibi git add bu dosya için sadece dosyayı tamamen kaldırırken değil, aynı zamanda yeni içerikle üzerine yazıldığında da gevşek bir nesne olacak bir git nesnesi oluşturur. Ancak otomatik olarak kurtarma komutu yoktur. Bunun yerine dosyanın manuel olarak veya sadece bu durum için yazılmış araçlarla tanımlanması ve çıkarılması gerekir (libgit2 buna izin verecektir). Ancak bu yalnızca dosyanın çok önemli ve büyük olması ve önceki sürümü düzenleyerek yeniden oluşturulamaması durumunda ödeme yapar.
Johannes Matokic

2
Kendimi düzeltmek için: Gevşek nesne dosyası bulunduğunda (oluşturma tarihi / saati gibi meta verileri kullanın) git cat-fileiçeriğini kurtarmak için kullanılabilir.
Johannes Matokic

2
Bir başka yolu düzenlemelerine karşın işlememiş ve sonra üzerine değişiklikleri kurtarmak başka örneğin tarafından git addyoluyladır git fsck --unreachablebu o zamana kadar inceleyebilir tüm ulaşılamaz obj, listeler git show SHA-1_IDveya git fsck --lost-foundWill'di> Yaz içine nesneleri sarkan .git/lost-found/commit/veya .git/lost-found/other/, türüne bağlı olarak. Ayrıca bakınızgit fsck --help
iolsmit

110

Git'i kullanarak zaten eklenmiş olan bir dosyayı geri almak oldukça kolaydır. myfile.txtÖnceden eklenmiş olan sıfırlama için şunu kullanın:

git reset HEAD myfile.txt

Açıklama:

İstenmeyen dosyaları hazırladıktan sonra geri alabilirsiniz git reset. Head, yerelde dosyanızın başıdır ve son parametre dosyanızın adıdır.

Bu durumda olabilecek tüm adımlar da dahil olmak üzere, aşağıdaki görüntüdeki adımları sizin için daha ayrıntılı olarak oluşturdum:

git HEAD dosyasını sıfırla


Resim: "Komut ekle ...""Komut ekliyor ..." ( şimdiki basit zaman, üçüncü kişi )
Peter Mortensen

Resim: isteristiyorum (kullanım argo gerek burada yoktur)
Peter Mortensen

92
git rm --cached . -r

geçerli dizininize eklediğiniz her şeyi tekrar tekrar "ekleyemez"


3
Ben her şeyi un-un eklemek değildi, sadece bir dosya.
paxos1977

3
Daha önce taahhütte bulunmadıysanız da yararlıdır. Önceki taahhüt yok, git reset HEAD <file>söyleyebilirimfatal: Failed to resolve 'HEAD' as a valid ref.
Priya Ranjan Singh

6
Hayır, bu ekler bir silme geçerli dizinde her şeyin. Sadece değişmeyen değişikliklerden çok farklı.
Mark Amery

88

Çalıştırmak

git gui

ve tüm dosyaları manuel olarak veya tümünü seçerek ve kesinleştir düğmesine tıklayın.


1
Evet bunu anladım. Sadece dolaylı olarak, "Kullanabilirsiniz git-gui...." gibi cevabınızda belirttiğinizi önermek istedim
Alexander Suraphel

1
"Git-gui: komut bulunamadı" yazıyor. Bunun işe yarayıp yaramadığından emin değilim.
Parinda Rajapaksha

Vay be, bu anlamadığınız komut satırlarını yapmaktan çok daha basit. Bu kesinlikle benim gibi yeni başlayanlar için tavsiye edilir. Bunu yazdığınız için teşekkürler!
Irfandy Jip

Teşekkürler. Bu yüzden GUI kullanmak zorunda kaldı risk istemiyordu.
Sagar Khatri

83

Git'in akla gelebilecek her eylem için komutları vardır, ancak işleri düzeltmek için kapsamlı bilgiye ihtiyaç duyar ve bu nedenle en iyi şekilde sezgiseldir ...

Daha önce ne yaptınız:

  • Bir dosyayı değiştirdi ve kullandı git add .veya git add <file>.

Ne istiyorsunuz:

  • Dosyayı dizinden kaldırın, ancak çalışan kopyada taahhüt edilmemiş değişikliklerle sürümlü ve solda bırakın:

    git reset head <file>
    
  • Değişiklikleri geri alıp dizinden kaldırarak dosyayı HEAD'den son duruma sıfırlayın:

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    Bu, git reset --hard HEADtek dosyalarla çalışmadığından gereklidir .

  • <file>Dizin ve sürüm oluşturma işleminden kaldırın , sürümlenmemiş dosyayı çalışma kopyasındaki değişikliklerle birlikte saklayın:

    git rm --cached <file>
    
  • <file>Çalışan kopyadan ve sürümden tamamen kaldırın :

    git rm <file>
    

1
'Git reset head <file>' ve 'git rm --cached <file> arasındaki farkın altında duramam. Açıklayabilir misiniz?
jeswang

6
@jeswang dosyaları git için 'bilinir' (dosyadaki değişiklikler izlenir.) veya 'sürümlendirilmez'. reset headmevcut değişikliklerinizi geri alır, ancak dosya hala git tarafından izlenir. rm --cacheddosyayı sürümden çıkarır, bu yüzden git artık değişiklikleri kontrol etmez (ve daha önce gittiği söylenen, sonunda dizine eklenen mevcut değişiklikleri kaldırır add), ancak değiştirilen dosya çalışma kopyanızda, yani dosya klasöründe tutulur HDD üzerinde.
sjas

3
Fark git reset HEAD <file>geçicidir - komut yalnızca bir sonraki işleme uygulanır, ancak git rm --cached <file>tekrar eklenene kadar kararsız kalır git add <file>. Ayrıca, git rm --cached <file>bu dalı uzaktan kumandaya iterseniz, dalı çeken herkes dosyayı GERÇEKTEN kendi klasöründen silecektir.
DrewT

80

Soru açıkça sorulmuyor. Nedeni git addiki anlamı var:

  1. hazırlama alanına yeni bir dosya ekledikten sonra geri algit rm --cached file .
  2. hazırlama alanına değiştirilmiş bir dosya ekleyerek geri alın git reset HEAD file.

Şüpheniz varsa,

git reset HEAD file

Çünkü her iki durumda da beklenen şeyi yapıyor.

Uyarı: Değiştirilmiş bir dosyada (daha önce depoda git rm --cached filebulunan bir dosya) yaparsanız , dosya kaldırılır ! Dosya sisteminizde hala var olacaktır, ancak başka biri taahhüdünüzü çekerse, dosya çalışma ağacından silinir.git commit

git statusdosyanın yeni bir dosya mı yoksa değiştirilmiş mi olduğunu size bildirir :

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

7
+1. Bu sayfadaki sıradışı cevaplar ve yorumların sayısı, davranışları hakkında yanlış anlaşılmaktadır git rm --cached somefile. Umarım bu cevap, yeni başlayanların tüm yanlış iddialar tarafından yanıltılmasını önleyebileceği belirgin bir konuma yükselir.
Mark Amery

burada en iyi cevaplardan biri, ne yazık ki listede oldukça düşük
Creos

64

İlk taahhüdünüzdeyseniz ve kullanamıyorsanız git reset, sadece "Git iflas" ilan edin ve .gitklasörü silin ve baştan başlayın


5
Bir ipucu, uzak kökeni eklediyseniz, klasörü silmeden önce .git / config dosyanızı kopyalamaktır.
Tiago

4
@ChrisJohnsen yorum yerinde. Bazen, biri hariç tüm dosyaları git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'Failed to resolve 'HEAD'

57

Diğer cevapların çoğuna göre, git reset

FAKAT:

Aslında Git komutunu ekleyen bu harika küçük gönderiyi buldum (iyi, bir takma ad) git unadd: see git unadd ayrıntılar için bakın veya ..

basitçe,

git config --global alias.unadd "reset HEAD"

Şimdi yapabilirsin

git unadd foo.txt bar.txt

45

Yeni git add -ieklenen dosyaları yaklaşan taahhüdünüzden kaldırmak için kullanın . Misal:

İstemediğiniz dosyayı ekleme:

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

Eklemenizi geri almak için etkileşimli eklemeye gitmek (buraya git'e yazılan komutlar "r" (geri döndür), "1" (listedeki ilk geri döndürme gösterileri), geri döndürme modundan çıkmak için 'geri dön' ve "q" dır. (çıkmak):

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

Bu kadar! "Foo" nun tekrar izlenenler listesinde olduğunu gösteren kanıtınız:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

42

git removeveya git rmbunun için --cachedbayrakla birlikte kullanılabilir . Deneyin:

git help rm

9
Bu, dosyayı tamamen kaldırmayacak mı?
Willa

8
git rm --cached ...git deposundaki dosyaları kaldıracaktır. Bilgisayarınızda hala var olacaklar, ancak bu, bir dosyadaki değişikliklerin değiştirilmesinden ÇOK farklı . Bunun üzerine tökezleyen herkes için, bu soruya geçerli bir cevap değildir.
Addison

38

Yeni bir proje başlattığınızda bu can sıkıcı sorundan kaçınmanın bir yolu:

  • Yeni projeniz için ana dizini oluşturun.
  • Koş git init.
  • Şimdi bir .gitignore dosyası oluşturun (boş olsa bile).
  • .Gitignore dosyanızı kaydedin.

git resetHerhangi bir taahhüdünüz yoksa Git yapmak gerçekten zorlaşır . Sadece sahip olmak uğruna küçük bir başlangıç ​​taahhüdü yaratırsanız, bundan sonra git add -Avegit reset her şeyi doğru yapmak için istediğiniz kadar .

Bu yöntemin bir başka avantajı, daha sonra satır sonu sorunlarıyla karşılaşırsanız ve tüm dosyalarınızı yenilemeniz gerekirse, kolay olmasıdır:

  • İlk taahhüdü kontrol edin. Bu, tüm dosyalarınızı kaldıracaktır.
  • Ardından en son taahhüdünüzü tekrar kontrol edin. Bu, geçerli satır sonu ayarlarınızı kullanarak dosyalarınızın yeni kopyalarını alır.

1
Onaylanmış! Git eklemesinden sonra git sıfırlamasını denedi. ve git bozuk HEAD hakkında şikayet ediyordu. Tavsiyenizi takiben, sorunsuz bir şekilde ileri ve geri
gitme

1
İkinci bölüm işe yarıyor, ama biraz sakar. Satır sonlarının nasıl ele alındığı, autocrlfdeğere bağlıdır ... Bu, ayarlara bağlı olarak her projede çalışmaz.
sjas

1
Bu cevap, yayınlandığı tarihte makuldür, ancak artık kullanılmamaktadır; git reset somefileve şimdi git resether ikisi de ilk taahhüdü vermeden önce çalışıyor. Birçok Git geri döndüğünden beri durum böyledir.
Mark Amery

@MarkAmery, haklı olabilirsiniz (iddianız için bir kaynak yayınlarsanız havalı olur), ancak repoya temiz bir iki taahhütle başlamanın değeri hala var.
Ryan Lundy

34

Belki Git sorunuzu yayınladığınızdan beri gelişmiştir.

$> git --version
git version 1.6.2.1

Şimdi deneyebilirsiniz:

git reset HEAD .

Aradığın şey bu olmalı.


2
Tabii, ama sonra eklenen iki (veya daha fazla) dosyadan birini nasıl eklemeniz gerektiği ile ilgili takip sorunuz var . Ancak "git reset" kılavuzu, "git reset <paths>" ifadesinin "git add <paths>" ifadesinin tersi olduğunu belirtir.
Alex North-Keys

34

Bir düzeltme belirtmezseniz, bir ayırıcı eklemeniz gerektiğini unutmayın. Konsolumdan bir örnek:

git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

git reset -- <path_to_file>
Unstaged changes after reset:
M    <path_to_file>

(Git sürüm 1.7.5.4)


2
Denedim git reset <path>ve ayırıcı olmadan gayet iyi çalışıyor. Ben de git 1.9.0 kullanıyorum. Belki eski sürümlerde çalışmıyor?

31

Yeni dosyaları hazırlama alanından (ve yalnızca yeni bir dosya olması durumunda) yukarıda önerildiği gibi kaldırmak için:

git rm --cached FILE

Rm --cached komutunu yalnızca yanlışlıkla eklenen yeni dosyalar için kullanın.


4
O Zihin --cachedburada gerçekten önemli bir parçasıdır.
takeshin

1
1; Hayır, bu dosyanın aşamasını kaldırmaz, dosyanın silinmesini aşamalandırır (aslında çalışma ağacınızdan silmeden).
Mark Amery

25

Belirli bir klasördeki (ve alt klasörlerindeki) her dosyayı sıfırlamak için aşağıdaki komutu kullanabilirsiniz:

git reset *

4
Aslında, bu her dosyayı sıfırlamaz çünkü * kabuk genişletmeyi kullanır ve dotfiles (ve dot-dizinlerini) yok sayar.
Luc

git statusKalan herhangi bir şeyi görmek için çalıştırıp manuel olarak sıfırlayabilirsiniz git reset file.
Zorayr

25

Tek *seferde birden fazla dosyayı işlemek için komutu kullanın :

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*

vb.


3
* Açıkça belirtmedikçe * genellikle dotfiles veya 'dot-dizinleri' içermeyecektir .*veya.*.prj
Luc

23

Sadece git resetgeri dönecek yazın ve git add .son işleminizden bu yana hiç yazmadınız gibi . Daha önce taahhüt ettiğinizden emin olun.


Olduğu gibi, son bir taahhüt vardı ... ama özellikle tek bir dosyayı taahhütten kaldırmak istiyordum, taahhütten her dosyayı değil.
paxos1977

20

Yeni bir dosya oluşturduğumu varsayalım newFile.txt:

Resim açıklamasını buraya girin

Dosyayı yanlışlıkla eklediğimi varsayalım git add newFile.txt:

Resim açıklamasını buraya girin

Şimdi bu eklemeyi, taahhüt etmeden önce geri almak istiyorum git reset newFile.txt:

Resim açıklamasını buraya girin


Diyelim ki 1. fotoğraftayım, yani "git.add" bile yapmadım. Ayrıca, tüm bu değişikliği hiç istemiyorum. Yani git durumu yaptığımda kırmızı dosya gösterilmemeli. Yani son git push'undan beri değiştirilmiş tek bir dosya yokmuş gibi senkronize olmalı. bunu nasıl başaracağımızı.
Kırılmaz

Yani ilk adımda olduğunuzu varsayalım. Ve "newFile.txt" nin kırmızı olarak görünmesini sağlayan tüm değişikliklerden kurtulmak istiyorsunuz.
Kırılmaz

Git gittiğimde. Hiç bir değişiklik görmemeliyim. Tüm kırmızı dosyalar geri alınmalıdır.
Kırılmaz

Merhaba, bence sorunuz şu anki ağaçtan izlenmeyen dosyaları nasıl kaldıracağınız. Bunun için "git clean -f -d" kullanabilirsiniz. Bu izlenmeyen dizinleri de kaldıracaktır.
Vidura Mudalige

İzlenmeyen dosyaları silmek istemiyorsanız, "-f" bayrağını yok saymanız yeterlidir.
Vidura Mudalige

19

Belirli bir dosya için:

  • git reset my_file.txt
  • git checkout my_file.txt

Eklenen tüm dosyalar için:

  • sıfırlama.
  • git çıkış.

Not: checkout , dosyalardaki kodu değiştirir ve son güncellenen (taahhütlü) duruma geçer. reset kodları değiştirmez; sadece başlığı sıfırlar.


3
Lütfen git reset <file>ve arasındaki farkı açıklayın git checkout <file>.
Trent

1
reset dosyayı değiştirmez, sadece sahneden uzaklaştırın (= indeks, git add tarafından konuldu)
franc

checkout dosyadaki kodları değiştirir ve son güncellenen duruma geçer. reset kodları değiştirmez, sadece başlığı sıfırlar. Örneğin, eklenen veya kaydedilen dosyalar için kullanımı sıfırlamadan önce sıfırlama ve kullanıma alma işlemi için git add'den önceki son güncellenen / taahhüt edilen aşamaya geri dönün.
Hasib Kamal

1
reset = dosyayı aşamadan kaldır ancak değişiklikler yine de devam edecek. checkout = güncellenmiş dosyayı depodan alır ve geçerli dosyayı geçersiz kılar
Imam Bux

14

Bu komut değişikliklerinizi kaldıracaktır:

git reset HEAD filename.txt

Ayrıca kullanabilirsiniz

git add -p 

dosya bölümleri eklemek için.


14

Etkileşimli mod da vardır:

git add -i

Dosya eklemek için 3. seçeneği seçin. Benim durumumda genellikle birden fazla dosya eklemek istiyorum ve etkileşimli modda dosya eklemek için böyle sayılar kullanabilirsiniz. Bu 4: 1, 2, 3 ve 5 hariç hepsini alacak

Bir sekans seçmek için, 1 ile 5 arasında bir sayı almak üzere 1-5 yazın.

Git hazırlama dosyaları


"Kimsenin interaktif moddan bahsetmemesine şaşırdım" - yaptılar: stackoverflow.com/a/10209776/1709587
Mark Amery


10
git reset filename.txt

Filename.txt adlı bir dosyayı geçerli dizinden, "işlenmeye hazır" alanından başka bir şey değiştirmeden kaldıracaktır.


10

git add myfile.txt # Bu, dosyanızı taahhütlü listeye ekleyecektir

Bu komutun tam tersi,

git reset HEAD myfile.txt  # This will undo it.

böylece önceki durumda olacaksınız. Belirtilenler tekrar izlenenler listesinde olacak (önceki durum).

Belirtilen dosya ile başınızı sıfırlar. eğer kafanız buna sahip değilse, sadece sıfırlar.


9

Sourcetree'de bunu GUI aracılığıyla kolayca yapabilirsiniz. Sourcetree'nin bir dosyayı kaldırmak için hangi komutu kullandığını kontrol edebilirsiniz.

Yeni bir dosya oluşturdum ve Git'e ekledim. Sonra Sourcetree GUI kullanarak unstaged. Sonuç budur:

Dosyaları sıfırlama [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - yol / için / dosya / dosyaadı.java

Sourcetree resetyeni dosyaları ayıklamak için kullanır .


Evet, aynı teknik TortoiseGit ile kullanılabilir ve yaygın kullanım durumları için Git komutlarını alır.
Peter Mortensen

8
git reset filename.txt  

Filename.txt adlı bir dosyayı geçerli dizinden, "işlenmeye hazır" alanından başka bir şey değiştirmeden kaldıracaktır.


git reset [dosya adı] ex: git reset src / main / java / com / dao / ImportCsvDatadaoImpl.java
Rohit Chaurasiya
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.