Git: マスター上のステージングされていない/コミットされていない変更からブランチを作成する 質問する

Git: マスター上のステージングされていない/コミットされていない変更からブランチを作成する 質問する

背景: 私はマスターに簡単な機能を追加する作業をしています。数分後、それほど簡単ではなく、新しいブランチで作業した方がよかったことに気付きました。

これはいつも起こることですが、別のブランチに切り替えて、コミットされていない変更をすべて取得し、マスター ブランチをクリーンなままにする方法がわかりません。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 mastergit status変更されたファイルは表示されなくなります。

--- 作業ディレクトリ (ローカル ファイル) に関する混乱を解消するために編集 ---

最初のコメントへの回答ですが、ローカルの変更は、まさにローカルです。Git はそれらを自動的に保存しないので、後で保存するように指示する必要があります。変更を加えて明示的にコミットまたはスタッシュしない場合、Git はそれらをバージョン管理しません。HEAD ( checkout master) を変更した場合、ローカルの変更は保存されていないため上書きされません。

おすすめ記事