Bitbucket как удалить коммит через интерфейс

от admin

Узнайте, как отменять изменения в Git с помощью Bitbucket Cloud

Узнайте, как отменить изменения на локальной машине и в репозитории Bitbucket Cloud во время совместной работы с коллегами.

Краткое описание основной задачи

В этом обучающем руководстве рассматриваются команды git revert , git reset , git log и git status

В этом обучающем руководстве предполагается, что вы знакомы со следующими командами Git :

Ошибиться может каждый. Не все изменения, отправляемые с помощью команды push, идеальны, поэтому в этом учебном руководстве рассматриваются наиболее распространенные команды Git для безопасной отмены изменений.

В этом обучающем руководстве предполагается, что вы знакомы со следующими командами Git:

  • git clone
  • git commit
  • git pull
  • git push

Если вы не знакомы с этими командами, мы поможем изучить Git с помощью Bitbucket Cloud. Далее вернитесь на эту страницу и узнайте, как отменять изменения. Эти команды Git подходят для сред Windows и Unix. При навигации по файловой системе в этом руководстве будут использоваться утилиты командной строки Unix.

Отмена изменений на локальной машине

Если изменение, которое вы хотите отменить, находится в вашей локальной системе и оно не было опубликовано в удаленном репозитории, выполнить отмену можно двумя способами:

Команда отмены, однако принцип ее действия отличается от привычной отмены изменений. Вместо удаления коммита эта команда отменяет внесенные в нем изменения и добавляет новый коммит с обращенным содержимым. В результате история в Git не теряется, что важно для обеспечения целостной истории версий и надежной совместной работы.

Универсальная команда Git для отмены изменений. У команды git reset есть ряд полезных опций, но в целях обучения мы рассмотрим следующие режимы:

  • —soft : только сброс указателя HEAD до выбранного коммита. Действие команды аналогично git checkout , но в этом режиме указатель HEAD не открепляется.
  • —mixed : сброс указателя HEAD до выбранного коммита в истории и отмена изменений в индексе.
  • —hard : сброс указателя HEAD до выбранного коммита в истории, отмена изменений в индексе и отмена изменений в рабочем каталоге. В рамках данного обучения мы не будем демонстрировать работу команды reset в режиме hard.

Подробное описание принципа работы команды git reset приведено в разделе сайта git-scm.com Git Tools — Reset Demystified (Инструменты Git — Раскрытие тайн reset).

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

Форк репозитория

Начнем с создания уникального репозитория, содержащего весь код оригинального репозитория. Этот процесс называется разветвлением (созданием форка) репозитория. Создание форка — это расширенный процесс Git , который используется, когда общий репозиторий размещается на стороннем сервисе хостинга, таком как Bitbucket.

  1. Щелкните по следующему URL или введите его в адресную строку: https://bitbucket.org/atlassian/tutorial-documentation-tests/commits/all
  2. Щелкните на левой боковой панели значок +, а затем выберите Fork this repository (Сделать форк этого репозитория), изучите содержимое диалогового окна и щелкните Fork repository (Сделать форк репозитория).
  3. Перед вами появится обзор нового репозитория.
  4. Щелкните значок «+» и выберите Clone this repository (Клонировать этот репозиторий).
  5. Клонируйте репозиторий на свой компьютер.
  6. Перейдите в каталог, в котором находится клонированный репозиторий.

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

Поиск изменений в локальной системе

Вы должны уметь находить изменение, которое хотите отменить, и ссылаться на него. Найти конкретное изменение можно через пользовательский интерфейс коммитов в Bitbucket и с помощью нескольких утилит командной строки.

git status

Команда git status возвращает состояние рабочего каталога (местоположения репозитория в локальной системе), раздела проиндексированных файлов (места, где вы подготавливаете набор изменений для добавления в историю проекта), показывает все файлы, в которых есть изменения, и сообщает, были ли эти изменения добавлены в раздел проиндексированных файлов. Давайте теперь выполним команду git status и проверим текущее состояние репозитория.

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

Для выполнения следующего примера откройте файл myquote2.html . Внесите изменения в содержимое myquote2.html , сохраните их и закройте файл. Выполним команду git status еще раз, чтобы исследовать это состояние репозитория.

