Gitリポジトリであるプロジェクトを提供するWebサーバーがあります。コードにいくつか変更を加えたら、サーバーからgit pullを実行します。新しいコードがクラッシュするだけの場合もありますが、直前のプルにロールバックできるようにしたいと思います。スクリプトを使用して、最新のshaを検索することなく、これを実行したいです。どうやってやるの?
編集:明確にするために、「おっと!今行ったばかりのこの最新のプルは間違いだったので、やらなかったらよかった」というボタンを押すなど、1つのアクションを実行する必要があります。この状況ではshaやtagなどを探す必要はありません。「元に戻す」機能に似ています。その後、コードの作業を続行できるようにしたいので、サーバーを次にプルするときに最新の変更を反映する必要があります。
git reset --hard HEAD^1
は、プルしたものからコミットを1つ戻します。プルする前の状態に戻したい場合は、git reset --hard HEAD@{1}
を使用します。 @{1}
は、ローカルリポジトリで最後に変更した操作の前にヘッドがあった場所を追跡するため、プルを実行する前に複数のコミットがプッシュされた場合、いくつかのコミットに戻ります。リスト全体を表示するには、git reflog
も参照してください。
この場合、ブランチを使用することは理にかなっています。ブランチは、失敗または成功時に簡単に削除またはマージできます。これにより、新しい内容を追跡しやすくなり、「最後のコミットを削除する」よりも複雑な場合(特にスクリプトを使用する場合)に、よりきれいになります。サーバー上で:
git fetch --all # fetch new commits from remote
git checkout -b testing # create and switch to branch 'testing'
git merge Origin/master # merge new commits from remote branch master
# (in branch 'testing')
...次にテストします...成功した場合:
git checkout master # switch back to master
git merge testing
失敗した場合:
git checkout master
git branch -D testing # remove testing branch
しかし、とにかく...最後のコミットを削除することが唯一のポイントなので、git reset
Joshが指摘したとおり。
git reset HEAD^
は、前のコミットに移動するはずです。詳細については here を参照してください。
最後のプルを破棄する別の方法があります
git reset --keep HEAD@{1}
@Karl Bielefeldtによって受け入れられた答えは、私にとってはうまくいきませんでした。 GITバージョン2.10.0.windows.1を使用しています。これは古いバージョンでも機能する可能性があります。 「不明なスイッチ 'e'」エラーが表示されます。最後に、私はいくつかの変更を行い、それが機能しました。
以下は、以前のプル前の状態に戻す手順です。
git reflog
は、Karlが言及したリストを表示します。git reset --hard <commit version>
これを行う別の方法には、タグの使用が含まれます。 HEADをプルする前に何らかのバージョン番号でタグ付けすることができると考えて、プルしてください。その後、HEAD行う git reset {tag name}
そのようにしてプルに複数のコミットがある場合、マージ前の場所にスキップできます。