Удалить последнее совершение в битбакете

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

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

Ответ 1

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

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

На git:

git revert <commit>

О ртути:

hg backout <REV>

EDIT: операция возврата создает новую фиксацию, которая делает противоположную отмененную фиксацию (например, если исходная фиксация добавила строку, повторная фиксация удаляет эту строку), эффективно удаляя изменения нежелательного коммита без перезаписи истории репозитория.

Ответ 2

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

Если вы пытаетесь изменить ветвь, отличную от мастера:

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 обычно главная ветвь не является специальной - это просто соглашение. Тем не менее, 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). Вам просто нужно убедиться, что reset соответствует фиксации, прежде чем новая история отделится от старого.

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

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

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

git reset HEAD^
git pull

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

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

Ответ 3

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

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

Он удалит ваше последнее коммит и будет отражать битбакет как фиксированное удаление, но все равно останется на своем сервере.

Ответ 4

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

Мое простое решение - это.

Шаг 1.

 git clone <your repos URL> .

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

Шаг 2.

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

то Шаг 3.

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

Шаг 4.

git commit -m "Fixing the previous messy commit" 

Шаг 5.

Enjoy

Ответ 5

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

Сначала вы захотите перейти в настройки своего репозитория. Нажмите на ссылку Strip commits.

Strip commits link in bitbucket settings

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

Ответ 6

После внесения изменений он не сможет удалить. потому что основной принцип фиксации не удалять.

Вещь, которую вы можете сделать (простой и безопасный метод),

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

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

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

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

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

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

теперь ваша ветка будет обновляться без вашего последнего коммита.

Ответ 7

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

-backup весь ваш каталог, чтобы защитить внесенные вами непреднамеренные изменения

-select извлечен каталог

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

-repo-browser (опция меню "revert" отменяет неуправляемые изменения)

-press кнопка HEAD

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

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

-after он отключил изменения в файловой системе, нажмите commit

-this обновляет GIT сообщением "Отменить (ваше предыдущее сообщение). Это возвратит фиксацию так себе и так "

-select "совершить и нажать".

Ответ 8

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

git push -f origin HEAD^:master

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

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

git reset --hard HEAD~1

Ответ 9

Вот простой подход, включающий до 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>

Делайте это столько раз, сколько необходимо.

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