Yeni dosyalar eklemek için 'git add --patch'?


105

Çalıştırdığımda git add -p, git'in yeni yapılmış dosyaları seçmenin bir yolu var mı?

Bu yüzden foo.java, adında yeni bir dosya oluşturup git add -p komutunu çalıştırırsam, git o dosyanın içeriğini dizine eklenecek olanı seçmeme izin vermez.

Yanıtlar:


78

Bunu her yeni dosyayla yapmak için şunları çalıştırabilirsiniz:

git add -N .
git add -p

Sık kullanmak istiyorsanız, şurada bir takma ad oluşturabilirsiniz ~/.bashrc:

alias gapan='git add --intent-to-add . && git add --patch'

Not : Bunu boş yeni bir dosyayla kullanırsanız, git onu düzeltme eki yapamayacak ve bir sonrakine geçemeyecektir.


13
Ne yaptığını merak eden herkes için, git add -Nyalnızca belirtilen izlenmemiş dosyaları dizine ekler, ancak içeriği olmadan.
Odin

112

git add -p someNewFile.txtYeni bir dosya (izlenmeyen bir dosya) üzerinde denediğimde , git basitçe çıktı verir No changes.ve dururdu. Git'e önce yeni dosyayı izlemeyi düşündüğümü söylemeliydim.

git add -N someNewFile.txt
git add -p

Ancak, dosya izlenmediğinden, bölünemeyen dev bir iri parça olarak görünürdü (çünkü hepsi yeni!). Bu yüzden, iri parçayı daha küçük parçalar halinde düzenlemem gerekiyordu. Buna aşina değilseniz, bu referansa göz atın başlamak için göz atın.

Güncelleme - Hunk düzenleme bilgisi Yukarıdaki referansın kaybolması durumunda bunu güncellemek istedim. Yeni dosya izlenmediğinden, dosyadaki git add -pher satırı tek parça halinde yeni bir satır olarak gösterecektir. Daha sonra size bu iri parça ile ne yapmak istediğinizi soracak ve size şu soruyu verecektir:

Stage this hunk [y,n,q,a,d,/,e,?]?

Tüm iri parçayı (ve dolayısıyla tüm dosyayı; git add -pbu durumda neden kullanmak isteyeceğinizden emin olmadığım için ?) Teslim etmek istemediğinizi varsayarsak, git'e edüzenlemek istediğinizi söyleme seçeneğini belirtmek isteyeceksiniz. iri parça.

Git'e hunk'ı düzenlemek istediğinizi söylediğinizde, değişikliklerinizi yapabilmeniz için sizi tercih ettiğiniz düzenleyiciye bırakmalıdır. Tüm satırlar a önekine sahip olmalı +ve git #dosyanın sonunda bazı açıklayıcı açıklamalara (a önekli ) sahiptir. Dosyayı ilk kaydettiğinizde istemediğiniz satırları silin. Ardından düzenleyiciyi kaydedin ve çıkın.

Git'in git'in hunk seçenekleriyle ilgili açıklaması:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

1
Lütfen birisi bunu özetle cevaplasın.
İnanç Gümüş

5
Özetle, git add -N someNewFile.txtardındangit add -p
CatShoes

Görünüşe göre yeni git sürümünde davranış değişti. Geçerli hunk'ı manuel olarak düzenleme seçeneği yoktur.
The.Wolfgang.Grimmer

7

git add -p zaten izlenmiş dosyalara değişiklik eklemekle ilgilidir.

Eklenecek dosyaları etkileşimli olarak seçme komutu git add -i. Örneğin:

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(Gerçek komut burada kesip yapıştıramadığım renklere sahip, bu yüzden göründüğünden daha güzel)

Aslında, p atch komutu ile git add -iaynı işlevi görür git add -p, bu nedenle ikincisi birincinin bir alt kümesidir ( kendimi sevdiğimi add -pve add -ikendimden nefret ettiğimi kabul etsem bile !).


"-P eklentisini sevdiğimi ve -i kendimden nefret ettiğimi kabul ediyorum!" Git add then patch'in sevdiğim bir çözüm olmasının nedeni budur: Eklediğiniz yeni dosyaların içeriğini (boş sürümleriyle karşılaştırdığınız için) ve düzenlediğiniz yama dosyalarını kontrol etmenizi sağlar!
Ulysse BN

