Как "отменить" отмененный Git commit?

Учитывая изменение, которое было выполнено с помощью commit, а затем вернулось с помощью revert, что лучший способ отменить это возвращение?

В идеале это должно быть сделано с помощью новой фиксации, чтобы не переписывать историю.

Ответ 1

Если вы еще не нажали это изменение, git reset --hard HEAD^

В противном случае возврат возвращаемого значения будет прекрасным.

Другой способ - git checkout HEAD^^ -- ., а затем git add -A && git commit.

Ответ 2

git cherry-pick <original commit sha>
Выполним копию первоначальной фиксации, по существу повторно применяя фиксацию

Возврат возвращаемого значения сделает то же самое, с сообщением сообщения messier:
git revert <commit sha of the revert>

Любой из этих способов позволит вам git push без перезаписи истории, потому что он создает новую фиксацию после возврата.
При вводе команды фиксации вам обычно нужны только первые 5 или 6 символов:
git cherry-pick 6bfabc

Ответ 3

Вернуть коммит, как и любой другой коммит в git. Это означает, что вы можете вернуть его, как в:

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

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

В нашей команде есть правило использовать коммиты revert при возврате, которые были зафиксированы в основной ветке, в первую очередь, чтобы сохранить историю в чистоте, чтобы вы могли видеть, какие коммиты возвращают то, что:

      7963f4b2a9d   Revert "Revert "OD-9033 parallel reporting configuration"
      "This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
                    ...
     a0e5e86d3b6    Revert "OD-9055 paralel reporting configuration"
     This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
                ...
     Merge pull request parallel_reporting_dbs to master* commit 
    '648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'

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

Очевидно, что если коммит возвращался и возвращался более одного раза, это становится довольно грязным.

Ответ 4

Возврат к возврату сделает свое дело

Например,

Если abcdef - это ваш коммит, а ghijkl - это ваш коммит, когда вы отменили коммит abcdef, тогда выполните:

git revert ghijkl

Это вернет возврат

Ответ 5

Вот как я это сделал:
Если ветка my_branchname была включена в слияние, которое было отменено. И я хотел бы my_branchname:

Сначала я делаю git checkout -b my_new_branchname из my_branchname.
Затем я делаю git reset --soft $COMMIT_HASH где $COMMIT_HASH - это хеш коммита коммита прямо перед первым коммитом my_branchname (см. my_branchname git log)
Затем я делаю новый коммит git commit -m "Add back reverted changes"
Затем я нажимаю на новую ветку git push origin new_branchname
Затем я сделал запрос на новую ветку.

Ответ 6

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

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

странная история

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

Ответ 7

Или вы можете сделать git checkout -b <new-branch> и git cherry-pick <commit> before для the и git rebase чтобы отбросить revert коммит. отправить запрос на извлечение, как раньше.

Ответ 8

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

Учитывая следующую стартовую ситуацию

 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E   <-- fixed-up topic branch

(W - это ваш первоначальный возврат слияния M; D и E - исправления для вашей первоначально разбитой ветки функции/фиксации)

Теперь вы можете просто переписать фиксацию от A до E, так что ни одно из них не "принадлежит" к возвращенному слиянию:

$ git checkout E
$ git rebase --no-ff P

Новая копия вашей ветки теперь может быть снова объединена с master:

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E

Ответ 9

Чтобы вернуть неустановленные и поэтапные изменения, которые были отменены после фиксации:

git reset [email protected]{1}

Чтобы восстановить все неустановленные удаления:

git ls-files -d | xargs git checkout --