9

確かにこれに関する投稿がありましたが、実際にコミットしたのは、それが正しいことだと思ったからです。

そのため、開発用と本番用の 2 つのリポジトリがあります。緊急のバグ修正であったため、本番環境で何かを編集する必要がありました。現在、開発環境よりも本番環境の方が新しいファイルが 3 つあります。

プロダクションで 3 つのファイルをコミットし、プルを試みましたが、マージ エラーがあると表示されました。新しいファイルを開発サーバーにコピーして貼り付け、すべてを再試行しましたが、うまくいきませんでした。これで、必要なものが開発にあり (コピーして貼り付けたので)、コミットされたので、競合するファイルをプルして上書きするにはどうすればよいでしょうか?


---- @Seths の返信をフォローアップ

わかりました、質問を言い換える必要があると思います:) 3つのリポジトリがあります。1 つの開発、1 つの GitHub および 1 つの運用。通常、本番環境を更新するには、開発から GitHub へgit pull origin master(GitHub から本番環境へ) プッシュするだけで機能します。

残念ながら、スタッシュせずに本番環境でファイルを変更しました。プルを試みるときにマージではなく上書きを強制するにはどうすればよいですか?

4

2 に答える 2

23

ローカル ブランチ foo をリモート ブランチ origin/foo の内容に完全に置き換えたい場合:

git fetch origin
git checkout foo
git reset --hard origin/foo

他のことをしたい場合は、質問を言い換えてください。ただし、実稼働の Git リポジトリをリモートとして追加し、ライブの変更をマージする可能性があります。

于 2011-06-06T20:25:09.747 に答える
1

最初に本番環境から GitHub にプッシュする必要があります。

git push origin yourbranch --force

フォースは、GitHub がプロダクションと同じものを持っていることを確認します。

あなたができることの可能性は次のとおりです。

デプロイ リポジトリの開発リポジトリに変更をフェッチする必要があります。この時点で、履歴が (git log --all --graphまたはを介し​​てgitk --all) 分岐していることがわかります。

git fetch origin

リベースまたはマージして、本番リポジトリで行われた変更の後に最新の変更を適用できるようになりました。これにより、後でデプロイ リポジトリに変更をプッシュできます。

競合には理由があります。それらを見て解決し、追加してコミットします。

本番側にあるものを取得して競合を解決したい場合は、「再帰的」戦略を使用できます。

git merge -s recursive -Xtheirs production/yourbranch

あなたの側から変更を加えたくない場合は、通常どおりにマージしますが、競合で停止した場合は、マージの反対側を取得し、追加してコミットします。

git merge production/yourbranch
git checkout production/yourbranch -- .
git submodules update #this is optional and can be skipped if you don't have any submodules
git add -A
git commit

これで、開発から GitHub への後続のプッシュと、本番環境での GitHub からのプルが機能します。

ブランチをリセットすることもできますが、それは、開発リポジトリで行った変更を保持したくないことを前提としています。

git reset --hard production/yourbranch
于 2011-06-06T21:17:03.133 に答える