背景: 私はマスターに簡単な機能を追加する作業をしています。数分後、それほど簡単ではなく、新しいブランチで作業した方がよかったことに気付きました。
これはいつも起こることですが、別のブランチに切り替えて、コミットされていない変更をすべて取得し、マスター ブランチをクリーンなままにする方法がわかりません。git stash && git stash branch new_branch
単純にそれを達成できるはずでしたが、次のような結果になりました。
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ echo "hello!" > testing
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)
~/test $ git s
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git checkout master
M testing
Switched to branch 'master'
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
これを実現する方法があるかどうかご存知ですか?
ベストアンサー1
隠す必要はありません。
2020年アップデート / Git 2.23
Git 2.23 では、 (ブランチの切り替え、ファイルの復元、HEAD のデタッチなど)switch
の過度の使用によって生じる混乱の一部を解消するために、新しいサブコマンドが追加されました。checkout
このバージョンの Git から、git checkout
以下のコマンドを次のように置き換えます。
git switch -c <new-branch>
動作は変更されません。
2020年アップデート前 / Git 2.23
git checkout -b new_branch_name
ローカルの変更には影響しません。現在の HEAD からブランチを作成し、そこに HEAD を設定するだけです。これが必要なことだと思います。
--- チェックアウトマスターの結果を説明するために編集 ---
checkout master
変更が破棄されないので混乱していますか?
変更はローカルのみなので、git は変更が簡単に失われないようにします。ブランチを変更しても、git はローカルの変更を上書きしません。結果は次のようにcheckout master
なります。
M testing
これは、作業ファイルがクリーンではないことを意味します。git は HEAD を変更しましたが、ローカル ファイルを上書きしませんでした。そのため、 にいるにもかかわらず、最後のステータスにローカルの変更がまだ表示されていますmaster
。
ローカルの変更を本当に破棄したい場合は、 を使用してチェックアウトを強制する必要があります-f
。
git checkout master -f
変更はコミットされていないため、失われます。
ブランチに戻って変更をコミットし、マスターを再度チェックアウトしてみてください。
git checkout new_branch
git commit -a -m"edited"
git checkout master
git status
最初のチェックアウト後にはメッセージが表示されるはずですM
が、 以降はメッセージが表示されなくなりcheckout master
、git status
変更されたファイルは表示されなくなります。
--- 作業ディレクトリ (ローカル ファイル) に関する混乱を解消するために編集 ---
最初のコメントへの回答ですが、ローカルの変更は、まさにローカルです。Git はそれらを自動的に保存しないので、後で保存するように指示する必要があります。変更を加えて明示的にコミットまたはスタッシュしない場合、Git はそれらをバージョン管理しません。HEAD ( checkout master
) を変更した場合、ローカルの変更は保存されていないため上書きされません。