web-dev-qa-db-ja.com

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

コンテキスト:私は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")

これを達成する方法があるかどうか知っていますか?

883
knoopx

隠蔽する必要はありません。

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)を変更しても、ローカルの変更は保存されていないので上書きされません。

1056
Gauthier

試してください:

git stash
git checkout -b new-branch
git stash apply
57
Grant Limberg

できることは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はステージされていない変更も受けることを意味します

18
Pylinux

GitHub Windowsクライアントを使用していて(私がそうであるように)、新しいブランチに移動したいという未確定の変更を行っている状況にある場合は、GitHubクライアントを介して単に「Crate a new branch」を実行できます。新しく作成されたブランチに切り替えて、変更を保存します。

enter image description here

5
Tod Birdsall

最新のWindows用GitHubクライアントでは、コミットされていない変更があり、新しいブランチを作成することを選択した場合、この正確なシナリオを処理する方法が求められます。

enter image description here

単にブランチを切り替える場合も同じです。

0
Jerry Dodge