Soru Git'te yalnızca bir dosyanın bir parçasını işleyin


Git'deki bir dosyada değişiklik yaptığımda, yalnızca bazı değişiklikleri nasıl yapabilirim?

Örneğin, bir dosyada değiştirilmiş 30 satırdan sadece 15 satır nasıl işlem yapabilirim?


2242
2017-07-06 02:25


Menşei




Cevaplar:


Kullanabilirsiniz git add --patch <filename> (veya -p kısacası) ve git dosyalarınızı mantıklı "hunks" (dosyanın bölümleri) olduğunu düşündükleri parçalara ayırmaya başlayacak. Daha sonra bu soru ile size sorulacaktır:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

İşte her seçeneğin bir açıklaması:

  • y Bir sonraki taahhüt için bu iri sahneye koy
  • n Bir sonraki taahhüt için bu hunk sahne değil
  • q çıkın; bu hunk veya kalan hunks herhangi bir sahne değil
  • bir Bu iri ve tüm sonraki hunks dosyasını dosyada
  • d Bu hunk veya dosyadaki sonraki hunks herhangi bir aşamada
  • g gitmek için bir ipucu seçin
  • / Verilen regex ile eşleşen bir iple arama
  • j Bu ipeksi kararsız bırakın, sonraki kararsız hunk görmek
  • J Bu ipeksi kararsız bırakın, bir sonraki ipucunu görün
  • k bu ipeksi kararsız bırakın, önceki kararsız hunk görmek
  • K bu ipeksi kararsız bırakın, önceki iri görmek
  • s Mevcut iri küçük parçalara ayır
  • e mevcut ipucunu manuel olarak düzenle
  • ? hunk yardım yazdır

Dosya henüz depoda değilse, önce yapabilirsiniz git add -N <filename>. Daha sonra devam edebilirsiniz git add -p <filename>.

Daha sonra şunları kullanabilirsiniz:
git diff --staged Doğru değişiklikleri yaptığınızı kontrol etmek için
git reset -p unutmadan yanlışlıkla eklendi hunks
git commit -v taahhüt mesajını düzenlerken taahhüdünü görmek için

Not bu çok farklı git format-patch komut, hangi amaçla veriyi ayrıştırmak .patch Dosyalar.

Gelecek için referans: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging


2939
2017-07-06 11:49



Bunu not etmek yararlı olabilir. -p/--patch içindeki yama eyleminin kısayoludur -i/--interactive kullanışlı olan komutu başlatır İnteraktif mod. - tutuDajuju
> Bu dosya zaten ayarlanmışsa ne olur? Sadece gözlemlenmemiş değişiklikler gösterecektir. İle aynı git diff yapar. - Eugen Konkov
Mevcut ipucunu manuel olarak nasıl düzenleyebilirim? Ben yazdıktan sonra ne yapacağımı bilmiyorum. - Hunsu
Basıldıktan sonra e, İadeyi elle değiştirerek düzenleyebilirsiniz. + veya - tarafından # - veksen
yapar s artık yok mu - tam5


Kullanabilirsiniz git add --interactive veya git add -p <dosya>, ve sonra git commit (değil  git commit -a); görmek İnteraktif mod içinde Git-eklenti manpage, ya da sadece talimatları izleyin.

Modern Git ayrıca git commit --interactive (ve git commit --patchetkileşimli işlemde yama seçeneğinin kısayolu olan).

Bunu GUI'den yapmayı tercih ederseniz, Git-gui. İşlemeye dahil etmek istediğiniz parçaları kolayca işaretleyebilirsiniz. Şahsen onu kullanmaktan daha kolay buluyorum git add -i. QGit veya GitX gibi diğer git GUI'ler de bu işlevselliğe sahip olabilir.


216
2017-07-06 02:41



İlginç bir şekilde, windows.github.com kısmi dosya işlemlerini desteklemişti, ancak bunu yakın zamanda düşürmüş görünüyor. - Juri
@Juri Kısmi dosya taahhütlerinin desteğinin geri döndüğünü düşünüyorum. - Ela782
@ Ela782 oh..yes, haklısın. Bunu işaret etmek için teşekkürler. - Juri
@Juri Rica ederim. Aslında daha önce orada olduğunu fark etmedim - geçen hafta gördüm ve "oh, ne inanılmaz yeni özellik" diye düşündüm! :-) - Ela782
Günümüzde windows.github.com, Git GUI'den daha güzel olan ve kısmi taahhütleri destekleyen yeniden isimlendirilmiş GitHub Masaüstü'ne yönlendiriyor ... ancak taahhüt imzalamayı desteklemiyor. İç çekmek. - hacksalot


