上下文:我正在master上添加一个简单的功能。几分钟后,我意识到事情并没有那么简单,应该在一个新的分支工作。
这总是发生在我身上,我不知道如何切换到另一个分支,并采取所有这些未承诺的变化与我离开主分支干净。我认为git stash && git stash分支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")
你知道有什么办法可以做到吗?
没必要藏东西。
更新2020 / Git 2.23
Git 2.23增加了新的switch子命令,试图清除由于checkout的重载使用(切换分支、恢复文件、分离HEAD等)而引起的一些混乱。
从这个版本的Git开始,将下面的Git checkout命令替换为:
git switch -c <new-branch>
行为保持不变。
在更新2020 / Git 2.23之前
git checkout -b new_branch_name
不会触及您的局部更改。它只是从当前HEAD创建分支,并将HEAD设置在那里。
我猜这就是你想要的。
——编辑以解释签出主的结果——
您是否因为签出主程序没有丢弃您的更改而感到困惑?
由于这些更改只是本地的,git不希望您太容易丢失它们。在更改分支时,git不会覆盖您的本地更改。您的签出主程序的结果是:
M testing
,这意味着你的工作文件不干净。git确实改变了HEAD,但没有覆盖您的本地文件。这就是为什么你的上一个状态仍然显示你的局部变化,尽管你是主。
如果您真的想放弃本地更改,则必须使用-f强制签出。
git checkout master -f
由于您的更改从未提交,您将失去它们。
尝试返回您的分支,提交您的更改,然后再次签出主系统。
git checkout new_branch
git commit -a -m"edited"
git checkout master
git status
您应该在第一次签出之后得到M消息,但在签出master之后就没有了,git状态应该显示没有修改过的文件。
编辑以澄清工作目录(本地文件)的混淆
关于你的第一个评论,局部变化只是…当地。Git不会自动保存它们,您必须告诉它保存它们以供以后使用。
如果你做了更改,并且没有显式地提交或保存它们,git将不会为它们设置版本。如果您更改HEAD(签出主),本地更改不会被覆盖,因为未保存。
如果希望将当前分支上当前未提交的更改移动到新分支,请使用以下命令创建新分支并自动复制未提交的更改。
git checkout -b branch_name
这将从当前分支创建一个新分支(假设它是master),复制未提交的更改并切换到新分支。
添加文件,将更改提交给新分支。
git add .
git commit -m "First commit"
由于创建了一个新分支,在将其推到远程之前,您需要设置上游。使用下面的命令设置上游并将其推到远程。
git push --set-upstream origin feature/feature/NEWBRANCH
一旦您点击这个命令,一个新的分支将在远程创建,新的本地分支将被推送到远程。
现在,如果你想从主分支中扔掉你未提交的变更,使用:
git checkout master -f
这将在签出时丢弃任何未提交的本地更改。
没必要藏东西。
更新2020 / Git 2.23
Git 2.23增加了新的switch子命令,试图清除由于checkout的重载使用(切换分支、恢复文件、分离HEAD等)而引起的一些混乱。
从这个版本的Git开始,将下面的Git checkout命令替换为:
git switch -c <new-branch>
行为保持不变。
在更新2020 / Git 2.23之前
git checkout -b new_branch_name
不会触及您的局部更改。它只是从当前HEAD创建分支,并将HEAD设置在那里。
我猜这就是你想要的。
——编辑以解释签出主的结果——
您是否因为签出主程序没有丢弃您的更改而感到困惑?
由于这些更改只是本地的,git不希望您太容易丢失它们。在更改分支时,git不会覆盖您的本地更改。您的签出主程序的结果是:
M testing
,这意味着你的工作文件不干净。git确实改变了HEAD,但没有覆盖您的本地文件。这就是为什么你的上一个状态仍然显示你的局部变化,尽管你是主。
如果您真的想放弃本地更改,则必须使用-f强制签出。
git checkout master -f
由于您的更改从未提交,您将失去它们。
尝试返回您的分支,提交您的更改,然后再次签出主系统。
git checkout new_branch
git commit -a -m"edited"
git checkout master
git status
您应该在第一次签出之后得到M消息,但在签出master之后就没有了,git状态应该显示没有修改过的文件。
编辑以澄清工作目录(本地文件)的混淆
关于你的第一个评论,局部变化只是…当地。Git不会自动保存它们,您必须告诉它保存它们以供以后使用。
如果你做了更改,并且没有显式地提交或保存它们,git将不会为它们设置版本。如果您更改HEAD(签出主),本地更改不会被覆盖,因为未保存。