Git: Create a branch from unstaged/uncommitted changes on master
上下文:我正在研究master添加一个简单的特性。几分钟后,我意识到这并不是那么简单,应该更好地发展成一个新的分支。
这种情况总是发生在我身上,我不知道如何切换到另一个分支,并在主分支保持干净的情况下接受所有这些未被限制的更改。我本以为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | ~/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 | git checkout -b new_branch_name |
号
不会影响您的本地更改。它只是从当前头部创建分支,并将头部设置在那里。所以我想这就是你想要的。
---编辑以解释签出主机的结果---
您是否因为
因为这些更改只是本地的,所以Git不希望您太容易丢失它们。更改分支后,Git不会覆盖本地更改。您的
1 | M testing |
,这意味着您的工作文件不干净。Git确实更改了头部,但没有覆盖本地文件。这就是为什么你的最后一个状态仍然显示你的本地变化,尽管你在
如果您真的想放弃本地更改,那么必须使用
1 | git checkout master -f |
。
因为您的更改从未提交,所以您将丢失它们。
尝试返回到分支,提交更改,然后再次签出主服务器。
1 2 3 4 | git checkout new_branch git commit -a -m"edited" git checkout master git status |
您应该在第一次签出之后收到一条
---编辑以清除工作目录(本地文件)的混淆---
作为对您第一条评论的回应,本地更改只是…嗯,本地的。Git不会自动保存它们,您必须告诉它以后保存它们。如果您进行了更改,并且没有显式地提交或存储它们,Git将不会对它们进行版本化。如果更改head(
尝试:
1 2 3 | git stash git checkout -b new-branch git stash apply |
你可以做两件事:
1 2 3 | git checkout -b sillyname git commit -am"silly message" git checkout - |
。
或
1 2 | git stash -u git branch sillyname stash@{0} |
。
(
(
如果您使用的是Github Windows客户端(和我一样),并且您正处于希望移动到新分支的未提交更改的情况下,您可以通过Github客户端"装入新分支"。它将切换到新创建的分支并保留您的更改。
。