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

Отменить фиксацию git

Можно ли отменить прошлую фиксацию, которая долгое время была объединена в ваш репозиторий git с помощью команды git? Или вам нужно вручную отменить все изменения, сделанные в этой фиксации?

4b9b3361

Ответ 1

Вы всегда можете просто отменить изменения из одной фиксации, выполнив:

git revert <commit-id>

обратите внимание, что это создает новую фиксацию, отменяя только те изменения

например. git log --oneline

d806fc9 two
18cdfa2 bye
62c332e hello
c7811ee initial

Скажем, я хочу вернуть изменения в commit 18cdfa2:

git revert 18cdfa2

Теперь имеем: git log -1 -p

commit fb9d6627a71636503fc9a1eb4f725937c783ecee
Author: Seth <[email protected](none)>
Date:   Wed Oct 3 10:32:46 2012 +0200

    Revert "bye"

    This reverts commit 18cdfa27c964b66b624be1030250757b745d6866.

diff --git a/a b/a
index 0907563..3b18e51 100644
--- a/a
+++ b/a
@@ -1 +1 @@
-bye world
+hello world

Ответ 2

Вы всегда можете сделать git revert <commit-hash>, чтобы отменить фиксацию git. Однако это в большинстве случаев не полезно, потому что он создает новую фиксацию, добавляющую ваш git reflog.

То, что я обычно делаю, когда я должен отступить, - это reset моя ветка на более ранний этап. Для этого сделайте git reflog и найдите позицию HEAD, в которую хотите перейти.

[email protected]:~/myrepo$ git reflog -3
8d386b8 [email protected]{0}: commit: I did something I don't want
2a59955 [email protected]{1}: commit: Feedback from PR #792
1023102 [email protected]{2}: checkout: moving from one branch to another

Теперь, скажем, я хочу перейти к фиксации хеша 2a59955 и отменить все изменения в 8d386b8. Я бы сделал:

Update: git reset --soft [email protected]{1} 

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

Это приведет к отмене всех ваших изменений. Существует жесткий reset, предназначенный для возврата во времени (по крайней мере, с точки зрения git). Используйте --hard вместо --soft для этого