git gui Bu işlevi farklı görünüm altında sağlar. İlgilendiğiniz çizgi (ler) i tıklamanız yeterlidir ve "bu satırı işlemek için" menü öğesini görmeniz gerekir.


115
2017-09-25 20:45



karmaşık yamalar için bu genellikle benim için en hızlı yaklaşımdır. - hochl
Bu, hazırlama alanına ince taneli bir şekilde değişiklikler eklemek için çok verimli ve sezgisel bir yoldur. Ayrıca birden çok satır seçilebilir ve bu seçimdeki tüm değişiklikler eklenecektir. - jox


buna inanıyorum git add -e myfile en basit yoldur (tercihim en azından) çünkü sadece bir metin editörü açar ve hangi çizgiyi seçmek istediğinizi ve hangi satırı seçmediğinizi seçmenize izin verir. Düzenleme komutları ile ilgili olarak:

eklenen içerik:

Eklenen içerik "+" ile başlayan satırlarla temsil edilir. Ekleme satırlarını bunları silerek önleyebilirsiniz.

kaldırılan içerik:

Kaldırılan içerik "-" ile başlayan satırlarla temsil edilir. "-" ifadesini "" (boşluk) değerine dönüştürerek kaldırılmasını engelleyebilirsiniz.

değiştirilmiş içerik:

Değiştirilen içerik "-" satırları (eski içeriği kaldır) ve ardından "+" satırları (yedek içeriğin eklenmesi) ile gösterilir. "-" satırlarını "" a dönüştürerek ve "+" öğesini kaldırarak değişikliği aşamayı önleyebilirsiniz.              çizgiler. Paritenin sadece yarısını değiştirmenin, dizine kafa karıştırıcı değişiklikler getireceğini unutmayın.

Her detay hakkında git add mevcut git --help add 


55
2018-02-23 10:37



Bu satırların (yani, girilecek asıl komutların) gerçekte nasıl seçileceğine dair net bir açıklama varsa, bu daha yararlı olacaktır. Dokümanlarda bir tane bulamadım. Bir referans ekleyebilir misiniz? - Alex
Shorthand seçeneklerini beğenmeyenler için -e olduğu --edit. - Kolyunya
@AlexFreedomBanana tarafından eklenen referans alıntılar, YAZDIRMA YERLERİNDE git --help add - Randall
Bu hunks daha küçük hale getiremezsiniz zaman hat ekleme / çıkarma sorunu çözen tek cevap (sadece git gerektiren) s etkileşimli yama modunda. - cdosborn
Maalesef yeni bir soru oluşturmak istemiyorum, ancak bu komutu çalıştırırken joker karakterler nasıl kullanılır? Git add -e - ** / * Activity.java ile denedim ama işe yaramadı. Ancak git diff - ** / * Activity.java çalışır. -E seçeneği gibi görünüyor, bu durumda özel bir işlem gerektirir. - ka3ak


Vim kullanıyorsanız, denilen mükemmel eklentiyi denemek isteyebilirsiniz. firari.

Çalışma kopyası ile dizin arasında bir dosyanın farklılığını görebilirsiniz. :Gdiffve sonra gibi klasik vim diff komutları kullanarak dizine çizgiler veya hunks ekleyin dp. Dizindeki değişiklikleri kaydedin ve ile işleyin :Gcommitve işin bitti.

Çok iyi tanıtım tabloları İşte (bkz. esp. Bölüm 2).


41
2017-08-12 13:32



Bu linkler için çok teşekkür ederim. Tam olarak ihtiyacım olan şey aynı. Özellikle :diffget/:diffput Görsel modda, sıfırlamak / taahhüt etmek istediğim belirli satırları seçebileceğim. Yani, tekrar emin olun: vim harika. - goodniceweb


Şiddetle tavsiye ederim SourceTree Atlassian'dan. (Bu ücretsiz.) Bu önemsiz hale getirir. Tek tek kod dizilerini veya tek tek kod satırlarını hızlı ve kolay bir şekilde gerçekleştirebilirsiniz.

