Подтвердить что ты не робот

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

Я сделал фиксацию и вернул с помощью

git revert HEAD^

только git log

➜  git:(master) git log
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio <[email protected]>
Date:   Tue Jan 17 16:32:15 2012 -0800

    Production explanation

Но если я делаю git log - все это показывается. Мне нужно удалить его из истории, поскольку она имеет конфиденциальную информацию.

git log --all
commit 5d44355080500ee6518f157c084f519da47b9391
Author: Daniel Palacio
Date:   Tue Jan 17 16:40:48 2012 -0800

    This commit has to be reset

commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio 
Date:   Tue Jan 17 16:32:15 2012 -0800

    Production explanation

Как удалить фиксацию 5d44355080500ee6518f157c084f519da47b9391 из истории?

4b9b3361

Ответ 1

Во-первых, git revert является неправильной командой здесь. Это создает новую фиксацию, которая возвращает более старую. Это не то, о чем вы просите. Во-вторых, похоже, что вы хотите вернуть HEAD вместо HEAD^.

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

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

git reflog expire --expire=now --expire-unreachable=now --all
git gc --prune=now

хотя это должно быть сделано, только если вам действительно нужно это сделать.


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

Ответ 2

Если вы не заботитесь о фиксации, просто выполните:

git reset --hard HEAD~

чтобы снести фиксацию.

Если вы хотите, чтобы изменения были в рабочем каталоге, выполните:

git reset HEAD~

В зависимости от того, что вы сделали с git revert, вам, возможно, придется изменить приведенные выше команды. Revert создает новую фиксацию, которая возвращает транзакцию, которую вы хотите вернуть. Таким образом, будут две фиксации. Возможно, вам придется сделать HEAD~2, чтобы удалить их оба.

Обратите внимание, что, как правило, возврат - это более безопасный способ, а также возврат изменений. Но здесь, поскольку вы хотите удалить конфиденциальные данные, reset - лучший подход.

Ответ 3

Здесь есть хорошее решение здесь. Чтобы удалить последнюю (верхнюю) фиксацию, вы можете сделать

git push [remote] +[bad_commit]^:[branch]

где [bad_commit] - это фиксация, на которую на данный момент указывает [ветвь] или если локальная локация [ветка] вы также можете выполнить

git reset HEAD^ --hard
git push [remote] -f

Ответ 4

Если вы еще не нажали фиксацию, вы можете просто:

git reset --hard HEAD ~ 2

(HEAD ~ 2, чтобы удалить исходную фиксацию и выполнить команду "вернуть" ).

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

Ответ 5

Вот простое рабочее решение, которое удаляет последний коммит из удаленного:

  1. клонировать репо и найти последний "хороший" коммит (.... c407)
$ git clone [email protected]:PROJ/myrepo.git 
$ cd myrepo 
$ git log --pretty=oneline

234987fed789de97232ababababcef3234958723 bad_commit
e4a2ec4a80ef63e1e2e694051d9eb3951b14c407 v4.3
2f116449144dbe46e7260d5dac2304803751b5c2 v4.2
  1. Оформить последний хороший коммит в новую временную ветку
$ git checkout e4a2ec4a80ef63e1e2e694051d9eb3951b14c407
$ git checkout -b temp_branch
  1. заменить удаленную ветку (удалить и нажать временную)
git push origin --delete dev_branch
git push origin temp_branch:dev_branch