Согласно выводу, в репозитории есть отложенные изменения для файла myquote2.html . Хорошие новости! Если отменяемое изменение не было добавлено в раздел проиндексированных файлов (как в примере выше), вы можете просто отредактировать файл и продолжить работу. Git начинает отслеживать изменения только после того, как они добавлены в раздел проиндексированных файлов и выполнен коммит в историю проекта.

Теперь давайте отменим изменения, внесенные в файл myquote2.html . Поскольку это упрощенный пример с минимумом изменений, мы можем отменить их двумя способами. Если выполнить команду git checkout myquote2.html , репозиторий восстановит файл myquote2.html до версии предыдущего коммита. Если же выполнить команду git reset —hard , весь репозиторий будет возвращен к состоянию последнего коммита.

git log

Команда git log позволяет просматривать и фильтровать историю проекта, а также искать конкретные изменения. С помощью git status можно просматривать рабочий каталог и раздел проиндексированных файлов, в то время как git log показывает только историю коммитов.

Этот же журнал истории коммитов можно найти в пользовательском интерфейсе Bitbucket, обратившись к представлению коммитов в репозитории. Представление коммитов для нашего демонстрационного репозитория можно найти по ссылке https://bitbucket.org/dans9190/tutorial-documentation-tests/commits/all. Это представление будет похоже на вывод утилиты командной строки git log . С его помощью можно найти и указать коммит для отмены.

В следующем примере история состоит из нескольких изменений, но каждое изменение по сути является коммитом. Это то, что нам нужно найти и отменить.

Рассмотрим один из перечисленных коммитов внимательнее.

Вы можете заметить, что каждый комментарий к коммиту состоит из четырех элементов.

Буквенно-цифровая строка (генерируемая функцией SHA-1), по которой можно идентифицировать то или иное изменение

Лицо, сделавшее коммит изменения

Дата внесения изменения в проект с помощью коммита

Комментарий к коммиту

Текстовая строка с описанием изменения.

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

Поиск местонахождения конкретного коммита

Обычно отменяемое изменение находится где-то среди ранних записей истории проекта, а история может оказаться довольно длинной. Итак, давайте изучим две основные операции, используя для поиска конкретного изменения команду git log .

  1. В окне терминала перейдите на самый верхний уровень локального репозитория с помощью команды cd (change directory — сменить каталог).

Введите команду git log —oneline . Параметр —oneline отобразит каждый коммит в отдельной строке, поэтому в окне терминала поместится больше записей из истории.

В любое время вы можете нажать клавишу q, чтобы закрыть журнал коммитов и вернуться к командной строке.

Вы увидите нечто подобное:

  1. Нажмите клавишу q, чтобы вернуться к командной строке.
  2. Найдите коммит с хешем c5826da и комментарием more changes в списке, образованном после выполнения команды git log . Кто-то не написал подробный комментарий к коммиту, поэтому необходимо выяснить, есть ли в нем необходимые нам изменения.
  3. Выделите и скопируйте хеш коммита c5826da из вывода команды git log в окне терминала.
  4. Введите команду git show , а затем вставьте скопированный хеш коммита или перепишите его и нажмите клавишу ввода. Вы увидите нечто подобное:

Строка внизу продолжит заполняться до тех пор, пока не отобразится изменение целиком. Нажмите клавишу q, чтобы закрыть командную строку.

Фильтрация вывода команды git log для поиска определенного коммита

Отфильтровать и скорректировать вывод команды git log можно с помощью следующих параметров:

Ограничивает количество отображаемых коммитов

git log -10

10 последних коммитов в истории

Ограничивает отображаемые коммиты установленными временными рамками

Вы также можете использовать —after «гггг-мм-дд» —before «гггг-мм-дд»

git log —after 2017-07-04

Все коммиты после 4 июля 2017 года

Выводит список всех коммитов, автор которых совпадает с указанным

git log —author=»Alana»

Все коммиты, у которых в поле имени автора содержится строка «Alana»

Возвращает все коммиты, комментарий к которым содержит указанную строку

