Tek bir dosyanın donanımdan sıfırlanması


1005

Şu anda çalışma dizinimde üç değiştirilmiş dosya var. Ancak bunlardan birinin HEAD durumuna sıfırlanmasını istiyorum.

SVN'de kullanırım svn revert <filename>( svn update <filename>gerekirse gerekirse) ama Git'te kullanmalıyım git reset --hard. Ancak bu komut tek bir dosyada çalışamaz.

Git'te değişiklikleri tek bir dosyada atmanın ve yeni bir HEAD kopyayla üzerine yazmanın bir yolu var mı?


3
git checkoutcevap aşağıdadır. Git'te "geri döndür" işlemi bir taahhütte yaptığınız bir şeydir. "Geri döndür", geçmiş dizinin tersini çalışma dizininize yeniden gönderir, böylece geri döndürülen taahhüdü "geri alan" yeni bir taahhüt yapabilirsiniz. Ben bu svn git için gelen insanlar için sık sık kafa karışıklığı olduğunu düşünüyorum.
Dan Ray


Yollarla neden sıfırlama yapamayacağınızla ilgileniyorsanız, cevabımı buradan kontrol edin .
kullanıcı

Bu soru, donanım sıfırlamasının ne olduğunu bildiğini varsayar.

Yanıtlar:


1809

Aşağıdaki komutu kullanabilirsiniz:

git checkout HEAD -- my-file.txt

... hem çalışma kopyasını hem my-file.txtde dizindeki durumunu HEAD ile günceller.

--temel olarak şu anlama gelir: bu noktadan sonraki her argümana bir dosya adı gibi davranın . Bu cevapta daha fazla ayrıntı . VonC'ye bunu işaret ettiği için teşekkürler .


58
Daha eksiksiz cevap. +1;) '-' için ayrıca bkz. Stackoverflow.com/questions/6561142/… (ve daha genel olarak stackoverflow.com/questions/1192180/… )
VonC

8
Ayrıca, HEAD~1sondan bir önceki taahhüdü belirtmek için önceki bir taahhüde başvurabileceğinizi de unutmayın .
Ryanmt

14
Dışarı bırakabilir HEADbkz - güncel şube başında ise norbauer.com/rails-consulting/notes/...
CXW

4
Herhangi bir fikir neden resetkomutu (diyor gibi) neden o zaman "yolları ile hard reset yapamaz" ve checkoutkomut bütün seti sert sıfırlamak için kullanılan (olamaz?) Değil mi? (Yani neden böyle tasarlandığını.)
Sz.

1
@cxw Ne yazık ki, bu tam olarak doğru değil. Manüel sayfasında git checkout: "Dizindeki veya <ağaç> içindeki içeriklerle değiştirerek çalışma ağacındaki yolların üzerine yaz". Yani <tree-ish>atlanırsa, çalışma ağacını güncellemek için dizindeki herhangi bir içerik kullanılır. Bu KAFA'dan farklı olabilir veya olmayabilir.
tuntap

137

Kafaya sıfırla:

Tek bir dosyayı KAFA olarak sıfırlamak için:

git checkout @ -- myfile.ext

Bunun @kısa olduğunu unutmayın HEAD. Git'in eski bir sürümü kısa formu desteklemeyebilir.

Dizine sıfırla:

Tek bir dosyayı dizine sıfırlamak için, dizinin boş olmadığı varsayılarak, aksi takdirde HEAD:

git checkout -- myfile.ext

Mesele şu ki, güvenli olmak için, özellikle yalnızca dizine sıfırlamak istemediğiniz sürece komuttan veya komuttan çıkmak istemezsiniz@HEAD .


1
Myfile.ext'ten önce "-" ne oluyor?
Lance Kind

3
@LanceKind Anladığım kadarıyla, bunu izleyen dosya adlarının bir listesini göstermek için kullanılır. Onsuz git'in argümanları yanlış yorumladığı durumlar vardır.
Acumenus

2
Sadece dosya adları değil. Yaygın olarak kullanılan kural, birçok yardımcı programdaki seçenekleri konumsal bağımsız değişkenlerden ayırır. Bkz. man bashSayfa. Bu cevapta ayrıca belirtilmiş: unix.stackexchange.com/a/187548/142855
boweeb

1
Geleneksel olarak, --programı anlatmak için kullanılır I've finished specifying "options", and from here on, everything will be a positional argument.. Geleneksel olarak, "seçenekler", --recursiveherhangi bir sırada görünebilen, hatta kısa formlarında olduğu gibi birleştirilebilen tokenlerdir rm -rf. Aksine, "konumsal argümanlar", bir programlama dilinde bir işleve iletilen argümanlara çok benzer: tokenler listesindeki konumları , programın onlarla tam olarak ne yapacağını tanımlar (bunlar genellikle dosya adlarıdır). --hangisinin hangisi olduğu konusundaki belirsizliği ortadan kaldırır.
iono

