web-dev-qa-db-ja.com

プッシュされたコミットを元に戻すには?

どちらもOriginマスターにプッシュされた最後の2つのコミットを取り消す必要があります。 Tortoise gitでは、履歴を表示し、最後のコミットから3番目をクリックして、「マスターをこれにリセット」を選択しました。これは、このバージョンに戻すことを意味していると推測しています。

ただし、このオプションを選択する場合は、次の3つのオプションのいずれかを選択する必要があります。

  1. ソフト-作業ツリーとインデックスをそのままにします。
  2. 混合-作業ツリーをそのままにし、インデックスをリセットします
  3. hard-作業ツリーとインデックスをリセットします。

残念ながら、これら3つのオプションのどれを選択すればよいかわかりません。最後の2つのコミットを元に戻し、時間を遡りたいだけです。

次の質問は、この操作がリモートのOrigin、あなたのリポジトリ、またはあなたの作業ディレクトリ、あるいはこれら3つの組み合わせで行われるのでしょうか?例えば。コミットとプッシュは元に戻した後に行う必要がありますか、それともあなたのためにこれを行いますか?

HARDが私たちが望むものであると推測します-それはリポジトリ(どちらかわからない)とローカルソースコードを以前のバージョンに戻します。この場合、なぜこれがデフォルトではなく、他の2つのオプションの使用例は何ですか?元に戻すかどうか、リモートリポジトリのみを元に戻し、ローカルの作業ファイルを元に戻さない場合は、乱雑な状態になります。

ローカルで変更されたファイルはありません。

注:gitを壊さないソリューションが必要です(過去にgitを壊してしまい、新しいリポジトリを作成する必要がありました)。おそらく、以前のバージョンをチェックアウトしてから最新バージョンの上にチェックインするなど、別の方法が考えられますが、その方法はわかりません。

次のようなことができることがわかります。

git checkout [revision]

しかし、このバージョンを新しいヘッドにする、またはヘッドをこれに置き換えることをgitにどのように伝えますか?マスターヘッドから離れているため、コミットするものは何もないので、コミットするだけではいけないと思います。余談ですが、あなたが前をチェックアウトした場合。バージョン、変更、コミット、何をどこにコミットしますか?

私は https://www.atlassian.com/git/tutorials/undoing-changes を読みましたが、ローカルリポジトリとリモートリポジトリの関係については触れていません。元に戻すコミットがすべてリモートOriginマスターにプッシュされた場合、リモートOrigin、ローカルリポジトリ、および作業ディレクトリを元に戻すためのレシピは不明です。3つすべてを3コミット前のコミットに戻す必要があります。これがリセットまたはリバートで行われるかどうかは気にしません-3つの場所すべてで機能する方法が必要です。

正しいレシピは次のようなものである可能性があります。

   git status (we are on master with a clean working dir)
   git git revert HEAD~2
   git commit -m "revert"
   git Push Origin mater

しかし、この例の一連のステップを見たことはありません。可能であれば、亀gitで実行することをお勧めします。

5
John Little

2つのオプションがあります。

  1. 履歴に戻りますが、履歴は保持します:revert
  2. 履歴に戻って履歴を変更すると、コミットの内容は永久に削除されます:reset --hardおよびPush --force

よくわからない場合は、revertを使用してください。これが最も安全なオプションです。

本当に、本当に、コミットを削除して、変更された履歴を気にしない場合は、reset --hardおよびPush --force。これには次のような影響があります。

  • 他の人がコミットを再導入できる
  • その他は、削除されたコミットに依存する可能性があります
  • パブリックリポジトリでは、マスターに強制的にプッシュすることはできません

ご質問

次の質問は、この操作がリモートのOrigin、あなたのリポジトリ、またはあなたの作業ディレクトリ、あるいはこれら3つの組み合わせで行われるのでしょうか?例えば。コミットとプッシュは元に戻した後に行う必要がありますか、それともあなたのためにこれを行いますか?

一般に、TortioseGitのすべての変更はクローン(「作業コピー」)にあります。また、プッシュは常に手動アクションです

HARDが私たちが望むものであると推測します-それはリポジトリ(どちらかわからない)とローカルソースコードを以前のバージョンに戻します。この場合、なぜこれがデフォルトではなく、他の2つのオプションの使用例は何ですか?

hardはコミットなどの履歴を削除するため、危険な操作です。他人の変更も削除できました!

他の2つのオプションの使用例は何ですか?

git reset --mixed、-soft、および--hardの違いは何ですか? を参照してください。

TortoiseGitの手順:

元に戻す

  1. コミットを元に戻す(ログから)

enter image description here

  1. 変更をコミット enter image description here

  2. とプッシュ

ハードリセットして強制プッシュ

  1. リセット(ログから)

enter image description here

  1. 厳選

enter image description here

  1. 強制プッシュ(チェックボックスの「既知の変更」)

enter image description here

4
Julian

元に戻すとリセットが混乱していると思います。 変更を元に戻す を参照してください。

元に戻す

Git revertコマンドは、コミットされたスナップショットを元に戻します。ただし、プロジェクト履歴からコミットを削除する代わりに、コミットによって導入された変更を元に戻す方法を見つけ出し、結果のコンテンツに新しいコミットを追加します。これにより、Gitが履歴を失うことがなくなります。これは、変更履歴の整合性と信頼性の高いコラボレーションのために重要です。

リセット

Git revertが変更を元に戻す「安全な」方法である場合、git resetを危険な方法と考えることができます。 git resetを使用して元に戻すと(コミットは参照または参照ログによって参照されなくなります)、元のコピーを取得する方法はありません。これは永続的な取り消しです。このツールは作業を失う可能性がある唯一のGitコマンドの1つであるため、このツールを使用するときは注意が必要です。

おそらくあなたのケースではrevertを使う方が良いでしょう:

enter image description here

この場合、特定のコミットを元に戻す新しいコミットを作成するだけで、履歴は変更されません。ローカルで実行してから、リモートにプッシュできます。

それでもリセットを行いたいがローカルでの変更を維持する必要がない場合は、ハードリセットを行います。

enter image description here

そして、あなたはプッシュを強制するべきです:

git Push -f
0
Alexan

このソリューションは私の時間を節約しました

1)git reset --hard 93827927ed6e245be27f94c93c7e3574e85b91c6(これはコミットIDです)
2)git reset HEAD〜1
3)git stash
4)git add。
5)git commit -m "ここに新しいコミットメッセージ"
6)git Push --force

0
arul pushpam