Видаліть старі коміти git


88

Я дуже новачок у git, і мені було цікаво, чи можливо щось подібне?

>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.

Чи можливо це?

Відповіді:


63

Це можливо за допомогою git rebase. Спробуйте наступне

git rebase -i HEAD~4

а потім дотримуйтесь інтерактивних інструкцій у вашому редакторі. На першому кроці ви "стискаєте" коміти. Це повинно виглядати приблизно так:

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

На другому кроці ви можете редагувати повідомлення про коміти.


25
Хіба питання не в тому, щоб видалити коміти, а не втиснути їх?
Річард

3
@Stony: Ну, ви, напевно, можете їх також видалити. Але з коментарів до комітів у OP ("Викрутити" та "Виправлено"), я припустив, що один скасовує інший, і що ви можете просто здавити ці два.
Deve

85

Якщо ви справді бажаєте їх видалити (витираючи з історії, щоб їх більше не бачили), ви можете

запустити rebase:

git rebase -i HEAD~4

а потім просто видаліть (або прокоментуйте) рядки, що відповідають комітам, які ви хочете видалити, приблизно так:

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

2
Я новачок у github, як ви натискаєте на зміни після цього (коли я натискаю Синхронізувати, це просто повертає те, що я зробив). Думаю, я зрозумів: git push origin HEAD --force
Ніколас Тері

@NicolasТепер ви цього не робите. Ось чому git push відмовляється працювати без --force, тому що ви переписуєте історію і порушуєте сховища інших людей. Якщо ви вже натиснули, ваш єдиний варіант - це зробити a git revert. Що, коли ти думаєш про це розумно, адже якщо ти витягнеш чужий код, ти не хотів би, щоб вони могли стирати твої старі коміти без якоїсь історії, чи не так?
Angry Dan

Я припускаю, що це просто працює у поточному репозиторії Git і нічого не змінює вгору / будь-який інший вузол Git?
Олександр Міллс,

2
@AlexanderMills Це нічого не змінює вгору за течією, поки ви не натискаєте на це (а якщо так, вам потрібно додати прапор --force, як сказав Angry Dan).
Шатур

dабо dropце команда для видалення комітів з історії.
Покинутий

5

Для повного видалення комітів є нова опція dropдля інтерактивних баз даних git. Перший запуск:

git rebase -i HEAD~4

Потім замініть pickна dropдля того, щоб коміт (-и), які потрібно скинути:

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

Це працювало на Fedora для мене з наступною версією:

$ git version
git version 2.21.0

2

Сквош корисний, коли ви хочете створити список об’єднаних комітів під одним хешем, але якщо ви хочете взяти три окремі коміти і мати кінцевий результат, схожий на те, що це був один коміт, я рекомендую 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

Ви можете знайти більше інформації в списку команд інтерфейсу інтерактивного перебазування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.