ブランチを取り戻しdev
たいのですが、残したくないものでいっぱいです。そこにある履歴を削除せずに、現在の状態を停止して、代わりにステージングに基づくようにすることはできますか?次のように設定したいと思います。
staging __________________________________
dev _________ \______/ \____/
ブランチを取り戻しdev
たいのですが、残したくないものでいっぱいです。そこにある履歴を削除せずに、現在の状態を停止して、代わりにステージングに基づくようにすることはできますか?次のように設定したいと思います。
staging __________________________________
dev _________ \______/ \____/
「ステージングに基づく」および「履歴を削除しない」の意味によって異なります。
dev
マージして一緒に行動したいstaging
が、実際には現在ステージングされているものとまったく同じ結果が得られるという意味であれば、それは簡単です。リポジトリのルートディレクトリから:
git checkout origin/dev -b dev
git merge --no-commit origin/staging
git checkout --theirs .
git commit -m "Revert back to the contents of staging"
git push origin dev
ここでのキーラインは3番目です。origin/staging
これは、マージの結果をブランチの正確な内容で上書きするものです。
ブランチはコミットへの参照にすぎません。ブランチを削除したいdev
場合は、ローカルリポジトリで
$ git branch -D dev
$ git branch dev staging
最初のコマンドはブランチ「dev」を削除し、2番目のコマンドはブランチ「dev」を再度作成して「staging」からフォークし、「dev」ブランチが「staging」と同じコミットを指すようにします。
リモートリポジトリと同期する場合は、新しい「dev」ブランチを強制的にプッシュする必要があります。
$ git push --force origin dev
「dev」に含まれる履歴を今でも保持する必要がある場合は、削除する代わりに名前を変更してください。
$ git branch -m dev ex-dev
新しい「開発者」を強制的にプッシュすることについてのポイントは、この場合でも明らかに当てはまります。
リモートリポジトリ内のブランチの強制的な置き換えは、そのような置き換えの前にリポジトリのクローンを作成し、現在置き換えられているブランチの元のコンテンツに基づいてローカルブランチを作成した人に大きな影響を与えることに注意してください。これは、文献で広く取り上げられています。git-rebase
たとえば、マニュアルを参照してください。
あなたの質問は、「保持したくないもの」と書かれているのに、「履歴を削除せずに」と書かれているという点で少し混乱しています。注意を怠るには、次のことをお勧めします。
git checkout staging #switch away from dev branch
git branch -m dev olddev #rename old dev branch so we don't delete history
git checkout -b dev staging # start a new dev branch where staging is currently
別のポイントで新しいブランチを開始する場合は、最後のコマンドでdev
適切なSHA1またはブランチ名に置き換えてください。親のいない完全に新しいブランチにstaging
なりたい場合は、へのオプションが必要になります。dev
--orphan
git checkout
dev
それが済んだら、新しいものをアップストリームリポジトリにプッシュすることについてのkostixノートを参照してください。