Eski git kayıtlarını kaldır


89

Git konusunda çok yeniyim ve bunun gibi bir şeyin mümkün olup olmadığını merak ediyor muydum?

>git log --pretty=oneline --abbrev-commit
2f05aba Added new feature
3371cec Fixed screw up    <-- I want to remove this
daed25c Screw up          <-- and remove this.
e2b2a84 First.                So it's like they never happend.

Mümkün mü?

Yanıtlar:


63

Bu ile mümkündür git rebase. Takip etmeyi dene

git rebase -i HEAD~4

ve ardından, düzenleyicinizdeki etkileşimli talimatları izleyin. İlk adımda commit'leri "eziyorsunuz". Bunun gibi bir şeye benzemeli:

pick 2f05aba ... will be preserved
squash 3371cec ... will be squashed with daed25c
squash daed25c ... will be squashed with e2b2a84
pick e2b2a84 .. will contain this and 3371cec and daed25c

İkinci adımda commit mesajlarını düzenleyebilirsiniz.


27
Soru, işleri ezmek yerine onları silmek değil mi?
Richard

4
@Stony: Muhtemelen onları da silebilirsiniz. Ancak OP'deki commit yorumlarından ("Berbat et" ve "Sabit hata") birinin diğerini geri aldığını ve ikisini de ezebileceğini varsaydım.
Deve

85

Onları gerçekten silmek istiyorsanız (onları geçmişten silmek, bir daha asla görünmemek), şunları yapabilirsiniz:

rebase'i çalıştırın:

git rebase -i HEAD~4

ve sonra, silmek istediğiniz işlemlere karşılık gelen satırları silin (veya yorum yapın), örneğin:

pick 2f05aba ... #will be preserved
#pick 3371cec ... #will be deleted
#pick daed25c ... #will be deleted
pick e2b2a84 ... #will be preserved

2
Github'da yeniyim, bundan sonra değişiklikleri nasıl zorlarsınız (Eşitle'yi tıkladığımda, yaptığım şeyi geri alır). Sanırım anladım: git push origin HEAD --force
Nicolas Thery

@NicolasThery yok. Bu yüzden git push --force olmadan çalışmayı reddediyor çünkü tarihi yeniden yazıyorsunuz ve diğer insanların depolarını kıracaksınız. Zaten ittiyseniz, tek seçeneğiniz bir git revert. Hangisi, bunu düşündüğünüzde mantıklı çünkü bir başkasının kodunu alırsanız, bir tür tarih olmadan eski işlemlerinizi silebilmesini istemezsiniz değil mi?
Kızgın Dan

Bunun geçerli Git deposunda çalıştığını ve yukarı akış / başka bir Git düğümünü değiştirmediğini varsayıyorum.
Alexander Mills

2
@AlexanderMills Basmadığınız sürece akış yukarı hiçbir şeyi değiştirmez (ve eğer yaparsanız, Angry Dan'in dediği gibi --force bayrağını eklemeniz gerekir).
Shathur

dveya droptaahhütleri geçmişten kaldırma komutudur.
Terkedilmiş Sepet

5

Kayıtları tamamen silmek dropiçin artık git etkileşimli geri ödemeler için yeni bir seçenek var . İlk çalıştırma:

git rebase -i HEAD~4

Ardından , atılacak kayıtlar için pickile değiştirin drop:

pick 2f05aba ... #will be preserved
drop 3371cec ... #will be dropped
drop daed25c ... #will be dropped
pick e2b2a84 ... #will be preserved

Bu, aşağıdaki sürümle benim için Fedora üzerinde çalıştı:

$ git version
git version 2.21.0

2

Squash, tek bir hash altında birleştirilmiş commit listesi oluşturmak istediğinizde kullanışlıdır, ancak üç ayrı commit almak ve tek bir commitmiş gibi görünen son bir çıktıya sahip olmak istiyorsanız, tavsiye ederim fixup

git rebase -i HEAD~4

pick 2f05aba ... will be preserved
fixup 3371cec ... will be merged with daed25c
fixup daed25c ... will be merged with e2b2a84
pick e2b2a84 .. will include 3371cec and daed25c, but only the commit message of e2b2a84

İnteraktif yeniden taban arayüzünün komut listesinde daha fazla bilgi bulabilirsiniz.

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.