Git ile zaten bölünmüş bir iri parça ayırabilir miyim?


205

Son zamanlarda git komutunu patchseçeneğini keşfettim addve gerçekten harika bir özellik olduğunu söylemeliyim. Ayrıca büyük bir iri parçanın stuşa basarak daha küçük iri parçalara ayrılabileceğini keşfettim , bu da taahhüdün hassasiyetine katkıda bulunuyor. Ama ya daha fazla hassasiyet istersem, bölünmüş iri parça yeterince küçük değilse?

Örneğin, bu zaten ayrılmış iri parça düşünün:

@@ -34,12 +34,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

CSS yorumu kaldırmayı yalnızca bir sonraki işleme nasıl ekleyebilirim? sSeçenek artık mevcut değil!

Yanıtlar:


254

Kullanıyorsanız git add -pve bölündükten sonra bile s, yeterince küçük bir değişikliğiniz yok, eyamayı doğrudan düzenlemek için kullanabilirsiniz .

Bu biraz kafa karıştırıcı olabilir, ancak basıldıktan sonra açılacak editör penceresindeki talimatları dikkatlicee izlerseniz iyi olacaksınız. Alıntı yaptığınız durumda, yerine -şu satırların başında bir boşluk koymak istersiniz :

-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {

... ve aşağıdaki satırı, yani ile başlayan satırı silin +. Daha sonra düzenleyicinizi kaydedip çıkarsanız, yalnızca CSS yorumunun kaldırılması aşamalandırılır.


9
Harika bir çözüm! Bunu gördüm ama yanlış anladım ... Değişiklikler çalışma ağacından da kaldırılacaktı.
greg0ire

7
Gerçekten de, yardım metninden çok açık değildir. Aslında kendimi bunu çok kullanıyorum, çünkü git gerçekten her bir taahhüdü olabildiğince kesin ve güzel hale getirmeye teşvik
ettiğinden

27
Bunu gerçekten bir boşlukla değiştirmeniz gerektiğini unutmayın . Sadece -karakterleri silebileceğimi anlamaya çalıştım ve Git, yamamın uygulanmadığından şikayet etti.
Ryan Lundy

3
'-' ile satırları silmenin ve '+' ile boşluk bırakmanın nedenini, '-' ile bu satırların zaten kaldırıldığı ve ' + 'lar zaten eklenmiştir (yamanın gözüne). Ya da ona bakmanın başka bir yolu, aslında bu karakterlerin (-, +) temsil ettiği eylemi (çizgi eklemek veya kaldırmak) yapmanızdır. Yalnızca '-'ler ve' + 'lara sahip kalan satırlar değişiklik olarak kaydedilir ve geri kalanı "dosyanın nasıl olduğu" şeklindedir.
atomictom

3
@Filype: Bunun neden olacağını bilmiyorum, korkarım - eğer koşuyorsanız git add -pve bununla birlikte bir iri edüzenlediyseniz, çalışan ağacınızı değil, sadece sahnelenen şeyleri etkilemesi gerekir.
Mark Longair

60

Diyelim ki example.cssgörünüşünüz şöyle:

.classname {
  width: 440px;
}

/*#field_teacher_id {
  display: block;
} */

form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
  width: 300px;
}

.another {
  width: 420px;
}

Şimdi orta bloktaki stil seçicilerini değiştirelim ve biz devam ederken, artık ihtiyacımız olmayan eski yorumlanmış stilleri silin.

.classname {
  width: 440px;
}

#user-register form.table-form .field-type-checkbox label {
  width: 300px;
}

.another {
  width: 420px;
}

Bu kolaydı, şimdi taahhüt edelim. Ama bekleyin, basit adım adım kod incelemesi için sürüm kontrolündeki değişikliklerin mantıksal olarak ayrılmasını sağlamak istiyorum, böylece ekibim ve ben, taahhüt geçmişini ayrıntılar için kolayca arayabiliriz.

Eski kodun silinmesi mantıksal olarak diğer stil seçici değişikliğinden ayrıdır. İki ayrı işleme ihtiyacımız olacak, bu yüzden bir yama için iri parça ekleyelim.

git add --patch
diff --git a/example.css b/example.css
index 426449d..50ecff9 100644
--- a/example.css
+++ b/example.css
@@ -2,12 +2,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

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

Hata! Değişiklikler çok yakın gibi görünüyor, bu yüzden git onları bir araya getirdi.

