git - Git: 来自撤回的/ 未提交的变更创建一个分支

  显示原文与译文双语对照的内容

上下文:我正在研究添加一个简单特性。 几分钟后我才意识到它并不是这么简单,它应该是更好的工作进入一个新的分支。

这总是发生在我身上,我不知道如何 switch 到另一个分支,并采取所有这些uncommited变化与我离开主分支干净。 我觉得 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

不触摸你的本地更改。 它只是从当前头部创建分支并设置头部。 所以我想这就是你想要的。

---编辑解释的结果检验主 ---

你是否感到困惑,因为 checkout master 不放弃你的更改?

由于这些更改只是本地的,所以git不希望你轻易丢失它们。 更改分支后,git不会覆盖你的本地更改。 你的checkout master的结果是:


M testing

这意味着你的工作文件不干净。 git确实改变了头部,但没有覆盖你的本地文件。 这就是为什么你的最后一个状态仍然显示你的本地更改,尽管你在 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 ),则本地更改不会被覆盖,因为未保存。

...