özet
Hata mesajı
Önceki bir taahhüt olmadan 'ezilemez'
"aşağı doğru sıkıştırmaya" çalıştığınız anlamına gelir. Git , etkileşimli rebase yapılacaklar listesinde görüldüğü gibi eski bir taahhüdün veya “yukarı” nın daha yeni bir taahhüdünü ezer, yani önceki satırdaki bir taahhüttür. Yapılacaklar listenizdeki ilk satırdaki komutu değiştirmek, squash
her zaman bu hatayı üretecektir, çünkü ilk işlemin ezilmesi için hiçbir şey yoktur.
Çözüm
Önce başladığınız yere geri dönün
$ git rebase --abort
Geçmişin olduğunu söyle
$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a
Yani, ilk taahhüt, sonra b ve nihayet c. C'yi taahhüt ettikten sonra b ve c'yi birlikte ezmeye karar veririz:
(Not: Çalıştırıldığında git log
, çıkışı less
çoğu platformda varsayılan olarak bir çağrı cihazına bağlanır . Çağrı cihazından çıkmak ve komut isteminize geri dönmek için tuşuna basın q
.)
Koşu git rebase --interactive HEAD~2
size bir editör verir
pick b76d157 b
pick a931ac7 c
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
(Bu yapılacaklar listesinin çıktısıyla karşılaştırıldığında ters sırada olduğuna dikkat edin git log
.)
B en Değişen pick
için squash
Gördüğün hataya yol, ancak b içine c ezme yerine eğer olacaktır (daha yeni içine işlemek eski veya “yukarı ezmek”) için yapılacaklar listesini değiştirerek
pick b76d157 b
squash a931ac7 c
ve editörünüzden çıktığınızda, içeriği olan başka bir düzenleyici edineceksiniz
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
Kaydettiğinizde ve çıktığınızda, düzenlenen dosyanın içeriği yeni birleştirilmiş taahhüdün taahhüt mesajı haline gelir:
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
Yeniden Yazma Geçmişi Hakkında Not
Etkileşimli rebase tarihi yeniden yazar. Eski geçmişi içeren bir uzaktan kumandaya aktarma girişimi, hızlı ileri sarmadığı için başarısız olacaktır.
Yeniden bastığınız şube , kendi başınıza çalıştığınız bir konu veya özellik dalıysa, önemli değil. Başka bir depoya göndermek için --force
seçenek gerekir, ya da alternatif olarak, uzak deponun izinlerine bağlı olarak, önce eski dalı silebilir ve sonra yeniden basan sürümü itebilirsiniz. Potansiyel olarak işi yok edecek komutlara örnekler bu cevabın kapsamı dışındadır.
Zaten yayınlanmış bir geçmişi, şifre sızdırma veya diğer hassas ayrıntılar gibi çok iyi bir sebep olmadan başkalarıyla birlikte çalıştığınız bir dalda yeniden yazmak, ortak çalışanlarınız üzerinde çalışmaya zorlar ve antisosyaltir ve diğer geliştiricileri rahatsız eder. İçinde “kurtarma bir Memba Rebase itibaren” bölümü git rebase
belgelerine ilave vurgu ile açıklıyor.
Diğerlerinin üzerinde çalıştığı bir şubeyi yeniden adlandırmak (veya başka bir yeniden yazma biçimi) kötü bir fikirdir: akış aşağısındaki herkes geçmişini manuel olarak düzeltmek zorunda kalır. Bu bölümde, düzeltmenin aşağı akım bakış açısından nasıl yapılacağı açıklanmaktadır. Ancak asıl düzeltme, yukarı yönde akıntıya tekrar basmaktan kaçınmak olacaktır. ...