1. ホーム
  2. git

[解決済み] Git master の未段階/未コミットの変更からブランチを作成する

2022-03-17 10:17:20

質問

コンテキスト マスターで簡単な機能を追加する作業をしています。数分後、それはそれほど単純ではなく、新しいブランチに作業する方がよかったと気づきました。

このようなことがいつも起こるのですが、別のブランチに切り替えて、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")

これを実現する方法はないのでしょうか?

どのように解決するのですか?

ためる必要がない。

アップデート2020 / Git 2.23


Git 2.23では、新たに switch サブコマンドの過剰な使用によって引き起こされる混乱を解消するための試みである。 checkout (ブランチの切り替え、ファイルのリストア、HEADのデタッチなど)

このバージョンの Git からは git checkout というコマンドを以下に示します。

git switch -c <new-branch>

動作は変わりません。

Update 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

あなたの変更はコミットされなかったので、あなたはそれらを失うことになります。

自分のブランチに戻り、変更をコミットして、再度masterをチェックアウトしてみてください。

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

を取得する必要があります。 M というメッセージは最初のチェックアウトの後に表示されますが、その後 checkout mastergit status は、変更されたファイルがないことを示すはずです。

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

最初のコメントに対する答えですが、ローカルの変更はあくまでローカルです。Gitは自動的に保存しないので、後で保存するように指示しなければなりません。 変更を加えても、明示的にコミットしたり保存したりしなかった場合、git はそれをバージョン管理しません。HEAD を変更した場合 ( checkout master ) の場合、ローカルでの変更は未保存なので上書きされません。