Bunu basarak basarak bölmeye çalışmak bile saynı sonuca sahiptir çünkü bölünme hassas değişikliklerimiz için yeterince ayrıntılı değildir. Git'in yamayı otomatik olarak ayırabilmesi için, değiştirilen çizgiler arasında değişmemiş çizgiler olması gerekir.

Yani, 's manuel izin düzenlemek basarake

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

git yamayı seçtiğiniz editörümüzde açacaktır.

# Manual hunk edit mode -- see bottom for a quick guide
@@ -2,12 +2,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

# ---
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
#
# If the patch applies cleanly, the edited hunk will immediately be
# marked for staging. If it does not apply cleanly, you will be given
# an opportunity to edit again. If all lines of the hunk are removed,
# then the edit is aborted and the hunk is left unchanged.

Hedefi gözden geçirelim:

CSS yorumu kaldırmayı yalnızca bir sonraki işleme nasıl ekleyebilirim?

Bunu iki komiteye ayırmak istiyoruz:

  1. İlk işlem bazı satırların silinmesini içerir (yorum kaldırma).

    Yorumlanan satırları kaldırmak için, onları yalnız bırakın, zaten istediğimiz gibi sürüm kontrolündeki silmeleri izlemek için işaretlenmişlerdir.

    -/*#field_teacher_id {
    - display: block;
    -} */

  2. İkinci taahhüt, hem silme hem de eklemeler kaydedilerek izlenen bir değişikliktir:

    • Silme işlemleri (eski seçici satırlar kaldırıldı)

      Eski seçici satırları tutmak için (bu işlem sırasında bunları silmeyin), ...

      '-' satırlarını kaldırmak için ''

      ... bu da eksi -işaretlerini bir boşluk karakteriyle değiştirmek anlamına geliyor .

      Yani bu üç çizgi ...

      -
      -form.table-form #field_teacher + label,
      -form.table-form #field_producer_distributor + label {

      ... olacak ( 3 satırın ilkindeki tek boşluğa dikkat edin):


      form.table-form #field_teacher + label,
      form.table-form #field_producer_distributor + label {

    • Eklemeler (yeni seçici satır eklendi)

      Bu işlem sırasında eklenen yeni seçici çizgiye dikkat etmemek için ...

      '+' Satırlarını kaldırmak için silin.

      ... kelimenin tam anlamıyla tüm satırı silmek anlamına gelir:

      +#user-register form.table-form .field-type-checkbox label {

      (Bonus: vim'i editörünüz olarak kullanıyorsanız , ddbir satırı silmek için tuşuna basın . Nano kullanıcılar Ctrl+ tuşuna basın K)

Kaydettiğinizde düzenleyiciniz şöyle görünmelidir:

# Manual hunk edit mode -- see bottom for a quick guide
@@ -2,12 +2,7 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */

 form.table-form #field_teacher + label,
 form.table-form #field_producer_distributor + label {
   width: 300px;
 }

# ---
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
#
# If the patch applies cleanly, the edited hunk will immediately be
# marked for staging. If it does not apply cleanly, you will be given
# an opportunity to edit again. If all lines of the hunk are removed,
# then the edit is aborted and the hunk is left unchanged.

Şimdi taahhüt edelim.

git commit -m "remove old code"

Ve sadece emin olmak için, son taahhütten gelen değişiklikleri görelim.

git show
commit 572ecbc7beecca495c8965ce54fbccabdd085112
Author: Jeff Puckett <jeff@jeffpuckett.com>
Date:   Sat Jun 11 17:06:48 2016 -0500

    remove old code

diff --git a/example.css b/example.css
index 426449d..d04c832 100644
--- a/example.css
+++ b/example.css
@@ -2,9 +2,6 @@
   width: 440px;
 }

-/*#field_teacher_id {
-  display: block;
-} */

 form.table-form #field_teacher + label,
 form.table-form #field_producer_distributor + label {

Mükemmel - atomik işleme sadece silme işlemlerinin dahil edildiğini görebilirsiniz. Şimdi işi bitirelim ve gerisini halledelim.

git add .
git commit -m "change selectors"
git show
commit 83ec3c16b73bca799e4ed525148cf303e0bd39f9
Author: Jeff Puckett <jeff@jeffpuckett.com>
Date:   Sat Jun 11 17:09:12 2016 -0500

    change selectors

diff --git a/example.css b/example.css
index d04c832..50ecff9 100644
--- a/example.css
+++ b/example.css
@@ -2,9 +2,7 @@
   width: 440px;
 }

-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
   width: 300px;
 }

Son olarak, son taahhüdün yalnızca seçici değişiklikleri içerdiğini görebilirsiniz.


