bitbucketの最後のコミットを削除する


103

間違えたので、リポジトリの最新のプッシュを削除する方法がわかりません。アプリの最新の更新をプルしましたが、競合が発生してリポジトリにプッシュしています。

最後のコミットを削除するには?またはそれを修正するには?

回答:


102

そもそも、同じコードリポジトリで他のユーザーと作業している場合は、コミットを削除しないでください。リポジトリを強制的に更新すると、同僚のローカルリポジトリが不正な状態になります(たとえば、削除したコミットの後にコミットを行った場合、それらのコミットは現在存在しないコミットに基づいていたため、無効になります。

つまり、あなたができることはコミットを元に戻すことです。この手順は、使用しているCVSに応じて異なる方法(異なるコマンド)で実行されます。

オンgitの

git revert <commit>

オン水銀

hg backout <REV>

編集: 元に戻す操作は、元に戻すコミットとは逆の新しいコミットを作成します(たとえば、元のコミットが行を追加した場合、元に戻すコミットはその行を削除します)。リポジトリの履歴を書き換えることなく、不要なコミットの変更を効果的に削除します。


情報のおかげで。そして、私がコミットを削除した場合の結果を知っていますが、初めてミスをしたので、アクションを元に戻す方法がわかりません。システムはすでに稼働しているため、コミットを取り消す必要があります。私たちはそのリポジトリで作業している2人だけです。
キャサリン2013

git backout <REV>?または:hg backout <REV>
アルマンドペレスマルケス2013

しかし、元に戻されるコミットの後に追加されたコミットが、削除される行に変更を加えた場合はどうなりますか?
rahs

@RahulSahaあなたがやっていることは基本的にはコミットをブランチにマージしようとしているので、解決しなければならないマージの競合が発生すると確信しています。
asermax

98

他の人と一緒に作業していない場合(または、彼らに大きな不快感を与えて喜んでいる場合、ビットバケットブランチからコミットを削除することができます。

マスター以外のブランチを変更しようとしている場合:

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

あなたがマスターブランチを変更しようとしている場合

一般的にgitでは、masterブランチは特別なものではなく、単なる慣例です。ただし、bitbucketやgithubなどのサイトでは、通常、メインブランチが必要です(おそらく、リポジトリにブランチがないというイベントを処理するためのコードを記述するよりも簡単であるため-確かではありません)。したがって、新しいブランチを作成し、それをメインブランチにする必要があります。

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

Bitbucketでリポジトリ設定に移動し、「Mainブランチ」をmaster_temp(Githubで「デフォルトブランチ」を変更)に変更します。

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

次に、Bitbucketに移動すると、必要な履歴が表示されます。これで、設定ページに移動してMainブランチをに戻すことができますmaster

このプロセスは、他の履歴変更(たとえばgit filter-branch)でも機能します。新しい履歴が古い履歴から分離する前に、適切なコミットにリセットすることを確認する必要があります。

編集リセットブランチを強制的にプッシュすることができるので、どうやらgithubでこのすべての面倒に行く必要はありません。

迷惑な協力者への対処

次に誰かがリポジトリからプルしようとすると(すでに悪いコミットをプルしている場合)、プルは失敗します。変更された履歴の前に手動でコミットにリセットしてから、再度プルする必要があります。

git reset HEAD^
git pull

不正なコミットをプルし、その上でコミットした場合は、リセットgit cherry-pickしてから作成する適切なコミットを実行し、不正なコミットなしでブランチ全体を効果的に再作成する必要があります。

彼らが悪いコミットを引いたことがなければ、このプロセス全体は彼らに影響を及ぼさず、彼らは通常通り引っぱることができます。


1
SourceTreeの使用に慣れている方のために:1)BitBucketのWeb UIのメインブランチを変更するには、リポジトリ設定を確認します。2)Web UIでブランチを削除するには、ブランチページを確認します。3)ローカルリポジトリを上記のようにリセットします。4)ローカルの変更を押し上げて、それらのブランチを再作成します。
Richard Le Mesurier、

2
誤って秘密を漏らしてしまった私として、この回答の徹底にとても感謝しました。ありがとう!
トルク

48

リセットしてHEAD^強制的に押すことができます。

git reset HEAD^
git push -u origin master --force

それはあなたの最後のコミットを削除し、コミットが削除されたとしてbitbucketに反映しますが、それでも彼らのサーバーに残ります。


Githubはこれを許可しますが、これを書いている時点では、Bitbucketは強制プッシュを許可していません。
JamesQMurphy、2015

4
実際、bitbucketは、追跡されていないコミットを完全に削除するのではなく、差分を削除としてマークするだけで、強制プッシュをサポートします。
Shubanker 2015

bitbucketからの推奨される方法は、復帰を使用することです。しかし、私の場合はこれがより適切だと思います。私はそれを使用している唯一の人であり、それはrevertを使用するよりもきれいに感じます。ありがとう。
-nafsaka

