Как удалить конкретный коммит в локальном git-репо? - PullRequest
1 голос
/ 16 марта 2012

Мой локальный репо содержит следующие коммиты:

A ---- B ---- C ---- D ---- E
        \
         1 ---- 2
          \    /
           1.1 

Буквенные изменения в удаленном репо. Изменения 1, 1.1 и 2 являются временными изменениями в моем локальном репо, которые я больше не хочу. Возможно, они были созданы автоматически, когда я создал тайник с незафиксированными изменениями поверх B; этот тайник был удален. Я хотел бы сделать историю менее сложной, поэтому я хотел бы избавиться от них.

Я могу ясно избавиться от них, взорвав мой локальный репозиторий и снова клонировав удаленный репозиторий, но это, похоже, тяжело. А в удаленном репо есть локальная ветка, которую я хочу сохранить.

Из того, что я читал до сих пор, были дискуссии о том, как объединить несколько коммитов в один. Я ничего не нашел при удалении коммитов. Я также пытался "git prune ", и он ничего не делал.

Как мне избавиться от коммитов 1, 1.1 и 2?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 16 марта 2012

Просто перейдите к коммиту, который вам небезразличен, и установите его как ГОЛОВУ.git garbage собирает 1.1 и 2. в более позднее времяВы заботитесь о.

удалить все остальные ветви.

git checkout sha-of-1
git checkout -b new-branch
git branch -D 'the branches that have 1.1 and 2'
2 голосов
/ 16 марта 2012

Если вы работаете с мастер-веткой, просто установите ее в origin / master (E):

git checkout master
git reset --hard origin/master

Это сделает ваши объекты коммитов потерянными объектами и будет очищено в следующий раз, когда вы выполните gitдс

1 голос
/ 16 марта 2012

Как вы описали ситуацию, которая показана в gitk? То же самое после полного обновления (Ctrl-F5)? Если он останется прежним, у вас останется какая-то ссылка, указывающая на фиксацию «2». Удалите эту ссылку (скорее всего, ветвь), и вся ветвь исчезнет. Позже сборщик мусора удалит объекты фиксации.

0 голосов
/ 16 марта 2012

@ Бомбе и @Magnus Skog правы (Лакшман Прасад близок, но вы сказали, что тоже хотели избавиться от 1). Но, возможно, вы имеете в виду следующее: «Я бросил все видимые ссылки (т.е. имена ветвей и тегов) на 1, 1.1 и 2, и даже сделал git gc, и у меня все еще есть коммиты, потому что я может видеть их по SHA, и они занимают слишком много места на диске ".

Если это так, то проще всего просто подождать: ссылки, которые вы не видите, которые препятствуют тому, чтобы пространство было скопировано, вероятно, находятся в reflog (.git/logs/). Они истекают через некоторое время, и тогда эти коммиты можно получить. Или вы можете использовать git reflog --expire-unreachable, чтобы заставить их истечь быстрее. Смотрите также git reflog expire и git fsck --unreachable .

...