git log —grep=»HOT-«

Все коммиты, содержащие строку «HOT-» в комментарии к коммиту

Это был очень краткий обзор команды git log . Если вам понравилось работать с ней, вам может быть интересно ознакомиться с расширенным обучающим руководством по git log.

Отмена изменения с помощью git reset

Сначала давайте просто отменим последний коммит в истории. Предположим, вы только что включили конвейеры непрерывной интеграции и непрерывной поставки (CI/CD) Bitbucket, но обнаружили, что скрипт работает не совсем так, как нужно.

  1. Введите в окне терминала команду git log —oneline .
  2. Скопируйте хеш второго коммита в журнале ( 52f823c ), а затем нажмите клавишу q, чтобы закрыть журнал.
  3. Введите в окне терминала команду git reset —soft 52f823c . Если все нормально, команда должна запуститься в фоновом режиме. Вот и все, вы отменили ваше первое изменение. Теперь давайте посмотрим на результат этого действия.
  4. Введите в окне терминала команду git status . Вы увидите, что коммит был отменен, а изменения теперь остаются неподтвержденными. Это будет выглядеть примерно так:
  1. Введите в окне терминала команду git log —oneline . Вы должны увидеть что-то увидите нечто подобное:
  1. Вы увидите, что в качестве нового указателя HEAD для ветки указан требуемый коммит 52f823c .
  2. Нажмите клавишу q, чтобы закрыть журнал. Не закрывайте терминал, поскольку теперь, после изучения простого применения команды reset, мы рассмотрим чуть более сложный вариант.

Отмена нескольких изменений с помощью git reset

Допустим, вы обнаружили, что запрос pull № 6 ( 4801b87 ) необходимо доработать, и при этом вы хотите поддержать чистоту истории, поэтому на этот раз вы будете сбрасывать указатель HEAD до коммита 1a6a403 с помощью команды git reset .

  1. Введите команду git log —oneline .
  2. Скопируйте хеш коммита 1a6a403 (myquote edited online with Bitbucket), созданного прямо перед запросом pull № 6, в котором мы хотим отменить изменения.
  3. Введите в окне терминала команду git reset 1a6a403 . Вывод должен выглядеть примерно так:

Как видно, изменения теперь находятся в ожидании коммита. Это означает, что теперь мы удалили несколько изменений как из истории проекта, так и из раздела проиндексированных файлов.

Введите в окне терминала команду git status . Вывод должен выглядеть примерно так:

Теперь Git вообще не отслеживает первое отмененное изменение (файл bitbucket-pipelines.yml ). Это связано с тем, что команда git reset удалила изменение как из указателя HEAD ветки, так и из области отслеживания (или индекса) Git . Основной процесс выглядит несколько сложнее, чем описывается в этом руководстве, подробнее см. в руководстве по команде git reset .

  1. Введите в окне терминала команду git log —oneline .
Читать:
Как найти сторону треугольника по координатам вершин

Согласно выводу команды log, история коммитов также была изменена и начинается с коммита 1a6a403 . Для демонстрации следующего примера допустим, что мы хотим отменить сброс, который только что выполнили. В дальнейшем мы, возможно, захотим сохранить содержимое запроса pull № 6.

Отправка результатов отмены в Bitbucket

Команда git reset — один из способов отмены, которые предлагает Git . В целом сброс с помощью команды reset считается небезопасным. Он хорошо подходит для локального применения к изолированному коду, но становится опасным при работе над общим кодом с другими участниками команды.

Чтобы поделиться сброшенной веткой с удаленной командой, необходимо использовать принудительную отправку изменений. Принудительная отправка изменений выполняется с помощью команды git push -f . Она уничтожит всю историю ветки, созданную после этой точки отправки.

Ниже приведен пример небезопасного сценария.

  • Разработчик A работает в ветке над новой возможностью.
  • Разработчик B работает в той же ветке над другой возможностью.
  • Разработчик B решает сбросить ветку к более раннему состоянию, когда разработчики A и B еще не приступили к работе.
  • Разработчик B принудительно отправляет сброшенную ветку в удаленный репозиторий.
  • Разработчик A делает запрос pull для этой ветки, чтобы получить обновления. Во время выполнения запроса pull разработчик A получает принудительное обновление, которое сбрасывает его локальную ветку к тому моменту времени, когда он еще не начал работать над новой возможностью. Соответственно, он теряет все коммиты.

