コンテキスト:私はmasterに単純な機能を追加することに取り組んでいます。数分後、私はそれがそれほど単純ではなかったことに気づきました、そしてそれは新しいブランチに取り組むことがより良いはずです。
これはいつも私に起こります、そして私はマスターブランチをきれいにしたまま私と一緒に別のブランチに切り替えてそしてこれらすべてのコミットされていない変更を取る方法を知りません。私は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")
これを達成する方法があるかどうか知っていますか?
隠蔽する必要はありません。
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
)を変更しても、ローカルの変更は保存されていないので上書きされません。
試してください:
git stash
git checkout -b new-branch
git stash apply
できることは2つあります。
git checkout -b sillyname
git commit -am "silly message"
git checkout -
または
git stash -u
git branch sillyname stash@{0}
(git checkout -
< - ダッシュは前のブランチへのショートカットです)
(git stash -u
< - -u
はステージされていない変更も受けることを意味します