どうすればGitで次のことができますか?
私の現在のブランチはbranch1で、私はいくつかのローカルな変更を加えました。しかし、私は今、私が実際にこれらの変更をbranch2に適用しようとしていることを認識しています。これらの変更をブランチ1でコミットせずにブランチ2でローカルな変更になるように適用/マージする方法はありますか?
あなたのファイルはまだbranch1
にコミットされていないので、
git stash
git checkout branch2
git stash pop
または
git stash
git checkout branch2
git stash list # to check the various stash made in different branch
git stash apply x # to select the right one
コメント付き by benjohn ( git stash
のmanページ を参照):
現在追跡されていない(新しく追加された)ファイルも隠しておくには、引数
-u
を追加します。
git stash -u
隠蔽、一時的なコミット、そしてリベースはすべてやり過ぎるかもしれません。変更したファイルをまだインデックスに追加していない場合は、もう一方のブランチをチェックアウトすることもできます。
git checkout branch2
編集中のファイルがbranch1とbranch2の間で異なっていない限り、これは機能します。変更を保存したままブランチ2に移動します。それらが異なる場合は、チェックアウトの-m
オプションでブランチを切り替えることによって導入された変更とローカルの変更をマージすることを指定できます。
git checkout -m branch2
インデックスに変更を追加した場合は、最初にリセットしてこれらの変更を元に戻します。 (これにより作業コピーが保存され、ステージされた変更が削除されるだけです。)
git reset
前述のstashアプローチに代わるより短い方法は、次のとおりです。
一時的に変更を隠し場所に移動します。
git stash
新しいブランチを作成してそれに切り替えて、ワンステップでそれに隠し棒をポップします。
git stash branch new_branch_name
それから、この新しいブランチへの変更をadd
とcommit
に変更します。
コミットされた変更に関するものであれば、git-rebaseを見るべきですが、VonCのコメントで指摘されているように、ローカルの変更について話しているので、git-stashは確かにこれを行うための良い方法でしょう。
これまでの答えは、マージの競合を解決するために多くの不必要な作業を必要としたり、間違っていたりすることが多いため、理想的ではありません。これはどうやってそれを完璧にするかです。リンクは私自身のサイトへのものです。
my_branch
からのすべての変更をコミットせずに、master
にコミットするmy_branch
の未コミットの変更があります。
git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop
とにかくmaster
をブランチにマージすることから始めましょう。結局それをしなければならなくなるでしょう、そして今は衝突を解決するための最良の時です。
-u
の--include-untracked
オプション(別名git stash -u
)は、後でmaster
内でgit clean -f -d
を実行したときに追跡されていないファイルを失うことを防ぎます。
git checkout master
の後にgit stash pop
を付けないことが重要です。なぜなら、後でこの隠し場所が必要になるからです。 my_branch
で作成した隠し場所をポップしてからmaster
内でgit stash
を実行すると、後でその隠し場所をmy_branch
に適用するときに不要なマージの競合が発生します。
git reset
は、git stash apply
から生じるすべてをアンステージングします。たとえば、stashで変更されていてもmaster
に存在しないファイルは、「削除されました」という競合が発生します。
git checkout .
とgit clean -f -d
は、コミットされていないものすべて、つまり追跡されているファイルに対するすべての変更、追跡されていないすべてのファイルとディレクトリを破棄します。それらはすでにstashに保存されており、master
に残されていると、my_branch
に切り替えるときに不必要なマージの競合が発生します。
最後のgit stash pop
は、元のmy_branch
に基づいているため、マージの競合は発生しません。しかし、あなたの隠し場所があなたが習得しようとしている追跡されていないファイルを含んでいる場合、gitは「追跡されていないファイルを隠し場所から復元できなかった」と不平を言います。この競合を解決するには、作業ツリーからそれらのファイルを削除し、次にgit stash pop
、git add .
、およびgit reset
を削除します。