42

Akış yukarı / master'a geri dönmek için şunları yapın:

git checkout upstream/master -- myfile.txt

19

Git 2.23 (Ağustos 2019) tarihinden bu yana kullanabilirsiniz restore( daha fazla bilgi ):

git restore pathTo/MyFile

Yukarıdaki geri yükler MyFileüzerinde HEADgeçerli dal üzerinde (son tamamlama).

Değişiklikleri diğer işlemlerden almak istiyorsanız işlem geçmişinde geriye doğru gidebilirsiniz. Aşağıdaki komut MyFile, son komuttan önce iki işlem alır. Kaynağı kullandığınızda (varsayılan) değil, şimdi kullandığınızdan beri -s( --source) seçeneğine ihtiyacınız var :master~2master

git restore -s master~2 pathTo/MyFile

Dosyayı diğer şubeden de alabilirsiniz!

git restore -s my-feature-branch pathTo/MyFile

1
Şimdiye kadarki en kolay yol. Ne yazık ki bu cevap yeterince ilgi görmüyor.
singrium


4

tek bir dosyayı sıfırlamak için aşağıdaki komutu kullanabilirsiniz

git checkout HEAD -- path_to_file/file_name

path_to_file/filenameAşağıdaki komutla değiştirilecek tüm dosyaları listele

git status

1

Aşağıdaki komutu kullanabilirsiniz:

git reset -- my-file.txt

my-file.txteklendiğinde hem çalışma kopyasını güncelleyecektir .


Değiştirildiği dosyanın içeriğini istendiği gibi değiştirmez.
Rafael

Zulasa eklediğinizde Dosyayı düzenlediniz mi?
ADDYQU

1
Bu özellikle @ADDQU noktası değil. Soru, bir dosyayı hazırlama listesinden kaldırmak değil, "sabit sıfırlama" yöntemidir.
Rafael

@Rafael Haklısın, ama sana bir yol olduğunu bildirmek istiyorum.
ADDYQU

0

Aşağıdaki komutu kullanabilirsiniz:

git checkout filename

Aynı dosya adına sahip bir şubeniz varsa bu komutu kullanmanız gerekir:

git checkout -- filename

1
Bu, dosyayı "donanımdan sıfırlamaz" - yalnızca dizin durumunu çalışma ağacına kopyalar. Bir "donanımdan sıfırlama" önce dizini sıfırlar.
AH

-21

Sizi sıcak sudan çıkarmanın basit, kolay, uygulamalı bir yolu, özellikle git ile o kadar rahat değilseniz:

  1. Dosyanızın günlüğünü görüntüleme

    git log myFile.js

    1023057173029091u23f01w276931f7f42595f84f Yazar: kmiklas Tarih: Sal 7 Ağu 09:29:34 2018 -0400

    JIRA-12345 - Yeni mimariye sahip refactor.

  2. Dosyanın not karması:

    1023057173029091u23f01w276931f7f42595f84f

  3. Karmayı kullanarak dosyayı gösterin. İstediğinizden emin olun:

    git gösterisi 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js

  4. Dosyayı yerel bir kopyaya yönlendir

    git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js> myFile.07aug2018.js

  5. Mevcut dosyanızı yedekleyin.

    cp myFile.js myFile.bak.js

  6. Her iki dosyayı da favori metin düzenleyicinizde açın.

    vim myFile.js
    vim myFile.07aug2018.js

  7. N 'yapıştır kodunu myFile.07aug2018.js dosyasından myFile.js dosyasına kopyalayın ve kaydedin.

  8. Çalıştırın ve myFile.js dosyasını aktarın

  9. Günlüğü tekrar görüntüleyin ve dosyanızın düzgün bir şekilde yerinde olduğunu onaylayın.

  10. Müşterilerinize en son sürümleri çekmelerini söyleyin, eski sürümle çalışmasını mutlu bir şekilde izleyin.

En seksi veya en git merkezli çözüm ve kesinlikle bir "manuel" sıfırlama / geri dönüş değil, ama işe yarıyor. Git hakkında çok az bilgi gerektirir ve taahhüt geçmişini rahatsız etmez.


2
Bu cevap, yıllar öncesine dayanan çözümlerden çok daha karmaşık ve hataya açıktır.
Artif3x

2
Neden herkes bu çözümü kullanmalı? doğru cevap sadece basit bir komuttur.
Milad Rahimi

1
Bu, belirli durumlar için en uygun çözümdür. Git'in arızalı olduğu bir ciltte olanlar ve bir çözüm bulmak isteyenler için bir değeri vardır.
kmiklas
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.