回答:
そもそも、同じコードリポジトリで他のユーザーと作業している場合は、コミットを削除しないでください。リポジトリを強制的に更新すると、同僚のローカルリポジトリが不正な状態になります(たとえば、削除したコミットの後にコミットを行った場合、それらのコミットは現在存在しないコミットに基づいていたため、無効になります。
つまり、あなたができることはコミットを元に戻すことです。この手順は、使用しているCVSに応じて異なる方法(異なるコマンド)で実行されます。
オンgitの:
git revert <commit>
オン水銀:
hg backout <REV>
編集: 元に戻す操作は、元に戻すコミットとは逆の新しいコミットを作成します(たとえば、元のコミットが行を追加した場合、元に戻すコミットはその行を削除します)。リポジトリの履歴を書き換えることなく、不要なコミットの変更を効果的に削除します。
git backout <REV>
?または:hg backout <REV>
?
他の人と一緒に作業していない場合(または、彼らに大きな不快感を与えて喜んでいる場合)、ビットバケットブランチからコミットを削除することができます。
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
してから作成する適切なコミットを実行し、不正なコミットなしでブランチ全体を効果的に再作成する必要があります。
彼らが悪いコミットを引いたことがなければ、このプロセス全体は彼らに影響を及ぼさず、彼らは通常通り引っぱることができます。
リセットしてHEAD^
強制的に押すことができます。
git reset HEAD^
git push -u origin master --force
それはあなたの最後のコミットを削除し、コミットが削除されたとしてbitbucketに反映しますが、それでも彼らのサーバーに残ります。
過去に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。
楽しい
git revert
シンプルです。前のコミット(または複数のコミット)での変更の逆を行う新しいコミットを作成します。コミットは削除されないため、この質問には関係ありません。また、ここでのクローン作成手順は本当に必要ではありません。
以下は、最大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>
必要なだけのコミットに対してこれを行います。
私はこのアプローチを何度も成功させてきました。すべてが同期されていることを確認するには、チームの努力が必要です。
他の人が言ったように、通常はhg backout
やを使いたいでしょうgit revert
。ただし、実際にはコミットを取り除きたい場合があります。
まず、リポジトリの設定に移動します。Strip commits
リンクをクリックします。
破棄するチェンジセットのチェンジセットIDを入力して、をクリックしますPreview strip
。これにより、実行する前に、どのような損害を与えようとしているのかがわかります。次にクリックするだけConfirm
で、コミットは履歴ではなくなります。すべての共同編集者にあなたが何をしたかを伝えてください。そうすれば、不快なコミットが誤って押し戻されることがなくなります。
変更がコミットされると、削除できなくなります。コミットの基本的な性質は削除ではないためです。
できること(簡単で安全な方法)、
インタラクティブリベース:
1)git rebase -i HEAD~2
#最近の2つのコミットが表示されます
2)あなたのコミットはのように表示されます。Recentはページの下部に表示されますLILO(最後の最後)
最後のコミット行を完全に削除します
3)ctrl+X
またはで保存するESC:wq
これで、最後のコミットなしでブランチが更新されます。
今のところ、クラウドのbitbucket(どのバージョンかわからない)では、次のようにファイルシステムからコミットを元に戻すことができます(ChromeブラウザのBitbucketインターフェースから元に戻す方法はわかりません)。
-ディレクトリ全体をバックアップして、誤ってコミットした変更を保護します
-チェックアウトしたディレクトリを選択
-マウスの右ボタン:亀のgitメニュー
-repo-browser(メニューオプション 'revert'は、コミットされていない変更のみを元に戻します)
-HEADボタンを押す
-一番上の行を選択します(最後のコミット)
-マウスの右ボタン:このコミットによる変更を元に戻します
-ファイルシステムの変更を元に戻した後、commitを押します。
-これにより、「元に戻す(前のメッセージ)」というメッセージでGITが更新されます。これはコミットを元に戻します '
-「コミットしてプッシュ」を選択します。