Как мне отменить последние локальные коммиты в Git? - PullRequest
19725 голосов
/ 29 мая 2009

Я случайно отправил неправильные файлы на Git , но я еще не отправил коммит на сервер.

Как мне отменить эти коммиты из локального репозитория?

Ответы [ 78 ]

5 голосов
/ 16 сентября 2018

Что я делаю каждый раз, когда мне нужно отменить коммит / коммит:

  1. git reset HEAD~<n> // количество последних коммитов, которые мне нужно отменить
  2. git status // опционально. Все файлы теперь выделены красным цветом (без пометок).

  3. Теперь я могу добавлять и фиксировать только те файлы, которые мне нужны:

    • git add <file names> & git commit -m "message" -m "details"
  4. Необязательно: Я могу откатить изменения остальных файлов, если мне нужно, до их предыдущего состояния, с проверкой
    • git checkout <filename>
  5. если я уже выдвинул его на удаленный источник, ранее:
    • git push origin <branch name> -f // использовать -f для принудительного нажатия.
4 голосов
/ 12 ноября 2018

Получить последний идентификатор фиксации с помощью этой команды (в журнале сверху он самый последний):

git log

Получите идентификатор фиксации (GUID) и выполните эту команду:

git revert <commit_id>
2 голосов
/ 11 февраля 2019

замените вашу локальную версию, включая ваши изменения, версией сервера, эти две строки кода заставят git вытянуть и перезаписать локальную. Откройте командную строку и перейдите к корню проекта git. Если вы используете VS, нажмите Team, Synch и нажмите «Открыть командную строку» (см. Изображение) ниже.

Visual Studio

В командной строке Cmd выполните следующие две инструкции.

git fetch --all

тогда вы делаете

git reset --hard origin/master

это перезапишет существующую локальную версию с версией на git server

2 голосов
/ 27 сентября 2018

Как редактировать более ранний коммит

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

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

Вот рабочий процесс:

  1. git commit-edit <commit-hash>
    

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

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

  2. Исправьте и поставьте коммит так, как вам хотелось бы.

    (Вы можете использовать git stash save --keep-index, чтобы спрятать любые файлы, которые вы не делаете)

  3. Повторить коммит с --amend, например:

    git commit --amend
    
  4. Завершить ребаз:

    git rebase --continue
    

Назовите это следующее git-commit-edit и вставьте его в $PATH:

#!/bin/bash

# Do an automatic git rebase --interactive, editing the specified commit
# Revert the index and working tree to the point before the commit was staged
# https://stackoverflow.com/a/52324605/5353461

set -euo pipefail

script_name=${0##*/}

warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "$@"; exit 1; }

[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"

# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")

# Be able to show what commit we're editing to the user
if git config --get alias.print-commit-1 &>/dev/null; then
  message=$(git print-commit-1 "$commit")
else
  message=$(git log -1 --format='%h %s' "$commit")
fi

if [[ $OSTYPE =~ ^darwin ]]; then
  sed_inplace=(sed -Ei "")
else
  sed_inplace=(sed -Ei)
fi

export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed

echo
echo "Editing commit: $message" >&2
echo
2 голосов
/ 03 сентября 2018
git revert commit

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

https://git -scm.com / документы / ГИТ-Revert

1 голос
/ 29 ноября 2018

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

git reset --hard origin/branch-name

0 голосов
/ 23 мая 2019

Вы можете использовать git revert

и для получения идентификатора коммита просто используйте git log

0 голосов
/ 18 мая 2018
git push --delete (branch_name) //this will be removing the public version of your branch

git push origin (branch_name) //This will add the previous version back
...