Lütfen yanılıyorsam düzeltin, ancak burada etkileşimli modda bile yama No changes.yeni bir dosyaya çıkmaya devam edecek . OP, tüm dosyadan değil, yeni bir dosyadan nasıl parça ekleneceğini soruyordu. --intent-to-addBurada hala gerekli olduğuna inanıyorum .
Jeff Puckett

add -ptek başına işe yaramayacak, ancak bu cevap add -i, hangisinin işe yaradığını gösteriyor .
Matthieu Moy

Olumlu oy veriyorum çünkü bilmiyordum git add -i. Bununla birlikte, aynı şeyi etkileşimsiz olarak da yapabilirsiniz git add -N.
Mad Physicist

5

Ayrıca çok benzer bir yaklaşım var. --cachedBayrağı ...

1) Hazırlanmamış değişikliklerinizi tıpkı eklediğiniz dosya gibi aşamalı hale getirin.

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2) Farka bakın (not: hem düzenlemeleri hem de yeni dosyaları dahil edebilirsiniz).

git diff --cached

3) Yamayı oluşturun.

git diff --cached > my_patch_file.patch

Maalesef bu aynı amacı gerçekleştirmeyecek. Sevdiğim git add -pşey, her şeyi eklememesi, ancak eklemek istediklerimi seçip seçeyim. Bu çözüm körü körüne her şeyi eklerdi.
Alexander Kuş

Peki ne eklediğinizi seçebilirsiniz! Cevabı güncelleyeceğim.
doublejosh

1
teşekkür ederim: allthethings: bu benim için harika çalışıyor
macool

1

Catshoes'un cevabı şunları içerir:

git add -p someNewFile.txtYeni bir dosya (izlenmeyen bir dosya) üzerinde denediğimde , git sadece Değişiklik yok çıktı veriyordu. ve dur.
Git'e önce yeni dosyayı izlemeyi düşündüğümü söylemeliydim.

git add -N someNewFile.txt
git add -p

Bu yakında Git 2.29 (Q4 2020) ile değişecektir.

" git diff-files" ( Man ) ' nın son sürümleri, "yeni dosya" yaması olarak "eklemeye yönelik" yollar için dizin ve çalışma ağacı arasındaki farkı gösterir;
" git apply --cached" ( erkek ) " git diff-files" alabilmeli ve "şuna eşdeğer" davranmalıdırgit add ve yol " , ancak komut böyle bir yol için bunu yapamadı.

Bkz 4c025c6 işlemek , e3cc41b taahhüt (8 Ağustos 2020) ve 7cfde3f taahhüt tarafından (2020 06 Eyl) Raymond E. Pasco ( juped) .
( Junio ​​C Hamanogitster tarafından birleştirildi - - in commit ca81676 , 17 Ağu 2020)

apply: ita girişlerinde "yeni dosya" yamalarına izin ver

Yardımcı: Junio ​​C Hamano
İmza: Raymond E. Pasco

diff-files Son zamanlarda, dizinde "ekleme niyeti" olarak işaretlenen yollardaki değişiklikleri, boş blobdan farklı olarak yeni dosya farklı olduğu için ele alacak şekilde değiştirildi.

Ancak, applyyeniden adlandırma durumu dışında, mevcut dizin girişlerinin üzerine yeni dosya farklılıklarını uygulamayı reddeder.
Bu " git add -p" ( adam ) , ekleme niyeti kaydedildiğinde bir dosyadan büyük parçalar hazırlamaya çalışırken başarısız olmasına neden olur.

Bu, check_to_create()bir girişin bir indekste zaten var olup olmadığını kontrol eden mantığı iki şekilde değiştirir:

  • ilk olarak, eğer ok_if_existsyanlışsa yalnızca bir dizin girişi ararız;
  • ikinci olarak, bulduğumuz CE_INTENT_TO_ADDherhangi bir dizin girişindeki bayrağı kontrol eder ve ayarlandıysa uygulamanın devam etmesine izin veririz.

bununla ilgili herhangi bir güncelleme var mı? git 2.28.0 sürümünü kullanıyorum ve yakışıklıları git add -N + git add -pmanuel olarak düzenlemek için çalışmıyor
The.Wolfgang.Grimmer

1
@ The.Wolfgang.Grimmer Henüz değil: 2.29 birkaç hafta içinde yayınlanacak.
VonC
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.