32

私はgitsの高度な機能を使ったことがないことを認めなければなりませんが、現在のプロジェクトではそうしなければなりませんでした。

状況:誰かがいくつかの機能を実装してマスターにコミットしようとしましたが、今私はこの他の人がやろうとしたことをするように呼ばれました(しかし失敗しました)、したがって、私が最初にしたことは

git checkout -b clean_start HASH

ハッシュは、現在のマスターの前に約20コミットされた正しいSHA1ハッシュであり、機能しました。このブランチにいくつかの変更を加え、リモートリポジトリの現在のマスターブランチ(他の人が変更したもの)をローカルブランチに変更したいところです。

つまり、マスター20コミットのヘッドを元に戻し、新しいクリーンブランチをマージしたいと思います。

それはまさに私がしなければならないことですか?revert HEAD〜20などで、またはまさにそのような頭を動かすコマンドはありますか?

4

3 に答える 3

29

リモートリポジトリが強制プッシュを受け入れる場合は、これを行うことができます。

git push --force origin clean_start:master

他の誰かがリポジトリのクローンを作成している場合、それらからのプッシュによってこれが元に戻される可能性があることに注意してください。ローカルマスターブランチとリモートマスターブランチをマージしたいが、ファイルツリーをブランチから保持したい(元のマスターのファイルツリーを破棄した)場合は、次のように行うことができます。

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

これにより、両方のブランチ(マスターとオリジンのマスター)を親としてマージコミットが作成されますが、ツリーは現在のブランチチップと同じになります。つまり、実際のコードマージが発生しなかった場合にシンボリックマージが作成されます。

リポジトリで作業している他の人が中断されることを気にしない場合は、最初のアプローチを使用できます。しかし、すでにこれらのコミットを持っている他の人々と協力する場合、2番目のアプローチはより確実であり、歴史を保持します。

于 2010-11-24T22:14:15.490 に答える
26
  1. マスターを具体的に希望の場所に向けることができます。

    git update-ref refs/heads/master clean_start
    

    (で新しい変更を追跡していて、clean_startマスターにそこをポイントさせたい場合)

    マスターが指し示していたもの(約20コミット相当)は「失われる」ことに注意してください。

    このため、マスターのプッシュを強制する必要があります。

    git push origin master -f
    
  2. 代わりにローカルマスターをそのままにして、clean_startの場所をリモートマスターにプッシュする場合は、次のようにします。

    git push origin clean_start:master -f

    お役に立てれば。

    PS。最初に実行gitk --all &して、これを実行するときに何が起こっているかを視覚的に確認できるようにします。

于 2010-11-24T22:14:18.623 に答える
17

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
于 2010-11-24T22:58:44.330 に答える