web-dev-qa-db-ja.com

Sourcetreeでのマージの削除/取り消し

私はプロジェクトにかなりの変更を加え(マスターではなくリモートブランチで作業していました)、それらをコミットしてBitBucketでプルリクエストを作成し、ブランチをマスターにマージしました。コミット後に変更をプッシュするのを忘れていました。現在、現在のブランチをリモートブランチに切り替えて、マージ前にコミットに戻した後、すべての変更を元に戻し、システム内の別の場所にバックアップしました。私が今やりたいことは、私がやった悪いマージを元に戻すことです。マージをクリックして「リバースコミット」を選択するたびに、次のエラーメッセージが表示されます。

「エラー:コミットはマージですが、-mオプションが指定されていません。

致命的:復帰に失敗しました」

ブランチは次のようになります。

enter image description here

マージを削除し、master(4 behind)が表示されないような状態にします。

50
Rameez Hussain

この方法は、履歴の削除に基づいています。

  1. 間違いを犯したブランチをチェックしてください
  2. ブランチをリセットするコミットを右クリックします
  3. 「現在のブランチをこのコミットにリセットする」をクリックします
  4. 「ハード」モードを選択し、「OK」をクリックします
  5. 残念ながら、このビットを実行するには端末が必要です。 タイプgit Push Origin name_of_branch --forceターミナルに(コマンドを受け入れるためにgit repoユーザー名とパスワードを入力する必要があるかもしれません)

更新:ソースツリーの現在のバージョンは強制プッシュをサポートしています。つまり、手順5で説明したコマンドを使用する必要はありません。プッシュ時に表示されるチェックボックスがあり、それは「力」とラベル付けされています。通常は無効になっています。

強制プッシュチェックボックスを有効にする方法:

  1. 「ツール」(画面上部の青いバー)
  2. 「オプション」
  3. 「Git」タブ
  4. 「強制プッシュを有効にする」(第2セクション)
  5. "OK"

プッシュするときにそのチェックボックスをオンにして、Originサーバーの間違いも修正します。

これはおそらく最も簡単な方法ですが、履歴の削除に基づいているため、他の人がプロジェクトで作業している場合は、あなたが何をしているのかを全員に知らせて、誰かのgitリポジトリを壊さないようにしてください。

84
Daniel Tonon

SourceTreeを使用すると、マージコミットを元に戻すのが簡単になりません(少なくともWindows SourceTree 1.5.2.0では)。ただし、マージの取り消しはコマンドラインから簡単に実行できますが、[逆の別のコミットを追加してマージを取り消しますかマージコミットの結果、または単に履歴からマージコミットを完全に削除しますか?

masterブランチを他の人と共有していない場合、最も簡単なことは、ハードリセットを実行して、履歴からマージコミットを削除することです。ただし、他の人が既にそのマージコミットのコピーを持っている場合は、masterのコピーを書き直したバージョンと再同期しようとするため、追加の作業を作成します。

そのため、使用するオプションを把握する必要があります。コマンドラインを使用して、両方の手順を説明します。

履歴からコミットを削除

git checkout master
git Push Origin master --force

これにより、Origin/masterのマージコミットがローカルmasterブランチの現在の状態で上書きされ、マージコミットが削除されます。

別のリバースコミットでコミットを元に戻す

git checkout master
git merge Origin/master
git revert -m 1 HEAD

これにより、ローカルmasterブランチがOrigin/masterと同期し、git revertに1st parentは「メインライン」の親と見なされるべきものであり、他の親コミットからもたらされた変更に関連する逆コミットを作成します。

後で他の親から変更を再度取り込むことにした場合は、作成した復帰コミットを元に戻す別の復帰コミットを追加する必要があります(「復帰の復帰」と呼ばれる手法)。

こちらもご覧ください:

  1. Gitマージを元に戻しますか?.
  2. 元に戻したGitコミットを「元に戻す」にはどうすればよいですか?
  3. git-revert(1)マニュアルページ
  4. 障害のあるマージを元に戻す方法
35
user456814

私はコマンドラインなしで別の方法を見つけましたが、少しいですが、仕事をします。

したがって、ロールバックするコミットにハードリセットを行い、プロジェクトフォルダーに移動して(MacのFinderまたはWindowsのエクスプローラーを使用)、フォルダー全体のコピーを作成します。この「コピー」フォルダー内にあるのは、このプロセスの最後になりたいポイントです。

さて...ソースツリーに戻り、Head(リモートへの最新のコミット)をチェックアウトしてから、プロジェクトフォルダーに再度移動します。「」というフォルダーを表示できる必要があるため、非表示フォルダーが表示されることを確認してください。ギット"

project folder

現在のプロジェクトから「.git」をすべて削除します。つまり、現在のプロジェクトには「.git」というフォルダ以外は何もないので、「コピー」フォルダに移動して「.git」フォルダ以外をすべてコピーし、コンテンツを貼り付けます。現在のプロジェクト内(「.git」フォルダーがあるプロジェクトのみ)

できたソースツリーに移動し、変更をコミットします。プロジェクトはまさに望んだ場所にあり、すべての変更が削除されます。

終わり。


Obs1:今すぐ「コピー」フォルダを削除して、PCをダーティファイルから削除します。

Obs2:このプロセスはGitから変更を削除しません。コミットはそこにあります。あなたがしているのは、変更を削除してコミットすることです。

1
Fernando Bonet