İki kaydetmeyi bir kaydetmede nasıl birleştirebilirim?


99

2 taahhütlü bir 'ilk projem' var. Bu taahhütlerden kurtulup tek bir taahhüt olarak görünmelerini istiyorum.

Komut git merge --squashumut verici görünüyor, ancak git merge --squashterminalimi çalıştırdığımda sadece komut için seçenekler getiriyor. Doğru komut nedir?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

Bunun doğru komut olduğunu sanmıyorum. Ayrıca, taahhütleri böyle değiştirebileceğinizden bile şüpheliyim.
BSull

Hayır, birden fazla kaydı tek bir commit olarak değiştirebilirsiniz: git-scm.com/book/en/Git-Tools-Rewriting-History Benim sorum sadece bunun için belirli bir komutla ilgili.
Don P

@BSull Kesinlikle istediğiniz şekilde taahhütleri değiştirebilirsiniz. Kelimenin tam anlamıyla herhangi bir zamanda tamamen düzenlenebilirler. Başkalarıyla kod paylaşıyorsanız, bunu yapmak geçmişinizi yeniden yazacak ve herkesten farklı bir şubeyle etkin bir şekilde çalışacaksınız.
meagar

Bu asla kandırılmamalıydı. Aslında, diğerinin çok geniş kapatılmış olması gerekirdi. Bunun bir kopyası olarak işaretlenen diğer soru, önceki bir geri ödemeyi terk etmeyi içerdiği için gereksiz karmaşıktır.
Evan Carroll

Yanıtlar:


134

Etkileşimli bir yeniden tabangit rebase -i gerçekleştirmek istiyorsunuz .

Şu anda iseniz üzerine senin "taahhüt 1" ve birleştirme istediğiniz işlemek, önceki işlemek, Çalıştırabileceğiniz olan "2 işlemek" git rebase -i HEAD~2tüm Rebase üzerinden geçer taahhüt listeleyen bir editör doğacaktır ki,. "Pick" ile başlayan iki satır görmelisiniz. Ezmeye devam etmek için ikinci satırın ilk kelimesini "seç" ten "ezmek" olarak değiştirin. Ardından dosyanızı kaydedin ve çıkın. Git, ilk işleminizi ikinci son işlemenize sıkıştıracaktır.

Bu işlemin şubenizin geçmişini yeniden yazdığını unutmayın. Kodunuzu bir yere zorluyorsanız, yapmanız gerekecek git push -fve kodunuzu paylaşan herhangi biri, değişikliklerinizi almak için bazı çemberlerden geçmek zorunda kalacaktır.

Söz konusu iki commit şubedeki son iki commit değilse , sürecin biraz farklı olacağını unutmayın.


2
Nasıl yapılır Then write your file, and quit? Android Studio Terminal, git konsolu kullanıyorum Veya SourceTree yazılımı ile git konsolu açtım. Ama nasıl kurtarılır ve bırakılır?
Dr.jacky

1
Şubedeki son iki commit olmayan 2 commit nasıl birleştirilir?
Weishi Zeng

1
@meagar Sanırım mantıklı geliyor ... Bu sorunu kontrol ederseniz (bunun bir kopyası), 'yön'ü' ezmek büyük bir fark yarattı ve tüm sorunun kökeniydi ('hakkında yaklaşık 200 olumlu oy içeren ilk yoruma bakın' yanlış yolu
ezmek

1
@PandaWood Cevabı yanlış okuyorsunuz. İlk yol basit yanlıştı , farklı değildi . Şunları yapabilirsiniz yalnızca kabak geriye, o hiçbir anlamı eski biri yeni içine işlemek Ezici düşünmek yapar, ama eğer olabilir aynı işlem olacaktır.
meagar

1
"İkinci satırın ilk kelimesini değiştirmeyi" anladım - neyin ikinci satırı?
Andrew Torr

70

Benim gibi unutkanlar için tembel basit versiyon:

git rebase -i HEAD~3 veya ancak çoğu 3 yerine taahhüt eder.

Çevir bunu

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

bunun içine

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

ve vurmak bazı eylem yapmak escsonra enterdeğişiklikleri kaydetmek için. [1]

Bir sonraki ekran açıldığında, bu gereksiz satırlardan [2] kurtulun ve yeni bir commit mesajı veya başka bir şey yaratın ve aynı escape enterişlemi yapın. [1]

Vay canına, daha az işlemin var. Ya da her şeyi kırdın.


[1] - veya git konfigürasyonunuzla çalışan her neyse. Bu sadece benim kurulumuma göre verimli olan bir dizidir.

[2] - # this is your n'th commitBu mesajın hemen altında orijinal kayıtlarınızla birkaç kez benzer şeyler göreceksiniz . Bu satırları kaldırmak ve 1'de birleştirdiğiniz n kaydetmenin niyetlerini yansıtan bir commit mesajı oluşturmak istiyorsunuz.


Çok özlü çözüm - teşekkür ederim. sBurada kullanılan squash kısaltmasının ana hatlarını çizmek kullanışlı olabilir . Kaydetmeyi kullanmak, ancak önceki kaydetme ile birleştirmek için
UrbanConor

Yalnızca 2commit'leriniz varsa ve aynı 2commit'i birleştirmek istiyorsanız, çalıştırmanız gerekecek git reset --soft HEAD~ve git commit --amend.
scrutari

22
  1. Şubenizi kontrol edin ve tüm taahhütlerinizin miktarını sayın.
  2. Git bash'ı açın ve şunu yazın: git rebase -i HEAD~<quantity of your commits>(yani git rebase -i HEAD~5)
  3. Açılan txtdosyada pickanahtar sözcüğünü squash, ilk kaydetme dışında (en üstte) tüm işlemeler için olarak değiştirin . İlk olarak değiştirin reword(bu, sonraki adımda bu kayıt için yeni bir yorum sağlayacağınız anlamına gelir) ve KAYDET'e tıklayın! Vim'de ise, tuşuna basın, escardından girerek kaydedin wq!ve enter tuşuna basın.
  4. Yorum Sağlayın.
  5. Git'i açın ve yeni değişiklikleri görmek için "Tümünü getir" seçeneğini belirleyin.

Bitti


İlki bana vim'de nasıl kullanılacağını anlatıyor. Çok teşekkürler
Ho Luong
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.