Git'te bir dosyadaki değişiklikleri seçmeli olarak geri almak mı yoksa teslim almak mı?


89

Çalışma dizinindeki bir dosyada (veya dosyalarda) yapılan değişiklikleri kısmen geri almanıza izin veren bir komut var mı?

Diyelim ki bir dosyayı çok fazla düzenlediniz, ancak bazı değişiklikleri taahhütlü duruma geri almak istediğinizi, ancak diğer değişiklikleri geri almak istemediğinizi fark ettiniz.

Bunun için git checkoutçok işe yarayan bir seçenek öngörüyorum git add -p, yani dosyadan iri parça geçiyor ve tutmak isteyip istemediğinizi soruyor.

Yanıtlar:


85

Kullanabilirsin

git add -p <path>

belirli bir dosyada saklamak istediğiniz parçaları sahnelemek için

git checkout -- <path>

saklamak istemediğiniz çalışma ağacı değişikliklerini dosyanın aşamalı sürümünü kontrol ederek atmak için.

Son olarak kullanabilirsiniz

git reset -- <path>

dosyanın aşamalı sürümünü, değişiklikleri aşamasız olarak bırakmanız için dosyanın en son kaydedilmiş sürümüne geri döndürmek.


Diğer tüm sürüm kontrol sistemlerinin sadece "geri döndürme" olarak adlandırdığı bu basit kullanım durumu için Git komutu neden bu kadar belirsiz?
Jan Hettich

5
@Jan Diğer sürüm kontrol sistemlerinin revertkomutu, bir dosyadaki hangi değişikliklerin geri alınacağını seçmenize izin veriyor mu? Sadece CVS ve Git deneyimim olduğu için gerçekten soruyorum. Git'te, git checkout -- path/to/fileo dosyadaki tüm değişiklikleri geri döndüren tek bir komuttur, ancak bu yukarıdakiyle aynı değildir.
michiakig

3
Ayrıca var git checkout --patchve en son git git reset --patchgibi çalışan git add --patch.
Matt Connolly

2
@Rudie, --genellikle seçeneklerin ayrıştırılmasının sonunu ve ondan sonra gelen herhangi bir argümanın tam anlamıyla yorumlanacağını gösterir. Bu, ./eksi işaretiyle başlayan herhangi bir dosya adından önce dosya adı eklemeniz gerekmeyeceği anlamına gelir --.
zrajm

kullandığımda git checkout --patchfark geriye doğru görünüyor. Eksi sembolleri, çalışma kopyama metin EKLİYOR ve artı sembolleri, çalışma kopyamdan satırları KALDIRIYOR.
Felipe Alvarez

115

Git version> = 1.7.1 ile yapabilirim

git checkout -p

Bu özelliğin ne zaman tanıtıldığından emin değilim.


11
Ayrıca git reset -p, aşamalandırma alanı / dizinden değişiklikleri seçici olarak aşamalı hale getirmek için de yapabileceğinizden bahsetmeye değer . Ayrıca bunun Git'in hangi versiyonunda tanıtıldığını da kafamdan bir şekilde bilmiyorum.

Doğru cevap bu, neden kabul edilmedi.
wukong

1
@wukong çünkü bu cevap sorudan 2 yıl sonra yayınlandı. Şu anda (2009), Charles'ın cevabı en iyi çözümdü
pomeh

8

git checkout $filedosyanın $filedurumunu son kaydedilen duruma geri döndürür . git checkout SHA-1 -- $fileDosyayı SHA-1 tarafından tanımlanan kaydetmeye geri döndürmek için kullanabileceğinizi düşünüyorum .


1
evet, tam olarak istediğim şey değil, çünkü yaptığım bazı değişiklikleri dosyada saklamak ve diğerlerini geri almak istiyorum
1800 BİLGİ

1

Geri dönüp seçim yapmak için kaç kaydetmeye ihtiyacınız var? Yalnızca bir ise, belki de hemen önce bir şube alabilir, taahhüt ettiğiniz dosyayı kontrol edebilir ve ardından git add -ponu istediğiniz şekilde eklemek için kullanabilirsiniz . Ardından, bulunduğunuz yere geri dönebilir ve dosyayı geçici şubenizden teslim alabilirsiniz.

yani:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

Diğer alternatifler arasında geri dönme ve commit'i düzenleme git rebase -i(commit'iedit , sonra a yapma git reset HEAD^ve kabuğa geri bırakıldığında commit'i yeniden yapma) bulunur.

Seçmeniz gereken değişiklikler bir dizi taahhüt üzerine yayılmışsa, bunları yamalar (veya tümünü kapsayan bir yama) olarak çıkarmak ve saklamak istediğiniz değişiklikleri alarak yamayı elle düzenlemek daha iyi olabilir. ve artığı beslemek git apply --reverse.


Aslında taahhüt edilen herhangi bir şeyi geri almak istemiyorum, yalnızca çalışma kopyamdaki değişiklikleri geri almak istiyorum
1800 BİLGİ
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.