2016-11-13 2 views
6

Я добавил некоторые функции в свой проект, который взял 4 git commits, теперь бизнес просит, чтобы функциональность больше не нужна (спустя более месяца). Поэтому мне нужно удалить эти конкретные git commit (s) из моего репо, которое теперь имеет еще 27 коммитов после этого.Удалите git commit между двумя коммитами

ответ

1

Потому что вы имеете дело с опубликованной отраслью, которая, предположительно, используется кем-то другим, чем вы, я бы рекомендовал вернуть два коммиты с помощью git revert. От отрасли, о которой идет речь:

git log 

и найти хеши SHA-1 из двух комманд. Затем вернуть их с помощью:

git revert abcd1234..foobar12 

где abcd1234 является хэш из первых (старейшей) двух фиксаций и foobar12 является более последней из двух фиксаций.

Использование git revert будет добавлять коммиты, которые эффективно отменяют две коммиты, похороненные в вашей ветке. Альтернативой этому подходу было бы использовать ветвь rebase или filter. Но оба эти метода включают переписывание истории вашей отрасли. Это может вызвать головную боль для любого другого, использующего вашу ветку, поскольку они больше не смогут тянуть или толкать.

2

Есть четыре способа сделать это:

  • Чистый путь, возвращаясь, но сохранить в лог Revert:

    git revert --strategy resolve <commit> 
    
  • Harsh путь, удалить всего лишь последний коммит:

    git reset --soft "HEAD^" 
    
  • Rebase (показать журнал последних 5 коммитов и удалить строки вы не хотите, или изменить порядок или сквош множественным совершает в одном, или сделать что-нибудь еще вы хотите, это очень универсальный инструмент):

    git rebase -i HEAD~5 
    

И если ошибка делается:

git rebase --abort 
  • Быстрый перебазироваться: удалить только конкретный коммит используя свой идентификатор:

    git rebase --onto commit-id^ commit-id 
    
  • Альтернативы: Вы можете также попробовать:

    git cherry-pick commit-id 
    
  • Еще одна альтернатива:

    git revert --no-commit 
    
  • В крайнем случае, если вам нужна полная свобода редактирования истории (например, потому что мерзавец не позволяют редактировать то, что вы хотите), вы можете использовать это приложение very fast с открытым исходным кодом: reposurgeon.

Примечание: конечно, все эти изменения делаются на местном уровне, вы должны git push впоследствии применить изменения в пульте дистанционного управления. И в случае, если ваше репо не хочет удалять фиксацию («нет быстрого перехода вперед», что происходит, когда вы хотите удалить фиксацию, которую вы уже нажали), вы можете использовать git push -f, чтобы принудительно нажать на изменения.

Примечание2: если вы работаете с веткой, и вам нужно принудительно нажать, вы должны полностью избегать git push --force, потому что это может перезаписать другие ветви (если вы вносили изменения в них, даже если ваша текущая проверка находится на другой ветке). Предпочтительно, чтобы всегда указывал дистанционную ветвь, когда вы нажимаете push: git push --force origin your_branch.

+0

Большинство из этих методов не будут работать, потому что OP совершает погребение внутри ветки. И переписать историю филиала не следует предлагать для общего публичного филиала –

Смежные вопросы