githubリポジトリを特定のコミットにロールバックするにはどうすればよいですか?


431

私のgithubには現在100個のコミットがあります。リポジトリをロールバックして80をコミットし、それ以降のリポジトリをすべて削除する必要があります。

どうして?このレポは、さまざまなユーザーからのマージ用です。過度の編集が原因で、私からのコミットとしてたくさんのマージが行われました。これは、3つの開発者が互いにラベル付けされていた、私のリモートブランチのラベル​​付けの誤りが原因でした。そのポイントにリセットしてから、前に進む必要があります。

この例のようにリベースしたいと思いました:GitHubでコミットを削除するにはどうすればよいですか?

しかし、gitは私に多くの競合管理をしてほしいと思っています。より簡単な方法はありますか?

回答:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

注:以下のコメントに記載されているように、これを使用することは、共同作業環境では危険です:履歴を書き換えています


43
人々は、行いますgit push -f origin branch。私はそれを逃したので、私はちょうど悪い時間を過ごしました。
Sumit M Asok 2014年

21
これに注意してください!ローカルですべてのコミットが失われ、プッシュすると元に戻せません
Thomas

8
それは真実ではありません。gitreflogを使用して古いコミットを取得できます
Jan Schaefer

27
あなたは何をする必要があるかもしれないgit push origin HEAD --force代わりのをgit push -f origin branch私に与えていたようなerror: src refspec branch does not match any.エラーを
sprocket12

1
うん、ありがとう。なんとかやりたかった。最初に、ロールバックしたいコミットの前のブランチとは別のブランチを作成しました。ローカルで複製しました。次に、あなたの推奨事項をそのコピーに適用しました。このようにして、私はメインブランチに
危害を加え

21

最新のコミットを元に戻すには、次のようにします。

最初:

git log

元に戻す最新のSHA IDを取得します。

git revert SHA

それはあなたのコミットの正反対を行う新しいコミットを作成します。次に、この新しいコミットをプッシュして、アプリを以前の状態に戻すことができます。それに応じて、git履歴にこれらの変更が表示されます。

これは、あなたがコミットしたものをすぐにやり直すのに適しています。

マイクが述べたように、これを行うこともできます:

git revert HEAD

8
git revert HEADハッシュを調べなくても、最後のコミットを元に戻します。
Mike Baranczak

これは、コミットをまったく削除したくない場合の解決策です。ただし、この場合、すべてのガベージコミットはそのまま残り、クローン作成者はそれらをリセットまたはチェックアウトできます。それを防ぐには、強制的にプッシュする必要があります。
cst1992

19

別の方法:

元に戻したいブランチをチェックアウトしてから、ローカルの作業用コピーを、リモートサーバー上の最新のものにするコミットにリセットします(それ以降はすべてバイバイ)。これを行うには、SourceTreeで右クリックし、「BRANCHNAMEをこのコミットにリセット」を選択しました。

次に、リポジトリのローカルディレクトリに移動して、次のコマンドを実行します。

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

これにより、ローカルリポジトリ内の現在のコミット以降のすべてのコミットが消去されますが、その1つのブランチについてのみです。


1
FYI "REPOSITORY_NAME"はhttps:/me@github.com/me/repo_name.gitのようなものになります
tim

3
そのコマンドを分解して説明すると、さらに役立ちます。
cst1992

3

ほとんどの提案では、過去20回のコミットを何らかの方法で破棄する必要があると想定しています。そのため、これは「履歴の書き換え」を意味しますが、そうする必要はありません。

コミット#80から新しいブランチを作成し、そのブランチで作業してください。他の20のコミットは古い孤立したブランチに残ります。

新しいブランチに同じ名前を付けたい場合は、ブランチは基本的に単なるラベルであることを覚えておいてください。古いブランチの名前を別の名前に変更し、コミット#80で新しいブランチを希望の名前で作成します。


これは問題のブランチの歴史の歴史のすべてのローカルバージョンに問題があるようにも混乱していると思います。
ragerdl

2

マスターからブランチの更新を行うとき、私は時々オーバークリックして、ブランチもマスターにマージすることに気づきました。それを元に戻す方法を見つけました。

最後のコミットがマージだった場合、もう少し愛が必要です:

git revert -m 1 HEAD


1

githubでは、簡単な方法は、ブランチタブの下のgithub UIでリモートブランチを削除することです。ブランチを削除可能にするには、次の設定を削除する必要があります。

  1. デフォルトのブランチではありません
  2. 投票開始リクエストはありません。
  3. ブランチは保護されていません。

これをローカルリポジトリに再作成して、以前のコミットポイントを指すようにします。そして、それをリモートリポジトリに追加します。

git checkout -b master 734c2b9b   # replace with your commit point

次にローカルブランチをリモートにプッシュします

git push -u origin master

デフォルトのブランチやブランチ保護などを元に戻します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.