Удалить последнюю фиксацию в битбакете


105

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

Как удалить мой последний коммит? Или как исправить?

Ответы:


104

Во-первых, если вы работаете с другими людьми в одном и том же репозитории кода, вам не следует удалять фиксацию, поскольку, когда вы принудительно обновляете репозиторий, он оставит локальные репозитории ваших коллег в незаконном состоянии (например, если они сделал коммиты после того, который вы удалили, эти коммиты будут недействительными, поскольку они были основаны на несуществующем коммите).

Сказал, что вы можете отменить фиксацию. Эта процедура выполняется по-разному (разные команды) в зависимости от используемой вами CVS:

В git :

git revert <commit>

О ртутном :

hg backout <REV>

РЕДАКТИРОВАТЬ: операция возврата создает новую фиксацию, которая делает противоположность отмененной фиксации (например, если исходная фиксация добавила строку, возвратная фиксация удаляет эту строку), эффективно удаляя изменения нежелательной фиксации без перезаписи истории репозитория.


Спасибо за информацию. И я знаю последствия, если я удалю фиксацию, я просто не знаю, как отменить свое действие, потому что это моя первая ошибка. Мне нужно отменить фиксацию, потому что система уже работает. Нас всего двое, кто работает с этим хранилищем.
Екатерина

git backout <REV>? Или hg backout <REV>:?
Armando Pérez Marqués,

Но что, если коммиты, добавленные после отменяемого, внесли изменения в удаляемую строку?
rahs 01

@RahulSaha, поскольку то, что вы делаете, в основном пытается объединить фиксацию в ветку, я почти уверен, что это даст вам конфликт слияния, который вам придется решить.
asermax 01

99

Если вы не работаете с другими (или счастливы причинить им серьезное раздражение) , то можно удалить коммиты из веток bitbucket.

Если вы пытаетесь изменить не главную ветку:

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

если вы пытаетесь изменить главную ветку

Обычно в git ветка master не является особенной - это просто соглашение. Однако bitbucket, github и подобные сайты обычно требуют наличия основной ветки (предположительно потому, что это проще, чем писать дополнительный код для обработки события, что в репозитории нет веток - не уверен). Итак, вам нужно создать новую ветку и сделать ее основной:

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

На Bitbucket перейдите в настройки репозитория и измените «Основную ветку» на master_temp(на Github измените «Ветвь по умолчанию»).

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

Теперь перейдите в Bitbucket, и вы должны увидеть нужную историю. Теперь вы можете перейти на страницу настроек и снова изменить главную ветку на master.

Этот процесс также будет работать с любыми другими изменениями истории (например, git filter-branch). Вам просто нужно убедиться, что вы сбросили соответствующие коммиты, прежде чем новая история отделится от старой.

редактировать : очевидно, вам не нужно возиться со всеми этими хлопотами на github, так как вы можете принудительно нажать ветку сброса .

Работа с раздраженными сотрудниками

В следующий раз, когда кто-нибудь попытается извлечь из вашего репозитория (если они уже извлекли плохую фиксацию), извлечение завершится ошибкой. Им придется вручную выполнить сброс до фиксации перед измененной историей, а затем снова выполнить операцию.

git reset HEAD^
git pull

Если они сделали плохую фиксацию, и зафиксировали поверх нее , то им придется сбросить, а затем git cherry-pickхорошие коммиты, которые они хотят создать, эффективно воссоздавая всю ветку без плохой фиксации.

Если они никогда не извлекали плохую фиксацию, то весь этот процесс на них не повлияет, и они могут вытащить как обычно.


1
Для тех, кому удобнее использовать SourceTree: 1) Чтобы изменить основную ветку в веб-интерфейсе для BitBucket, посмотрите настройки репо. 2) Чтобы удалить ветку в веб-интерфейсе, перейдите на страницу «Ветви». 3) Сбросьте локальное репо, как описано выше. 4) Поднимите свои локальные изменения, чтобы воссоздать эти ветки.
Ричард Ле Мезурье

2
Как человек, случайно открывший секрет, я очень оценил тщательность этого ответа. Спасибо!
Torque

48

вы можете выполнить сброс, а HEAD^затем принудительно нажать его.

git reset HEAD^
git push -u origin master --force

Он удалит вашу последнюю фиксацию и отразится на битбакете как удаленная фиксация, но все равно останется на их сервере.


Github допускает это, но на момент написания этой статьи Bitbucket не разрешает принудительное нажатие.
JamesQMurphy 02

4
на самом деле bitbucket поддерживает принудительные толчки, просто diff вместо полного удаления неотслеживаемых коммитов отмечает их как удаленные.
Шубанкер 08

Рекомендуемый способ из битбакета - использовать возврат. Но я думаю, что в моем случае это более уместно. Поскольку я единственный, кто его использует, и он кажется более чистым, чем использование revert. Спасибо.
nafsaka