1
はい、これはまだBitbucketで動作します。あなたはちょうど私の時間を節約しました!私は自分のEclipseからコミット/プッシュを行い、私が持っていた他のプロジェクトと混同しました。gitで作業するためにコマンドラインと組み込みのEclipseの両方を使用することによる私の部分の悪い習慣が原因です。
DarkCygnus

素晴らしい、またはより簡単:現在のブランチをこのコミットにリセットし、その強制プッシュを使用してサーバーに問題を修正します
Anthony Kal

3

過去にgit revertで問題が発生しました(主に動作がよくわからないためです)マージの問題で復帰に問題がありました。

私の簡単な解決策はこれです。

ステップ1。

 git clone <your repos URL> .

あなたのプロジェクトを別のフォルダに入れてから:

ステップ2。

git reset --hard <the commit you wanna go to>

次にステップ3。

最新の(およびメインの)プロジェクトディレクトリ(問題のある最後のコミットがあるプロジェクト)に、手順2のファイルを貼り付けます。

ステップ4。

git commit -m "Fixing the previous messy commit" 

ステップ5。

楽しい


1
切り取りと貼り付けは本当に面倒です。さらに、これは問題から問題を解決しません。
Daniel Lee

1
git revertシンプルです。前のコミット(または複数のコミット)での変更の逆を行う新しいコミットを作成します。コミットは削除されないため、この質問には関係ありません。また、ここでのクローン作成手順は本当に必要ではありません。
naught101

1
git revertは上記と同じメカニズムです。
nafsaka

3

以下は、最大4ステップの簡単なアプローチです。

0-リポジトリを修正する予定のチームに助言する

チームとつながり、今後の変更について知らせます。

1-最後のコミットを削除する

ターゲットブランチがmaster次のようであると仮定します。

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

この時点で、一人で作業している場合は完了です。

2-チームメイトのローカルリポジトリを修正する

チームメイトの:

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

チームメイトに新しいコミットがない場合は、この時点で完了しており、同期しているはずです。

3-失われたコミットを取り戻す

チームメイトがこのプロセスで失われた新しい未公開のコミットを持っていたとしましょう。

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

必要なだけのコミットに対してこれを行います。

私はこのアプローチを何度も成功させてきました。すべてが同期されていることを確認するには、チームの努力が必要です。


2

他の人が言ったように、通常はhg backoutやを使いたいでしょうgit revert。ただし、実際にはコミットを取り除きたい場合があります。

まず、リポジトリの設定に移動します。Strip commitsリンクをクリックします。

Bitbucket設定のコミットリンクを削除

破棄するチェンジセットのチェンジセットIDを入力して、をクリックしますPreview strip。これにより、実行する前に、どのような損害を与えようとしているのかがわかります。次にクリックするだけConfirmで、コミットは履歴ではなくなります。すべての共同編集者にあなたが何をしたかを伝えてください。そうすれば、不快なコミットが誤って押し戻されることがなくなります。


それはどのバージョンで、どの権限が必要ですか?私が見ているv6.4.3では見た目が異なり、このアイテムはありません。私リポジトリ管理者です。
Raphael

1

変更がコミットされると、削除できなくなります。コミットの基本的な性質は削除ではないためです。

できること(簡単で安全な方法)、

インタラクティブリベース:

1)git rebase -i HEAD~2 #最近の2つのコミットが表示されます

2)あなたのコミットはのように表示されます。Recentはページの下部に表示されますLILO(最後の最後)

ここに画像の説明を入力してください

最後のコミット行を完全に削除します

3)ctrl+Xまたはで保存するESC:wq

これで、最後のコミットなしでブランチが更新されます。


1

Dustinが述べているように、Bitbucketにもコマンドを記述できます。

git push -f origin HEAD^:master

注:マスターの代わりに、任意のブランチを使用できます。そして、Bitbucketをプッシュするだけで削除されます。

最後のコミットをローカルでgitで削除するには:

git reset --hard HEAD~1

0

今のところ、クラウドのbitbucket(どのバージョンかわからない)では、次のようにファイルシステムからコミットを元に戻すことができます(ChromeブラウザのBitbucketインターフェースから元に戻す方法はわかりません)。

-ディレクトリ全体をバックアップして、誤ってコミットした変更を保護します

-チェックアウトしたディレクトリを選択

-マウスの右ボタン:亀のgitメニュー

-repo-browser(メニューオプション 'revert'は、コミットされていない変更のみを元に戻します)

-HEADボタンを押す

-一番上の行を選択します(最後のコミット)

-マウスの右ボタン:このコミットによる変更を元に戻します

-ファイルシステムの変更を元に戻した後、commitを押します。

-これにより、「元に戻す(前のメッセージ)」というメッセージでGITが更新されます。これはコミットを元に戻します '

-「コミットしてプッシュ」を選択します。

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