私はgit rebase
でいくつかのコミットをつぶし、git Push --force
を実行しました(これは悪いことです、私は知っています)。
現在、他のソフトウェアエンジニアの歴史は異なり、git pull
を実行すると、Gitはマージされます。 rm my-repo; git clone [email protected]:my-repo.git
を実行する以外に、これを修正する方法はありますか?
git Push --force
の反対のようなものが必要ですが、git pull --force
は意図した結果を与えませんでした。
新しいコミットを受け取るには
git fetch
リセット
git reset
を使用して、ローカルブランチのコミットをリセットできます。
ローカルブランチのコミットを変更するには:
git reset Origin/master --hard
ただし、ドキュメントに記載されているように注意してください
インデックスと作業ツリーをリセットします。 <commit>以降の作業ツリー内の追跡ファイルへの変更は破棄されます。
ローカルで取得した変更を実際に保持する場合は、代わりに--soft
リセットを実行します。これにより、ブランチのコミット履歴が更新されますが、作業ディレクトリ内のファイルは変更されません(その後コミットできます)。
リベース
git rebase
を使用して、他のコミット/ブランチの上にローカルコミットを再生できます。
git rebase -i Origin/master
これにより、リベースが対話モードで呼び出され、リベースする履歴にない個々のコミットを適用する方法を選択できます。
(git Push -f
で)削除したコミットが既にローカル履歴にプルされている場合、それらは再適用されるコミットとして一覧表示されます-リベースの一部として削除する必要があるか、単にコミットに再含まれますブランチの履歴-そして次のプッシュでリモート履歴に再表示されます。
上記の(または他の)コマンドの詳細と例については、ヘルプgit command --help
を使用してください。
これは、不要なコードを既に持っているブランチを修正しません(その方法については以下を参照してください)が、ブランチをいくつか引っ張り、クリーンにしたい場合(そして「先」ではない場合) Origin/some-branch)その後、単純に:
git checkout some-branch # where some-branch can be replaced by any other branch
git branch base-branch -D # where base-branch is the one with the squashed commits
git checkout -b base-branch Origin/base-branch # recreating branch with correct commits
注:これらの間に&&を挿入することにより、これらすべてを組み合わせることができます
注2:フロリアンはコメントでこれについて言及しましたが、回答を探すときにコメントを読むのは誰ですか?
注3:ブランチが汚染されている場合は、新しい「ダムブランチ」に基づいて新しいブランチを作成し、コミットをチェリーピックするだけです。
例:
git checkout feature-old # some branch with the extra commits
git log # gives commits (write down the id of the ones you want)
git checkout base-branch # after you have already cleaned your local copy of it as above
git checkout -b feature-new # make a new branch for your feature
git cherry-pick asdfasd # where asdfasd is one of the commit ids you want
# repeat previous step for each commit id
git branch feature-old -D # delete the old branch
これで、新しい(おそらく悪い)コミットのないブランチが機能追加されました!