Контекст
Один из моих товарищей по команде ошибочно подтолкнул некоторые фиксации к нашей основной ветке развития. Мы маленькая, дружная команда. Наш удаленный репозиторий размещен на внутреннем сервере.
Вот вершина нашего журнала фиксации (все эти фиксации уже были нажаты):
$ git log develop -6 --pretty=oneline --abbrev-commit
faada93 Merge branch 'develop' of <our_repo_path>.git
244d174 Support classes again
a97a877 Pruned all unused references (again).
8c29252 Merge branch 'develop' of <our_repo_path>.git
a78b993 Support models & methods - product types & categories
da8b496 Resolved JIRA issue PPF-182
da8b496
является последним фиксатором, который мы хотели сохранить в нашей ветке develop
, поэтому нам нужно было вернуть 5 последних коммитов. Мы создали новую ветку из 8c29252
, чтобы продолжить работу в "ветке функций".
Я пробовал много вещей, руководствуясь этим ответом и этот пост из Linus, и закончил тем, что вы можете увидеть в моей истории терминалов ниже. Но я не уверен, что то, что я закончил, - это "правильный путь". Информация, которую я нашел, была сложной; Я не смог определить "лучшее решение" для этой конкретной проблемы.
Вопрос
Был ли подход, который я выбрал (см. подробности ниже), хороший способ вернуть эти 5 коммитов, не навредив нашей истории? Есть ли более простой или "более правильный" способ выполнить одно и то же?
Кроме всего прочего, я решил создать новую ветку из da8b496
(git checkout -b new-develop da8b496
) и отказаться от нашей текущей ветки develop
, но это просто не понравилось.
Что я закончил делать (подробности)
Во-первых, я создал новую ветвь для commits a78b993
и 8c29252
, потому что эти коммиты содержат работу, которую мы хотим сохранить, и, в конечном счете, сможем вернуться к нашей основной ветке развития.
$ git checkout -b new-feature-brach 8c29252
Затем я начал возвращать оскорбительные коммиты в нашей ветке разработки.
Я попробовал это сначала, но это не сработало (вероятно, потому что некоторые из коммитов являются слияниями):
$ git revert a78b993..HEAD
error: a cherry-pick or revert is already in progress
hint: try "git cherry-pick (--continue | --quit | --abort)"
fatal: revert failed
Итак... Я вручную отменил каждую фиксацию; один за другим:
$ git revert -m 1 faada93
[develop 40965a5] Revert "Merge branch 'develop' of <our_repo_path>.git"
8 files changed, 167 insertions(+), 3 deletions(-)
$ git revert 244d174
[develop 3cebd68] Revert "Support classes again"
45 files changed, 557 insertions(+), 1572 deletions(-)
(list of affected files)
$ git revert a97a877
error: could not revert a97a877... Pruned all unused references (again).
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
$ git mergetool
Merging:
exampleFile1.cs
exampleFile2.cs
Deleted merge conflict for 'exampleFile1.cs':
{local}: deleted
{remote}: modified file
Use (m)odified or (d)eleted file, or (a)bort? m
Deleted merge conflict for 'exampleFile2.cs':
{local}: deleted
{remote}: modified file
Use (m)odified or (d)eleted file, or (a)bort? m
$ git commit -m "Adding files to be reverted along with the next commit."
[develop 15bc02b] Adding files to be able to revert the next commit in line.
2 files changed, 239 insertions(+)
(list of affected files here)
$ git revert -m 1 8c29252
# On branch develop
# Your branch is ahead of 'origin/develop' by 3 commits.
# (use "git push" to publish your local commits)
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# exampleFile1.cs.orig
# exampleFile2.cs.orig
nothing added to commit but untracked files present (use "git add" to track)
$ git revert a78b993
[develop 841e77c] Revert "Support models & methods - product types & categories"
2 files changed, 239 deletions(-)
(list of affected files here)
Зафиксировать журнал после завершения всех ревертов:
$ git log develop -10 --pretty=oneline --abbrev-commit
841e77c Revert "Support models & methods - product types & categories"
15bc02b Adding files to be able to revert the next commit in line.
3cebd68 Revert "Support classes again"
40965a5 Revert "Merge branch 'develop' of <our_repo_path>.git"
faada93 Merge branch 'develop' of <our_repo_path>.git
244d174 Support classes again
a97a877 Pruned all unused references (again).
8c29252 Merge branch 'develop' of <our_repo_path>.git
a78b993 Support models & methods - product types & categories
da8b496 Resolved JIRA issue PPF-182
График после возврата:
$ git log --graph --oneline -8 develop
* 841e77c Revert "Support models & methods - product types & categories"
* 15bc02b Adding files to be able to revert the next commit in line.
* 3cebd68 Revert "Support classes again"
* 40965a5 Revert "Merge branch 'develop' of <our_repo_path>.git"
* faada93 Merge branch 'develop' of <our_repo_path>.git
|\
| * a97a877 Pruned all unused references (again).
| * 8c29252 Merge branch 'develop' of <our_repo_path>.git
| |\
| | * da8b496 Resolved JIRA issue PPF-182
Кажется правильным для меня. Наконец, я удаляю некоторые файлы резервных копий, которые я не хочу сохранять:
$ git clean -fd
(list of affected files here)
Текущее состояние чиста:
$ git status
# On branch develop
# Your branch is ahead of 'origin/develop' by 4 commits.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
И затем я все время отдаю на пульт:
git push origin develop