Nasıl çekilir, sadece bir dosya için değişir, tüm commit değil


Yanıtlar:


137

Neyi başarmak istediğinize bağlı olarak farklı seçenekleriniz var:

Dosyanın içeriğinin hedef daldakiyle aynı olmasını istiyorsanız kullanabilirsiniz git checkout <branch> -- <filename>. Ancak bu, tek bir işlemede meydana gelen değişiklikleri “seçmeyecektir”, sadece söz konusu dosyanın sonuçtaki durumunu alacaktır. Dolayısıyla, bir işleme satır eklediyseniz, ancak önceki kayıtlar daha fazla değiştiyse ve yalnızca bu satırı diğer değişiklikler olmadan eklemek istiyorsanız, o zaman bir ödeme istediğiniz şey değildir.

Aksi takdirde, bir işlemde tanıtılan yamayı yalnızca tek bir dosyaya uygulamak istiyorsanız, birden çok seçeneğiniz vardır. Çalıştırabilirsiniz git cherry-pick -n, yani taahhüt etmeden, tamamlamayı düzenleyebilirsiniz (örneğin kullanarak tüm dosyaları sıfırlayın git reset -- .ve yalnızca kullanarak gerçekten değiştirmek istediğiniz dosyayı ekleyin git add <filename>). Veya dosya için fark oluşturabilir ve ardından farkı uygulayabilirsiniz:

git diff <branch>^..<branch> -- <filename> | git apply

22

Bir oluşturun patch fileve uygulayın.

git diff branchname -- filename > patchfile
git apply patchfile

DÜZENLE:

Bir commit'deki değişiklikleri almanız gerektiğinden, yamayı şu şekilde oluşturun:

git show sha1 -- filename > patchfile

1
git diff sha1(veya git diff branch- dal aynı hash'i işaret ederse aynıdır) sadece o hash ile ilgili olarak mevcut çalışma dizininin bir diff'ini üretecektir, ancak kendi başına tanıtılan bir commit'i değiştiren şey değil.
dürtmek

Doğru. Cevabı düzenledi. Teşekkürler.
Sailesh

1
git checkoutDosya adı ile -1 bu çivi için doğru çekiçtir. Bu seçeneklerin ikisi de gereksiz yere karmaşıktır.
Rein Henrichs

7
Bu özel durum için evet. Ancak genel olarak, belirli bir dosyaya yapılan bir işlemden değişiklikleri seçmek istiyorsanız, daha checkoutönce istenmeyen diğer değişiklikleri içerebileceğinden ve geçerli dalda yapılan değişiklikleri içermeyebileceğinden çalışmayacaktır.
Sailesh

11

Yapılması gereken başka bir kullanışlı şey de yamayı yerel olarak almak ve ardından kullanmaktır:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 

Yine de bu bir kiraz toplama değil.


2
Uyarı: @poke'un cevabında söylediği gibi, bu değişikliklerin üzerine kopyalanmaz; dosyanın tüm durumunu kopyalar. Bu nedenle , dosyaya bir commit değişikliklerini eklemek istiyorsanız , bu şekilde kontrol ederek , iyi olmayan daha yeni değişikliklerin üzerine yazabilirsiniz .
Alexander Kuş

7

Git her şeye hazır :)

Sadece kullan git checkout <sha> <path-to-file>


4
Bu bir kiraz toplama değil - bu, dosyayı tam olarak kontrol eder. Amaç, taahhütten belirli bir değişiklik yapmaktır. Çoğunlukla bunlar aynı şeydir, ancak bazen değildir.
AndrewF

6
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

bu, başka bir şubeden tek bir dosyanın mevcut çalışma dalına kopyalanmasını istiyorsanız çalışır


1
Dikkatli olun, diğer şubeden sürümde olmayan dosyada yapılan değişiklikler kaybolacaktır.
Patrick Schlüter

Bununla anlaştı. bu, dosyanın bir kopyasına ihtiyacınız varsa ve mevcut şubede değiştirmek istiyorsanız yararlıdır
Ismail Iqbal

1
Glob (yol / *) kullanılabilir ve birden fazla yol / dosya belirtilebilir
Todd

1

Aradığınız şey bu:

git checkout target-branch sha1 path/to/file

sha1 isteğe bağlıdır


11
hayır, " kaydetmede değişiklikleri seç ", "tüm dosyayı seç" değildir
Abyx

1

Yapmaya meyilli olduğum şey kullanmak git ls-tree

sadece yap:

git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'

Bu, grep'inizle eşleşen tüm dosya adlarını yazdırır ve kaydetmedeki dosyaların SHA1 anahtarlarını verir.

Git show şubenizin dışındaki dosyalarda da kullanılabilir. >Çıktıyı bir dosyaya yönlendirmek için kabuğunuzdan kullanmak size aradığınız sonucu verir.


0

Bunu yapmayı deneyebilirsiniz:

git show COMMIT_ID -- path/to/specific-file | git apply

Örneğin:

git show 3feaf20 -- app/views/home/index.html | git apply

-9
git reset HEAD~1

dosyaları ön işleme aşamasına taşır

git stash

bellekten kaldırır

Şimdi dalınız oldukça temiz (önceki işleme geri döndü)

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.