Отмена команды git reset

До сих пор мы передавали в git reset SHA-хеши коммитов Git . Теперь вывод команды git log не показывает сброшенные коммиты. Как их вернуть? Git никогда не удаляет коммиты окончательно, хотя все указатели на них открепляются. Кроме того, Git хранит отдельный журнал со всеми перемещениями ссылок — reflog, или журнал ссылок. Проверить журнал ссылок можно с помощью команды git reflog .

Вывод команды git reflog должен быть аналогичен показанному в примере выше. Вы можете просмотреть историю действий в репозитории. Самая верхняя строчка является ссылкой на команду reset, которую мы выполнили для сброса запроса pull № 6. Теперь сбросим выполнение команды reset, чтобы восстановить запрос pull № 6. Во втором столбце вывода команды reflog находится указатель на действие по изменению репозитория. Здесь HEAD@ <0>— это ссылка на выполненную нами ранее команду reset. Мы не хотим снова выполнять эту команду сброса, поэтому восстановим репозиторий до HEAD@<1>.

Теперь давайте рассмотрим историю коммитов репозитория с помощью команды git log —oneline :

Здесь видно, что история коммитов репозитория была восстановлена до предыдущей версии, с которой мы экспериментировали. Коммит 4801b87 восстановлен, хотя был утерян при первой операции сброса. Команда git reflog является мощным инструментом для отмены изменений в репозитории. Подробнее о ее использовании см. на странице git reflog .

git revert

В предыдущих примерах было выполнено несколько важных операций отмены с перемещением во времени с помощью команд git reset и git reflog . Git содержит еще одну утилиту отмены, которая часто считается более безопасной, чем команда reset. Команда revert создает новые коммиты, которые содержат обратные изменения для указанных коммитов. Такие обратные коммиты можно безопасно отправлять в удаленные репозитории, чтобы делиться ими с другими разработчиками.

В этом разделе демонстрируется, как использовать команду git revert . Продолжим работу с нашим примером из предыдущего раздела. Для начала давайте посмотрим в журнал и найдем коммит для отмены.

В этом примере будем работать с самым последним коммитом — 1f08a70 . Предположим, что мы хотим отменить изменения, внесенные в этот коммит. Выполните следующую команду.

Это запустит рабочий процесс git merge . Git создаст новый коммит, содержимое которого будет сброшено до состояния коммита, указанного в команде revert. Затем Git откроет настроенный текстовый редактор, чтобы запросить комментарий к новому коммиту. Команда revert считается более безопасным способом выполнения отмены изменений, поскольку она соответствует рабочему процессу на основе коммитов. При создании обратных коммитов с помощью команды revert история коммитов наглядно показывает, когда выполнялась операция отмены.

Вы только что узнали, как отменять изменения!

Вы закончили, поздравляем! Вы можете в любое время вернуться к этому учебному руководству или ознакомиться с разделом «Отмена изменений», чтобы изучить эту тему подробнее. Продолжайте в том же духе в Bitbucket!

Delete last commit in bitbucket

I made a mistake and I don’t know how to delete my latest push in the repository. I pull the latest updates of the app but it has conflicts and I push it to repository.

How to delete my last commit? Or how to fix it?

10 Answers 10

In the first place, if you are working with other people on the same code repository, you should not delete a commit since when you force the update on the repository it will leave the local repositories of your coworkers in an illegal state (e.g. if they made commits after the one you deleted, those commits will be invalid since they were based on a now non-existent commit).

Said that, what you can do is revert the commit. This procedure is done differently (different commands) depending on the CVS you’re using:

EDIT: The revert operation creates a new commit that does the opposite than the reverted commit (e.g. if the original commit added a line, the revert commit deletes that line), effectively removing the changes of the undesired commit without rewriting the repository history.

If you are not working with others (or are happy to cause them significant annoyance), then it is possible to remove commits from bitbucket branches.

