Git’teki dosyanın sadece bir kısmını düzelt

Git'teki bir dosyada değişiklik yaptığımda, değişikliklerin sadece bazılarını nasıl yapabilirim?

Örneğin, bir dosyada değiştirilmiş sadece 15 satırlık 30 satırlık bir işlemi nasıl yapabilirim?

2394
06 июля '09 в 5:25 2009-07-06 05:25 freddiefujiwara 06 Temmuz 099 'da 05:25 de ayarlandı 2009-07-06 05:25
@ 22 cevap

git add --patch <filename> (ya da kısaca -p ) kullanabilirsiniz, ve git dosyanızı makul "parçalar" (dosyanın parçaları) olarak düşündüğü şeye bölmeye başlayacaktır. O zaman size bu soruyu söyleyecektir:

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

Her seçeneğin açıklaması aşağıdadır:

  • y bu parçayı bir sonraki işlem için hazırla
  • n bu parçayı bir sonraki işlem için koymayın
  • q çıktı; bu parçayı veya kalan parçalardan herhangi birini koymayın
  • bir bu parçayı ve sonraki tüm parçaları dosyaya koyar.
  • d bu bloğu veya daha sonraki bir parçayı dosyaya koymayın
  • g gitmek için bir parça seçin
  • / belirtilen normal ifadeyle eşleşen bir blok ara
  • j bu parçayı çözülmeden bırakın, bir sonraki çözülmeyen parçayı görün
  • J bu parçayı çözülmeden bırak, sonraki parçayı gör
  • k bu parçayı çözülmeden bırakın, önceki parçanın çözülmediğini görün
  • K bu parçayı çözmeden bırak, önceki parçayı gör
  • mevcut parçayı daha küçük parçalara böler
  • e mevcut bloğu elle düzenle
  • ? yazdırma yardımı

Dosya zaten depoda değilse, önce git add -N <filename> yapabilirsiniz. Bundan sonra git add -p <filename> ile devam edebilirsiniz.

Bundan sonra kullanabilirsiniz:

  • git diff --staged doğru değişiklikleri yaptığınızdan emin olmak için
  • git reset -p yanlışlıkla eklenen parçaları geri almak için
  • git commit -v bir taahhüt mesajı düzenlerken, taahhüdünüzü görüntülemek için

Lütfen bunun, .patch dosyalarının .patch verilerini analiz etmeyi amaçlayan git format-patch komutundan çok farklı olduğunu unutmayın.

Geleceğe bağlantı: Git Araçları - İnteraktif üretim

3149
06 июля '09 в 5:36 2009-07-06 05:36 Cevap Cloudhead tarafından 06 Temmuz 09: 05 : 05'te 2009-07-06 05:36

git add --interactive veya git add -p <file> ve ardından git commit ( git commit -a değil ) kullanabilirsiniz; git-add manpage'deki interaktif moda bakınız veya sadece talimatları takip ediniz.

Modern git commit --patch ayrıca git commit --interactive - etkileşimli (ve interaktif taahhüdün yama parametresine bir kısayol olan git commit --patch vardır).

border=0

Bunu GUI'den yapmayı tercih ederseniz, git-gui'yi kullanabilirsiniz. Taahhütte yer almak istediğiniz parçaları kolayca işaretleyebilirsiniz. Şahsen git add -i kullanmaktan daha kolay buluyorum. QGit veya GitX gibi diğer Git GUI'leri de bu işlevselliğe sahip olabilir.

223
06 июля '09 в 14:49 2009-07-06 14:49 Cevap Jakub Narębski tarafından 06 Temmuz 099 'da saat 14: 49' ta verildi 2009-07-06 14:49

git gui bu işlevselliği bir fark olarak sunar. İlgilendiğiniz satırı sağ tıklayın ve "Düzeltmek için bu satırı" menü öğesini göreceksiniz.

118
06 июля '09 в 5:41 2009-07-06 05:41 Cevap Ionuț G. Stan tarafından yapıldı. Temmuz 06 '09, 05:41, 2009-07-06 05:41

