環境
チームメイトの 1 人が、誤っていくつかのコミットをメインの開発ブランチにプッシュしました。私たちは、同じ場所に配置された小さなチームです。当社のリモート リポジトリは、内部サーバーでホストされています。
以下はコミット ログの先頭です (これらのコミットはすべて既にプッシュされています)。
$ 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
が、それは適切ではないと感じました。
やったこと(詳細)
最初に、コミット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