If you’re trying to change a non-master branch:

if you’re trying to change the master branch

In git generally, the master branch is not special — it’s just a convention. However, bitbucket and github and similar sites usually require there to be a main branch (presumably because it’s easier than writing more code to handle the event that a repository has no branches — not sure). So you need to create a new branch, and make that the main branch:

On Bitbucket, go to the repository settings, and change the «Main branch» to master_temp (on Github, change the «Default branch»).

Now go to Bitbucket, and you should see the history that you want. You can now go to the settings page and change the Main branch back to master .

This process will also work with any other history changes (e.g. git filter-branch ). You just have to make sure to reset to appropriate commits, before the new history split off from the old.

edit: apparently you don’t need to go to all this hassle on github, as you can force-push a reset branch.

Dealing with annoyed collaborators

Next time anyone tries to pull from your repository, (if they’ve already pulled the bad commit), the pull will fail. They will manually have to reset to a commit before the changed history, and then pull again.

If they have pulled the bad commit, and committed on top of it, then they will have to reset, and then git cherry-pick the good commits that they want to create, effectively re-creating the whole branch without the bad commit.

If they never pulled the bad commit, then this whole process won’t affect them, and they can pull as normal.

Как удалить последний коммит из bitbucket?

Дело для меня не простое
Проект древний, запутанный, сделан криворукими разработчиками, что его еле на сервер воткнули, и то не с первого раза.

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

И вот так позабыв, что я пытался его ставить, сделал несколько изменений, сделал пуш в репозиторий, пулл на сервере и проект лег.
Быстренько откатил до предыдущего коммита на сервере.

Но как теперь удалить мой последний коммит с репозитория? Попробовал локально git revert — удалился коммит, но все изменения, которые все равно закоммитятся, остались. Снес вообще локальный клон, клонировал репозиторий снова.

Как правильно поступить, чтобы вообще остался только предыдущий коммит без каких-либо изменений?
Была б кнопка «удалить последний коммит» в интерфейсе битбакета — было бы идеально.

Как удалить коммит из репозитория в Atlassian Bitbucket

В этой статье я расскажу, как удалить коммит из репозитория в Bitbucket.

А зачем вообще удалять коммит?

Может так случиться, что Вы случайно запушите конфиденциальную информацию в репозиторий Bitbucket.

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

Хорошо, он виден всем. Нужно как-то откатить эти изменения. Но как?

Вы можете удалить репозиторий и создать новый. Но в этом случае нужно будет настроить новый репозиторий, как старый, сказать коллегам, что Вы создали новый репозиторий. Это как-то слишком сложно.

Более простой способ это удалить коммит с паролем

В этой статье я покажу, как это сделать.

Создадим репозиторий в Bitbucket

Сначала создадим репозиторий в Bitbucket:

Создадим локальный репозиторий, внесем изменения и запушим в Bitbucket

Я создам новую папку для репозитория:

Теперь инициализирую репозиторий и добавлю ссылку на мой Bitbucket репозиторий:

Создам новый файл и добавлю содержимое:

Вот содержимое файла mynewfile.txt:

Я закоммичу изменения и запушу в Bitbucket:

Внесу измененияи в mynewfile.txt с паролем:

Опять закоммичу изменения и запушу в Bitbucket:

Теперь у меня в Bitbucket два коммита:

И коммит с конфиденциальной информацией содержит мой пароль:

Даже если я сейчас быстро уберу из файла mynewfile.txt мой пароль, закоммичу изменения и запушу в Bitbucket, то я все-равно буду видеть мой коммит с конфиденциальной информацией, а значит и мой пароль. Поэтому нам нужно удалить коммит.

Удалим коммит с паролем

Давайте сначала найдем идентификатор нашего коммита:

Вот вывод этой команды:

Я пометил идентификатор коммита с паролем красный прямоугольником.

Этот коммит нам и нужно удалить. Но для того, чтобы его удалить, нам понадобится идентификатор предыдущего коммита. Вот он:

Теперь удаляем наш коммит вот такой коммандой. В команде мы указываем идентификатор предыдущего коммента:

Похожие статьи