enter image description here


26
2017-12-05 17:29



SourceTree'in bu amaç için iyi bir araç olduğuna katılıyorum, çünkü size komut satırından mümkün olandan daha iyi kontrol sağlar.
@Cupcake Ben SourceTree muhtemelen komut satırı git executables kullanır, doğal olarak her zaman (komut satırı) üzerinden aynı (veya daha) ince taneli eylemleri yapmak mümkün olacağını görerek, tersini iddia ediyorum. - tutuDajuju
Ne olursa olsun ince taneli argüman tavsiye ederim SourceTree sahne hunks ve bireysel çizgiler gibi süper kolay: i.imgur.com/85bNu4C.png - Michael Freeman
@tutuDajuju Bu durumda, bunun doğru olduğundan emin değilim. SourceTree sahneye hangi bölümleri seçebiliyor? satır satır. Bütün bir iri sahneye oturmak zorunda değilsiniz; Bir ikincisinin ortasında 2 sıraya geçebilirsiniz. Bununla nasıl başedebileceğine dair hiçbir fikrim yok. (Şu anda, SourceTree'nin izlenmemiş bir dosya için belirli satırları gösterememe çalışmasına çalışıyorum. Burada bir çözüm aramaya başladım, sadece gitmenin satır-line yeteneklerini sunmuyor gibi görünüyor. En azından basit bir şekilde değil. - jpmc26
Kullanabilirsin --patch (diğer cevaplarda da belirtildiği gibi) ve istediğiniz çizgileri aşamayana kadar iri parçalara ayırın. Ayrıca bir UI (tipik olarak bir fark şeklinde) sağlayan birçok başka sarmalayıcı ve uzantı da vardır. applyseçilen hatlardan bir yama; gibi yerleşik git gui ve git-meld-index. Sadece söylüyorum, kaynak ağacı o kadar iyi değil (eski kullanıcı) - tutuDajuju


Kullanmak için dikkat git add --patch bir için yeni dosya dizine eklenecek ilk dosyayı eklemeniz gerekiyor git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14





Çok fazla değişikliğe sahip olduğumda ve değişikliklerden birkaç taahhüt oluşturmaya başladığımda, başlangıç ​​aşamamı şeyleri hazırlamadan önce geçici olarak kaydetmek istiyorum.

Bunun gibi:

$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop

Whymarrh'ın cevabı genellikle yaptığım şeydir, bazen çok fazla değişiklik vardır ve bir şeyleri yaparken bir hata yapabilirim diyebilirim ve ikinci bir geçiş için geri çekilebilecek kararlı bir devlet istiyorum.


17
2017-07-08 07:00





Emacs kullanmalı mı? Magit, emacs için bir git arayüzü sağlar. Destekler evliler hunks (dosya bölümleri) oldukça iyi.


12
2017-08-07 13:25



Genellikle bir M-x kabuk penceresinden çalıştırdığımda bir editör açmak isteyen git komutunun üzerinden geçiyorum. Magit çılgınlığı kesiyor mu ve bunun için yeni bir tampon mu açıyor? (lütfen arka plan-emacs-daemon ipuçlarına bakmayın; yine de teşekkürler, ama hayat çok kısa). - user2066657
Hayır, söyleyebildiğim kadarıyla bunu engellemez. Ama sadece bunun için sözümü tutmayın, çünkü (1) Emacs'deki kabuk penceresini neredeyse hiç kullanmıyorum ve (2) normalde emacsclient kullanıyorum. Emacsclient ise olduğu Sizin için bir seçenek, en azından emacs ile açılmış bir pencere önledi ve mevcut Emacs penceresinde "COMMIT_EDITMSG" tamponu açıldı. - Mark van Lent


Jdsumsion'un cevabı gibi, mevcut çalışmanızı da saklayabilirsiniz, ancak seçilen değişiklikleri değişiklikten çıkarmak için difftool gibi bir kaynak kullanın. Bu sayede hunileri elle bile çok kolay düzenleyebilirsiniz. git add -p:

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

Stash yöntemini kullanmanız, kodunuz hala devam ediyorsa, test etmeden önce test etme şansı verir.


7
2017-07-27 09:52



Bu iyi çalışıyor, ama kullanırsanız git commit --amendGörünüşe göre, sonradan saklanamazsın, ya da bunu yapmanın bir yolu var mı? - Mark