git add -e myfile en kolay yol (en azından benim tercihim) olduğuna inanıyorum, çünkü sadece metin editörünü açar ve hangi satırı çalıştırmak istediğinizi seçmenize izin verir. Düzenleme komutlarıyla ilgili olarak:

Eklenen içerik:

Eklenen içerik "+" ile başlayan çizgilerle gösterilir. Bunları silerek herhangi bir ekleme satırının oluşturulmasını önleyebilirsiniz.

uzak içerik:

Silinen içerik, "-" ile başlayan dizelerle temsil edilir. Silme işlemlerini "-" - "" (boşluk) 'a dönüştürerek engelleyebilirsiniz.

değiştirilmiş içerik:

Değiştirilen içerik "-" (eski içeriğin silinmesi), ardından "+" (değiştirme içeriği eklenerek) satırları ile gösterilir. "-" dizelerini "" dönüştürerek ve "+" satırlarını kaldırarak değişiklik yapılmasını önleyebilirsiniz. Bir çiftin sadece yarısının değiştirilmesinin kafa karıştırıcı endeks değişikliklerine yol açabileceğini unutmayın.

Her git add git --help add adresinde mevcuttur - git --help add

64
25 сент. CevapFeredomBanana tarafından yazılmıştır 25 Eyl 2015-09-25 23:45 '15, saat 11:45, 2015-09-25 23:45

Vim kullanıyorsanız, kaçak adında harika bir eklenti deneyebilirsiniz.

Çalışan bir kopya ile bir dizin arasında bir diff dosyası görebilirsiniz :Gdiff ve sonra da dp gibi klasik vim diff komutlarını kullanarak dizine satırlar veya sütunlar ekleyin. Değişiklikleri dizine kaydedin ve şunu kopyalayın :Gcommit ve bitirdiniz.

