С учетом изменений, которые были зафиксированы с использованием commit
, а затем отменены с помощью revert
, каков наилучший способ отменить этот возврат?
В идеале это должно быть сделано с новым коммитом, чтобы не переписывать историю.
С учетом изменений, которые были зафиксированы с использованием commit
, а затем отменены с помощью revert
, каков наилучший способ отменить этот возврат?
В идеале это должно быть сделано с новым коммитом, чтобы не переписывать историю.
Ответы:
Если вы еще не отменили это изменение, git reset --hard HEAD^
В противном случае, возвращение возврата совершенно нормально.
Другой способ - git checkout HEAD^^ -- .
и тогда git add -A && git commit
.
git cherry-pick
или в качестве альтернативы git revert
являются наиболее прямыми способами отменить возврат.
Otherwise, reverting the revert is perfectly fine.
а затем также объяснить, что git checkout HEAD^^ -- .
делает.
git add -A
... если вы не хотите добавлять каждый файл в систему управления версиями, что, скорее всего, не то, что вам нужно.
git cherry-pick <original commit sha>
Сделает копию оригинального коммита, по существу повторно применяя коммит
Возврат возврата будет делать то же самое с более сложным сообщением фиксации:
git revert <commit sha of the revert>
Любой из этих способов позволит вам git push
без перезаписи истории, потому что он создает новый коммит после возврата.
При вводе коммита sha обычно вам нужны только первые 5 или 6 символов:
git cherry-pick 6bfabc
Вернуть коммит, как и любой другой коммит в 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'
Таким образом, вы можете проследить историю и выяснить всю историю, и даже те, кто не знает о наследии, могут решить ее для себя. Принимая во внимание, что, если вы выбираете или перебираете вещи, эта ценная информация теряется (если вы не включите ее в комментарий).
Очевидно, что если коммит возвращался и возвращался более одного раза, это становится довольно грязным.
Возврат откат сделает свое дело
Например,
Если abcdef
это ваш коммит и ghijkl
тот коммит, который у вас был, когда вы отменили коммит abcdef
, то выполните:
git revert ghijkl
Это вернет возврат
Это выглядит глупо для меня. Но я был в той же ситуации, и я вернулся к отмененным коммитам. Я сделал возврат чисел, поэтому мне приходилось делать возврат для каждого «возврата».
Теперь моя история коммитов выглядит немного странно.
Это любимый проект, так что все в порядке. Но для реального проекта я бы предпочел перейти к последнему коммиту, прежде чем вернуться, чтобы восстановить весь возвращенный код вместе в одном коммите и более разумном комментарии.
Вот как я это сделал:
если ветвь my_branchname
была включена в слияние, которое было отменено. И я хотел unrevert 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
Затем я сделал запрос на извлечение новой ветки.
Если вам не нравится идея «отменить возврат» (особенно, когда это означает потерю хронологической информации для многих коммитов), вы всегда можете обратиться к документации по 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