リモートGitリポジトリのロールバック


111

リモートGitリポジトリがあり、最後のnコミットをコールド忘却にロールバックする必要があります。

回答:


135

git revert <commit>…n個すべてのコミットに使用でき、履歴を変更せずに通常どおりにプッシュできます。

または、で「ロールバック」できますgit reset --hard HEAD~n。パブリックリポジトリまたは共有リポジトリをプッシュしている場合、元のブランチに基づいて他の作業を分岐させて中断する可能性があります。Gitはそうすることを防ぎますが、を使用git push -fして強制的に更新できます。


5
次のgit reset --hard [sha1]コマンドを使用して、特定のコミットにロールバックできます。ここで、sha1はコミットハッシュ識別子です。
ピサルック

7
作業ディレクトリがないため、リモートリポジトリでget reset --hardを使用できません。元の質問は、リモートリポジトリがあることだけを述べており、ローカルリポジトリについての言及はありません。
ハゾク2013年


を使用revertすると、機能ブランチが「すでに」マージされたものとして扱われることに注意してください。これは、これらのブランチ実際にマージされているためです。しかし、変更は元に戻されました。解決策:コミットをチェリーピックまたは元に戻します。
Benedikt 2016

@Benedikt reset --hardにより、機能ブランチは既にマージされたものとして扱われますか?私の仮定はそうではない(どこにあるrevertか)。
マーカスレオン

37

elmarcoは正解です...彼の提案は、共有/パブリックリポジトリ(または少なくともパブリックブランチ)に最適です。共有されなかった場合(または他のユーザーを混乱させたい場合)、特定の参照をプッシュすることもできます。

git push origin old_master:master

または、特定のコミットSHA1(短縮形で1e4f99eなど)がある場合は、次に移動します。

git push origin 1e4f99e:master

9

幸い、私は不要なコミットを完全に削除するPat Notzのソリューションを使用する立場にありました。しかし、最初にエラーが発生しました

error: failed to push some refs to 'ssh://git@gitrepo.git'
To prevent you from losing history, non-fast-forward updates were rejected*

しかし、強制(-f)オプションを追加すると、このエラーが上書きされます

git push -f origin 52e36b294e:master

3

リモートリポジトリに直接アクセスできる場合は、いつでも使用できます。

git reset --soft <sha1>

これは、存在しない作業ディレクトリを変更する試みがないため機能します。詳細については、元の回答を参照してください:

git bareリポジトリの最後のコミットをコミット解除するにはどうすればよいですか?


2
なぜ--soft必要なのでしょうか?git resetモードフラグなしで、単にplainでも同じことを実行できます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.