通常、ローカルで変更を行ったときに、間違ったブランチで変更したことが判明したため、コミットする前にブランチを切り替える必要があります。問題は、ローカルの変更があるときにブランチを切り替えることができないことです。とにかくそれを行うことはありますか?
明らかに、更新されたファイルをコピーし、ブランチを切り替えてからコピーして戻すことはできますが、これはあまり賢明ではありません。
通常、ローカルで変更を行ったときに、間違ったブランチで変更したことが判明したため、コミットする前にブランチを切り替える必要があります。問題は、ローカルの変更があるときにブランチを切り替えることができないことです。とにかくそれを行うことはありますか?
明らかに、更新されたファイルをコピーし、ブランチを切り替えてからコピーして戻すことはできますが、これはあまり賢明ではありません。
ローカルの変更が 2 つのブランチ間の違いと競合しない限り、ローカルの変更中にブランチを切り替えることができます。この場合、-m
or--merge
オプションを使用checkout
してチェックアウトを実行し、変更とブランチの切り替えによって発生した変更との間でマージを実行できます。
git checkout -m other-branch
そんな時に使いますgit stash
。作業コピー (キャッシュされたファイルとキャッシュされていないファイルの両方) の現在の状態の一時的なコミットを作成し、作業コピーを現在の HEAD に戻します。次に、他のブランチに切り替えて実行できますgit stash pop
。
他の人が言ったようにstash
、 orを使用できますcheckout --merge
。ただし、これらのオプションにより、一部のファイルのタイムスタンプが変更されます。コンパイルに時間がかかる可能性がある大規模なプロジェクトに取り組んでいる場合 (現在のプロジェクトでは、分散ビルドでコンパイルするのに 30 分かかります)、これは最適ではない可能性があります。
この状況では、別のリポジトリを使用して、コミットを正しいブランチに移動できます。まず、現在のリポジトリを複製する必要があります (これは 1 回だけ実行する必要があります)。
$ git clone /path/to/repository repository.clone
$ cd repository.clone
$ git remote add origin repository.clone
$ git fetch origin
次に、現在のリポジトリで変更をコミットします。
$ cd /path/to/repository
$ git add path/to/modified/files
$ git commit -m 'Commit message'
もう一方のリポジトリで、新しいコミットをフェッチし、正しいブランチに移動します。
$ cd ../repository.clone
$ git fetch origin
$ git checkout correct-branch
$ git reset --hard origin/correct-branch
$ git cherry-pick origin/current-branch
$ # resolve conflicts if any, commit with -c option in this case
$ git push origin correct-branch:correct-branch
次に、元のリポジトリで、一時的なコミットを削除し、関連する変更を削除します (両方のブランチに保持する場合を除く)。
$ cd /path/to/repository
$ git reset HEAD^
$ # edit file and remove modifications moved to other branch
これはより複雑で、履歴の書き換えを伴いますが、プロジェクトが非常に大きく、コンパイル時間が制限要因となっている場合は、この手法を知っておくと役立ちます。複製されたリポジトリは再利用できるため、毎回削除/再作成する必要はありません (コンパイル時間が長い場合、リポジトリはおそらく大きく、複製には時間がかかる可能性があります)。