Git:从master上的unstaged / uncommitted更改创build一个分支

上下文:我正在为主添加一个简单的function。 几分钟后,我意识到这并不是那么简单,而应该更好地进入一个新的分支。

这一直发生在我身上,我不知道如何切换到另一个分支,并采取所有这些无情的变化与我离开主干分支干净。 我应该把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创build分支,并在那里设置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 

你可以做两件事:

 git stash -u git branch sillyname stash@{0} 

要么

 git checkout -b sillyname git commit -am "silly message" git checkout - 

git stash -u < – -u意味着它也需要未分类的更改)

git checkout - < – 破折号是前一个分支的捷径)

如果您正在使用GitHub Windows客户端(因为我是这样),并且您已经做出了未经许可的更改,而您希望移动到新的分支,则可以通过GitHub客户端简单地“创build新的分支”。 它将切换到新创build的分支并保留您的更改。

在这里输入图像说明