1146

コンテキスト: 私は単純な機能を追加するマスターに取り組んでいます。数分後、それはそれほど単純ではなく、新しいブランチで作業する方が良いはずであることに気付きました。

これは常に私に起こり、別のブランチに切り替えて、これらのコミットされていない変更をすべてマスターブランチをクリーンなままにする方法がわかりません。私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")

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

4

6 に答える 6

1381

隠しておく必要はありません。

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

于 2010-04-02T22:25:50.050 に答える
73

試す:

git stash
git checkout -b new-branch
git stash apply
于 2010-04-02T22:15:12.097 に答える
26

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

于 2016-01-13T21:38:46.597 に答える