1
Bonus # 2: Editör olarak VIM kullanıyorsanız, bir satırı silmek için klavyenizde "d" tuşuna iki kez basmanız gerekir: D
Alexxus

3
Ayrıca, eklemek istemediğiniz eklenen satırları kaldırmak yerine +onunla değiştirebilirsiniz #. Sonuç aynıdır, ancak silme (ve geri dönememe) durumundan rahatsız olabilirsiniz veya kaydetmeden önce denemek istersiniz.
ob-ivan

Ve bu, vim r #için artı xD bitti
aksh1618

Amaç "CSS yorumu kaldırmayı yalnızca bir sonraki işleme nasıl ekleyebilirim?" Dir, ancak bu adımlar neyi başardığı konusunda gerçekten kafa karıştırıcıdır. (bir sonraki işleme sadece birkaç satırın "kaldırılması" "eklemek" istiyoruz.) Yani sadece kaldır ya da ekle demek çok kafa karıştırıcı. Her adımda nelerin başarıldığını belirtmek açıklığa kavuşturmaya yardımcı olacaktır.
ahnbizcad

9

Git gui'yi kullanabiliyorsanız, değişiklikleri satır satır düzenlemenizi sağlar. Ne yazık ki, komut satırından nasıl yapılacağını bilmiyorum - ya da mümkünse bile.

Geçmişte kullandığım bir diğer seçenek de değişikliğin bir kısmını geri almak (editörü açık tutmak), istediğim bitleri işleme koymak, editörden geri almak ve yeniden kaydetmek. Çok zarif değil, ama işi hallediyor. :)


EDIT (git-gui kullanımı):

Git-gui'nin msysgit ve linux versiyonlarında aynı olup olmadığından emin değilim, sadece msysgit olanını kullandım. Ancak aynı olduğunu varsayarsak, çalıştırdığınızda dört bölme vardır: sol üst bölme çalışma dizini değişikliklerinizdir, sol alt aşaması değişikliklerinizdir, sağ üst seçili dosya için farktır (çalışma dir veya aşamalı) ve sağ alt, taahhüdün açıklaması içindir (buna ihtiyacınız olmayacağından şüpheleniyorum). Sağ üstteki dosyaya tıkladığınızda farkları göreceksiniz. Farklı bir çizgiyi sağ tıklarsanız, bir bağlam menüsü görürsünüz. Dikkate alınması gereken iki seçenek "taahhüt için sahne alanı" ve "taahhüt için sahne alanı" dır. Taahhüt etmek istediğiniz satırlarda "taahhüt için sahne çizgisi" ni seçmeye devam edersiniz ve işleminiz tamamlanır. İsterseniz birkaç çizgi seçebilir ve bunları sahne alabilirsiniz.

İşlemeye gelince, gui aracını veya komut satırını kullanabilirsiniz.


İkinci öneriniz oldukça açık, ama birincisi ilginç, biraz daha ayrıntı verebilir misiniz? Yükledim git-guiama tarif ettiğin şeyi nasıl elde edeceğime dair hiçbir fikrim yok.
greg0ire

çok teşekkürler! Bu çalışıyor! Sahneye koymak istediğim çizgileri bile seçebildim ve tek bir tıklamayla dizine ekleyebildim.
greg0ire

0

Bunu yapmanın bir yolu, git addneye ihtiyacınız varsa , parçayı atlamak ve ardından koşmaktır.git add tekrar . Bu tek yığınsa, onu bölebilirsiniz.

Taahhütlerin sırası konusunda endişeleriniz varsa kullanın git rebase -i.


Denediğim şey bu ve sorumun içindeki iri parça tekrar koştuğum tek şey git add -p, ama onu bölemiyorum. Bunu anlıyorum: Stage this hunk [y,n,q,a,d,/,e,?]?ve sonra 's' vurmak yardım yazdırır. BTW, demek istediniz add patch, değil patch addmi? Yoksa git patchyüklemem gereken bir eklenti var mı?
greg0ire

Bunu tekrar çalıştırmadan önce sahnelendiğiniz öbekleri yaptınız mı? Ve hayır, Mercurial'ın eklentileri var, Git yok.
Abizern

Hayır, yapmadım, aynı taahhütte olmalarını istiyorum (ama çözümünüz işe yarıyorsa, bunu başarmak için değiştirebilirim). Bir deneyeceğim.
greg0ire

Cevabımın dediği gibi → git rebase -i. Hangisi daha esnekcommit --amend
Abizern
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.