Burada çok iyi tanıtım videoları ( bölüm 2'ye bakınız).

42
23 февр. Cevap, 23 Şubat'ta François tarafından verildi. 2012-02-23 13:37 '12, 13:37, 2012-02-23 13:37

Atlassian's SourceTree kullanmanızı şiddetle tavsiye ederim. (Ücretsizdir.) Önemsiz hale getirir. Tek tek kod parçalarını veya tek tek kod satırlarını hızlı ve kolay bir şekilde oluşturabilirsiniz.

2019

29
12 авг. cevap user486646 12 ağustos tarafından verilmiştir . 2014-08-12 16:32 '14, saat 16:32 2014-08-12 16:32

git add --patch yeni bir dosya için kullanabilmek için , öncelikle dosyayı git add --intent-to-add kullanarak dizine git add --intent-to-add :

 git add -N file git add -p file 
22
05 дек. Cevap kullanıcı1338062 05 dec tarafından verilmiştir . 2014-12-05 20:29 '14, 20:29 2014-12-05 20:29

Çok fazla değişiklik yaptığımda ve sonunda değişikliklerden birkaç taahhütte bulunduğumda, bir şeyler oluşturmadan önce baş>

İşte burada:

 $ 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 

Nedenmarmar'ın cevabı genellikle yaptığım şeydir, bazen çok fazla değişiklik olduğu gerçeği dışında, bazı şeyleri ayarlarken hata yapabileceğimi söyleyebilirim ve bazı durumların ikinci geçişte geri çekilmesini istiyorum. .

19
07 июня '13 в 1:14 2013-06-07 01:14 Cevap, 07 Haziran 13: 13'te 01:14 2013-06-07 01:14 tarihinde verilir.

Emacs kullanıyorsanız, emacs için git arayüzü sağlayan Magit'i inceleyin. Ara parçaları (dosyaların parçaları) iyi destekler.

12
08 июля '09 в 10:00 2009-07-08 10:00 Tarafından verilen cevap Mark van Lent Temmuz 08 '09 at 10:00 2009-07-08 10:00

Jdsumsion'da olduğu gibi, şu anki çalışmanızı gizleyebilirsiniz, fakat daha sonra seçilen değişiklikleri önbellekten çekmek için meld gibi bir difffool kullanabilirsiniz. Böylece git add -p biraz acı veren parçaları manüel olarak düzenleyebilirsiniz:

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

Stash yöntemini kullanmak, kodunuzu çalıştırmadan önce hala çalışıp çalışmadığını sınama fırsatı verir.

8
07 авг. Cevap verilen derhoch 07 ağustos . 2013-08-07 16:25 '13, 16:25 2013-08-07 16:25

Intellij IDEA (ve serideki diğer tüm ürünlerin inanıyorum ki) v2018.1’den beri

2019

28 марта '18 в 10:00 2018-03-28 10:00 Cevap Holger Brandl tarafından 28 Mart 18'de 10:00 2018-03-28 10:00

Git Eklentileri kullananlar için:

"Kopyala" penceresinde, kısmen işlemek istediğiniz dosyayı seçin, ardından sağ bölmede düzeltmek istediğiniz metni seçin, daha sonra seçime sağ tıklayın ve içerik menüsünden "Seçilen satırları oluştur" u seçin.

7
27 июля '15 в 12:52 2015-07-27 12:52 Cevap srgstm 27 Temmuz 'da 12:52 tarihinde veriliyor 2015-07-27 12:52

Vim-gitgutter eklentisi, vim editöründen ayrılmadan yakışıklılıklar yaratabilir.

 :GitGutterStageHunk 

Ek olarak, bazı modern IDE'lerde olduğu gibi farklı işaretli bir sütun gibi başka ilginç özellikler de sunar.

İfadenin sadece bir kısmı vim- kaçak olarak tedarik edilecekse

 :Gdiff 

görünür aralığın aralığını seçmenize izin verir, ardından :'<,'>diffput veya :'<,'>diffget tek tek satırları değiştirmek / değiştirmek için.

6
09 янв. Cevap c0ffeeartc 09 Ocak. 2015-01-09 20:11 '15 20:11, 2015-01-09 20:11

git add -p filename.x denedim, ancak bir Mac üzerinde gitx'in ( http://gitx.frim.nl/ veya https://github.com/pieter/gitx ) istediğim satırları yapmanın çok daha kolay olduğunu buldum .

5
16 авг. Cevap verilen jasongregori 16 Ağu. 2011-08-16 02:43 '11, 02:43 2011-08-16 02:43

TortoiseGit ile:

Dosyayı sağ tıklayın ve Context Menu → Restore after commit kullanın. Bu, dosyanın olduğu gibi bir kopyasını oluşturur. Sonra dosyayı düzenleyebilirsiniz, örneğin. TortoiseGit Yapmak istemediğiniz değişiklikleri değiştirin ve atın. Bu değişiklikleri kaydettikten sonra dosyayı kabul edebilirsiniz.

4
06 апр. Cevap Fr0sT 06 nisan tarafından verildi . 2015-04-06 19:16 '15, 19:16 2015-04-06 19:16

git-meld-index - web sitesinden alıntı:

git -meld-index meld - veya herhangi bir git diffftool (kdiff3, diffuse, vb.) çalıştırır - böylece git indeksindeki (git olarak da bilinir) değişiklikleri etkileşimli olarak değiştirebilirsiniz.

Bu, git add -p ve git add --interactive'in işlevselliğine benzer. Bazı durumlarda meld, git add -p'den daha kolay / hızlıdır. Bunun nedeni, meld'in size izin vermesidir, örneğin:

  • daha fazla içerik görmek
  • satır içi farkları gör
  • manuel olarak düzenleyin ve 'canlı' fark güncellemelerini görün (her tuşa basıldıktan sonra güncellenir)
  • atlamak istediğiniz her değişiklik için n'siz değişime gidin.

Kullanımı

Git deposunda, koş:

 git meld-index 

Meld (veya yapılandırılmış git diffftool) 'un göründüğünü göreceksiniz.

SOL : geçici dizin dosyaları çalışma ağacından kopyalandı

SAĞ : dizin içeriğine sahip geçici dizin. Bu aynı zamanda henüz dizinde bulunmayan, ancak çalışma kopyasında değiştirilmeyen veya kontrol edilmeyen dosyaları da içerir - bu durumda dosyanın içeriğini HEAD'den göreceksiniz.

Dizini (sağda) mutlu olana kadar düzenleyin. Gerekirse tasarruf etmeyi unutmayın.

İşiniz bittiğinde, meld'i kapatın ve git-meld-index, dizini, düzenlediğiniz meld komutunun sağ tarafındaki geçici dizinin içeriğiyle eşleşecek şekilde günceller.

2
04 июля '15 в 23:26 2015-07-04 23:26 Cevap Croad > tarafından 04 Temmuz 15 : 23'te verilmiştir 2015-07-04 23:26

Emacs ayrıca gitsuma sahiptir

2
13 июля '09 в 0:52 2009-07-13 00:52 Cevap 13 Temmuz 099 'da 0:52 2009-07-13 00:52 tarihinde verilir

Önceki cevabı ekleyerek, eğer komut satırını kullanmayı tercih ederseniz, git add -e myfile yazın, eğer bu komut farklılıkları olan bir editör açacağından, size yazmak istediğiniz satırı satır satır seçme seçeneği sunar.

2019

24 авг. Cevap Beto Aveiga 24 Ağustos verilmiştir . 2018-08-24 18:24 '18, 18:24, 2018-08-24 18:24

Atom kullanıcıları için, github paketi etkileşimli bir git gui style ayarı içeriyor. Etiketler için ambalaj belgelerine bakın .

Atom kullanmak, koyu arka planı olan bir tema ile çalışmanıza izin verir (varsayılan olarak, git gui beyaz bir arka planı vardır).

1
10 апр. Yanıtlayan : Ioannis Filippidis 10 Nis 2018-04-10 05:31 '18, 17:31, 2018-04-10 05:31

Yukarıdaki cevaplardan birinin gösterdiği gibi git add --patch filename.txt kullanabilirsiniz.

veya kısa form git add -p filename.txt

... ancak depodaki dosyalar için, commit komutu için -patch bayrağını kullanmak daha iyidir ( git commit --patch filename.txt son derece yeni bir sürüm kullanıyorsanız): git commit --patch filename.txt

... veya, yine kısa bir git commit -p filename.txt

... ve ardından, işleme dahil edilecek satırları seçmek için belirtilen tuşları (n / n vb.) kullanarak.

1
30 июня '14 в 11:34 2014-06-30 11:34 Cevap, 30 Haziran 14'de Samuel Lampa tarafından 11:34 2014-06-30 11:34 tarihinde verilmiştir.

git-cola , yerleşik bir fonksiyonun yanı sıra mükemmel bir grafik arayüzdür. Yalnızca sahne için satırları seçin ve S tuşuna basın . Seçim yapılmazsa, tam bir yığın yürütülür.

0
27 авг. Cevap AndiDog 27 Ağustos'ta verilir . 2015-08-27 14:28 '15, 14:28 2015-08-27 14:28

Eğer bir Windows platformunda, bence git gui , bir unstaged / unstaged dosyadan çoklu satırlar uygulamak için en iyi araçtır.

1. Hank bilge:

  • unstagged Changes bölümünden bir dosya seçin unstagged Changes
  • Çalıştırmak istediğiniz kodu sağ tıklayın.
  • Stage Hunk for commit seç

2. Satır:

  • unstagged Changes bölümünden bir dosya seçin unstagged Changes
  • Düzenlenecek satırı / çizgileri seçin.
  • Stage Lines for commit Seçin

3. Birkaç satır dışında tam bir dosya oluşturmak istiyorsanız:

  • unstagged Changes bölümünden bir dosya seçin unstagged Changes
  • Ctrl+T (Stage file to commit) basın Ctrl+T (Stage file to commit)
  • Seçilen dosya şimdi Staged Changes Bölümüne taşınır.
  • Düzenlenecek satırı / çizgileri seçin.
  • UnStage Lines for commit seçin
0
28 мая '15 в 15:52 2015-05-28 15:52 Cevap Anvesh Yalamarthy tarafından 28 Mayıs, 15'te 15 : 52'de 2015-05-28 15:52

etiketleri veya soru sor ile ilgili diğer sorular