私はgitsの高度な機能を試していないことを認めなければなりませんが、私の現在のプロジェクトではそうしなければなりませんでした。
状況:誰かがいくつかの機能を実装しようとし、それらをマスターにコミットしました、今私はこの他の人がしようとした(しかし失敗した)ことをするように呼ばれました、それで私が最初にしたことは
git checkout -b clean_start HASH
ハッシュは、現在のマスターの約20コミット前の正しいSHA1ハッシュであり、それは機能しました。このブランチにいくつかの変更を加えました。リモートリポジトリの現在のマスターブランチ(他の人が行った変更を含む)をローカルブランチに変更したいと思います。
言い換えれば、マスター20のコミットのヘッドを元に戻してから、新しいクリーンなブランチをマージします。
それはまさに私がしなければならないことですか? REVERT HEAD〜20などで、またはそのようなヘッドを正確に動かすコマンドはありますか?
リモートリポジトリが強制プッシュを受け入れる場合、これを行うことができます。
git Push --force Origin clean_start:master
他の誰かがリポジトリのクローンを作成している場合はそれらからのPushがこれを元に戻す可能性があるであることに注意してください。ローカルマスターブランチとリモートマスターブランチをマージしたいが、ブランチからのファイルツリーを保持する場合(Originのマスターのファイルツリーを破棄する)、次のように実行できます。
git merge -s ours --no-commit Origin/master
git commit # Separate step so that you can use your own commit message.
git checkout master
git merge clean_start # Fast-forward
git Push Origin master
これにより、両方のブランチ(マスターとOriginのマスター)を親としてマージコミットが作成されますが、ツリーは現在のブランチチップと同じになります。つまり、実際のコードマージが発生しなかった場所にシンボリックマージが作成されます。
リポジトリで作業している他の人が中断されることを気にしない場合は、最初の方法を使用できます。しかし、これらのコミットをすでに持っている他の人々と一緒に作業する場合、2番目のアプローチはより確実で、履歴を保持します。
具体的には、マスターを使用したい場所を指すことができます。
git update-ref refs/heads/master clean_start
(clean_start
の新しい変更を追跡していて、マスターがそこを指すようにする場合)
マスターが指していたもの(約20コミット相当)は「失われる」ことに注意してください。
このため、マスターのプッシュを強制する必要があります。
git Push Origin master -f
ローカルマスターをそのままにして、clean_startの場所をリモートマスターにプッシュする場合は、次のようにします。
git push origin clean_start:master -f
お役に立てれば。
PS。最初にgitk --all &
を実行して、これを行っているときに何が起こっているかを視覚的に確認できるようにします。
git reset コマンドは、HEADが指すものを変更するために存在します。
あなたの場合、これを行うことができます:
git checkout master # switch to the master branch
git reset --hard clean_start # point HEAD to the clean_start branch
git Push -f Origin master:master # force Push the new HEAD to server