2010-04-02 115 views
742

上下文:我正在为主人添加简单功能。几分钟后,我意识到它不是那么简单,而且应该更好地工作到一个新的分支。Git:从主机上未分期/未分配更改创建分支

这种情况一直发生在我身上,我不知道如何切换到另一个分支,并采取所有这些无法完成的更改,使主分支保持干净。我认为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/[email protected]{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") 

你知道是否有实现这个的方法吗?

+0

虽然有一个简单的解决方案,以你的问题,你能在你得到的结果是什么,从你想有什么不同规定? – Gauthier 2010-04-02 22:41:37

+1

通过执行上述操作或底部的答案,未完成的更改同时在主分支和新分支上。我只希望他们在新的分支,所以我可以签出主人并在另一件事上工作,而不会在 – knoopx 2010-04-02 22:56:18

+1

附近浮动这些更改。请参阅我编辑的答案。如果您想签出干净的主文件,则需要在新分支上提交本地更改。本地更改只是当前HEAD和磁盘上的文件之间的差异。本地文件上的这些更改没有版本化,如果您想稍后检索它们,则需要告诉git将它们保存在某处。 – Gauthier 2010-04-02 23:07:07

回答

884

无需藏匿。

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 

您应该checkout master后的第一次结账后获得M消息,但随后不再和git status不应有修改的文件。

---编辑澄清混淆工作目录(本地文件)---

在回答你的第一个评论,局部变化只是......嗯,当地。 Git不会自动保存它们,您必须告诉它以保存它们以备后用。 如果您进行了更改并且未明确提交或存储它们,git将不会对它们进行版本化。如果更改HEAD(checkout master),则本地更改不会被覆盖,因为未保存。

+0

这就是我总是这样做的。它的工作原理就是你想要的。 – synic 2010-04-02 22:28:45

+0

老兄,我错过了这个重要的一点。我想我明白了为什么会发生这种情况,以及为什么git显然不能忽视这些变化(如果我没有首先提出这些变化)。谢谢:D – knoopx 2010-04-02 23:19:52

+22

这里令人困惑的是,git的手册页声明'git checkout'“更新工作树中的文件以匹配索引或指定树中的版本。”这假定你的文件系统中的变化将在之后变成* GONE *。没有任何机会让他们回来。 即使你说他们不会,这仍然留下一个非常糟糕的感觉。我根本不相信这*。 文档非常糟糕,或者git的默认行为非常危险。人们不应该相信一些“自动化”的启发式方法来检测在这种情况下你不想失去你的改变。 – Evi1M4chine 2013-08-14 16:48:40

46

尝试:

git stash 
git checkout -b new-branch 
git stash apply 
+5

这与仅仅通过自己做'git checkout -b new-branch'有何不同? – 2013-07-11 10:09:49

+0

我不认为这是答案最初的写法,但我可能是错的。不幸的是,由于我的工作环境,过去几年我一直在使用perforce,所以我现在无法证明它的准确性。 – 2013-07-12 04:07:25

+2

或者不是最后两个步骤:git stash branch new-branch – rethab 2014-07-09 05:26:24

12

两件事情可以做:

git stash -u 
git branch sillyname [email protected]{0} 

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

git stash -u < - 在-u意味着它也需要不分阶段的变化)

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

4

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

enter image description here

+0

,它在创建新分支之前存储了更改,因此不会保留它们(Mac OS上的版本223) – 2017-07-03 13:11:34