Как мне «отменить» возвращенный коммит Git? - PullRequest
372 голосов
/ 04 января 2012

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

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

Ответы [ 9 ]

364 голосов
/ 30 апреля 2015

git cherry-pick <original commit sha>
Создает копию исходного коммита, по существу повторно применяя коммит

Отмена возврата сделает то же самое, с сообщением фиксации более сложного типа:
git revert <commit sha of the revert>

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

297 голосов
/ 04 января 2012

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

В противном случае, отмена возврата вполне подойдет.

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

11 голосов
/ 28 июня 2018

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

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

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

В нашей команде есть правило использовать revert для комментариев 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'

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

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

3 голосов
/ 18 сентября 2018

Отмена возврата сделает свое дело

Например,

If abcdef is your commit and ghijkl is the commit you have when you reverted the commit abcdef,

Затем введите,

git revert ghijkl

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

2 голосов
/ 25 июля 2018

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

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

2 голосов
/ 23 марта 2018

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

2 голосов
/ 23 сентября 2015

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

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

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

1 голос
/ 14 ноября 2017

Если вам не нравится идея «отменить возврат» (особенно, если это означает потерю хронологической информации для многих коммитов), вы всегда можете обратиться к документации 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
0 голосов
/ 11 июня 2019

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

git reset HEAD@{1}

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

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