1
Да, это все еще работает на Bitbucket. Вы только что спасли меня! Я сделал коммит / толчок из своего Eclipse и замешался в другом проекте, который у меня был. Отчасти из-за плохой практики с моей стороны, когда я использовал как командную строку, так и встроенное eclipse для работы с git.
DarkCygnus

блестяще или проще: сбросить текущую ветку до этого коммита, а затем с помощью этой принудительной отправки на сервер исправить мою проблему
Энтони Кал

5

Вот простой подход, состоящий из 4 шагов:

0 - Сообщите команде, что собираетесь исправить репозиторий

Свяжитесь с командой и сообщите им о грядущих изменениях.

1 - Удалить последнюю фиксацию

Предполагая, что ваша целевая ветка master:

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

На этом все готово, если вы работаете в одиночку.

2 - Исправьте локальные репозитории вашего товарища по команде

От вашего товарища по команде:

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

Если у вашего товарища по команде не было новых коммитов, на этом вы закончили и должны синхронизироваться.

3 - Восстановление потерянных коммитов

Допустим, у товарища по команде был новый и неопубликованный коммит, который был утерян в этом процессе.

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

Сделайте это для необходимого количества коммитов.

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


3

У меня были проблемы с git revert в прошлом (в основном потому, что я не совсем уверен, как это работает). У меня были проблемы с возвратом из-за проблем слияния ..

Мое простое решение таково.

Шаг 1.

 git clone <your repos URL> .

ваш проект в другой папке, затем:

Шаг 2.

git reset --hard <the commit you wanna go to>

затем Шаг 3.

в вашем последнем (и основном) каталоге проекта (тот, который имеет проблемную последнюю фиксацию) вставьте файлы шага 2

Шаг 4.

git commit -m "Fixing the previous messy commit" 

Шаг 5.

наслаждаться


1
Резать и вставлять действительно беспорядочно. Кроме того, это не решит проблему из вопроса.
Дэниел Ли

1
git revertпрост: он создает новую фиксацию, которая выполняет обратные изменения в предыдущей фиксации (или нескольких фиксациях). Он не удаляет коммиты, поэтому не имеет отношения к этому вопросу. Кроме того, шаг клонирования здесь не нужен.
naught101 01

1
Git revert - это тот же механизм, что и выше.
nafsaka

2

Как говорили другие, обычно вы хотите использовать hg backoutилиgit revert . Однако иногда очень хочется избавиться от фиксации.

Во-первых, вам нужно перейти в настройки вашего репозитория. Щелкните Strip commitsссылку.

Убрать ссылку на коммит в настройках битбакета

Введите идентификатор набора изменений, который нужно уничтожить, и щелкните Preview strip. Это позволит вам увидеть, какой ущерб вы собираетесь нанести, прежде чем вы его нанесете. Затем просто нажмите, Confirmи ваша фиксация больше не будет историей. Убедитесь, что вы рассказали всем своим соавторам о том, что вы сделали, чтобы они случайно не вернули ошибочную фиксацию.


Какая это версия и какие разрешения требуются? На v6.4.3, на которую я смотрю, это выглядит иначе, и этого элемента там нет. Я являюсь администратором репозитория.
Рафаэль

1

После того, как изменения будут зафиксированы, их нельзя будет удалить. потому что основная природа фиксации - не удалять.

То, что вы можете сделать (простой и безопасный метод),

Интерактивная база:

1) git rebase -i HEAD~2 # покажет ваши последние 2 коммита

2) Ваша фиксация будет отображаться как «Недавние», которые появятся внизу страницы LILO (последний в Last Out)

введите описание изображения здесь

Полностью удалить последнюю строку фиксации

3) сохраните его ctrl+XилиESC:wq

теперь ваша ветка будет обновлена ​​без вашей последней фиксации ..


1

Вы можете написать команду также для Bitbucket, как упоминал Дастин :

git push -f origin HEAD^:master

Примечание: вместо master вы можете использовать любую ветку. И он удаляет, просто нажимая на Bitbucket.

Чтобы удалить последнюю фиксацию локально в git, используйте:

git reset --hard HEAD~1

0

К настоящему времени облачный битбакет (я не уверен, какая версия) позволяет откатить фиксацию из файловой системы следующим образом (я не вижу, как вернуться из интерфейса Bitbucket в браузере Chrome).

- сделайте резервную копию всего каталога, чтобы обезопасить внесенные вами непреднамеренно изменения

-выбрать извлеченный каталог

-правая кнопка мыши: меню git черепахи

-repo-browser (опция меню 'вернуться' отменяет только незавершенные изменения)

-нажать кнопку HEAD

-выбираем самую верхнюю строку (последняя фиксация)

-правая кнопка мыши: отменить изменение этой фиксации

-после отмены изменений в файловой системе нажмите кнопку фиксации

-это обновляет GIT сообщением "Вернуть предыдущее сообщение". Это отменяет фиксацию того-то и такого-то '

-выберите «зафиксировать и нажать».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.