上下文:我正在为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")
你知道有没有办法实现这个目标?
答案 0 :(得分:1064)
无需藏匿。
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
您应该在第一次结帐后收到M
消息,但在checkout master
之后不再显示,git status
应该没有显示已修改的文件。
---编辑以清除工作目录(本地文件)---
的混淆在回答您的第一条评论时,当地的变化只是......好吧,本地的。 Git不会自动保存它们,您必须告诉它以便以后保存它们。
如果您进行更改并且未显式提交或存储它们,则git不会对它们进行版本控制。如果更改HEAD(checkout master
),则自未保存后不会覆盖本地更改。
答案 1 :(得分:57)
尝试:
git stash
git checkout -b new-branch
git stash apply
答案 2 :(得分:19)
你可以做两件事:
git checkout -b sillyname
git commit -am "silly message"
git checkout -
或
git stash -u
git branch sillyname stash@{0}
(git checkout -
&lt; - 破折号是您上一个分行的快捷方式)
(git stash -u
&lt; - -u
表示它也会进行非分段更改
答案 3 :(得分:5)
如果您正在使用GitHub Windows客户端(就像我一样)并且您正在进行未提交的更改,而您希望将其移至新分支,则可以通过GitHub客户端简单地“创建新分支” 。它将切换到新创建的分支并保留您的更改。
答案 4 :(得分:5)
如果您希望当前分支上的当前未提交更改移至新分支,请使用以下命令创建一个新分支并自动复制未提交的更改。
git checkout -b branch_name
这将从您当前的分支创建一个新分支(假设它是主分支),复制未提交的更改并切换到新分支。
添加文件以暂存并将更改提交到新分支。
git add .
git commit -m "First commit"
由于创建了新分支,因此在将其推送到远程之前,需要设置上游。使用以下命令设置上游并将其推送到远程。
git push --set-upstream origin feature/feature/NEWBRANCH
点击此命令后,将在远程创建一个新分支,并将新的本地分支推送到远程。
现在,如果您想放弃master分支中未提交的更改,请使用:
git checkout master -f
这将丢弃结帐时所有未提交的本地更改。
答案 5 :(得分:0)