Git:从master上未暂存/未提交的更改创建分支

上下文:我正在使用master添加一个简单的功能。几分钟后,我意识到这并不是那么简单,应该更好地在一个新分支中工作。

这种情况总是发生在我身上,我不知道如何切换到另一个分支并将所有这些未提交的更改与我一起离开主分支干净。我以为git stash && git stash branch new_branch会简单地完成这一点,但这就是我得到的:

~/test $ git status# On branch masternothing 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 stashSaved working directory and index state WIP on master: 4402b8c testingHEAD is now at 4402b8c testing
~/test $ git status# On branch masternothing to commit (working directory clean)
~/test $ git stash branch new_branchSwitched 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 masterM   testingSwitched 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")

你知道有没有什么办法可以做到这一点吗?

417186 次浏览

尝试:

git stashgit checkout -b new-branchgit stash apply

不需要隐藏。

更新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设置在那里。我想这就是你想要的。

编辑以解释检查主机的结果

您是否因为checkout master没有放弃您的更改而感到困惑?

由于更改只是本地的,git不希望您太容易丢失它们。更改分支时,git不会覆盖您的本地更改。您的checkout master结果是:

M   testing

,这意味着您的工作文件不干净。git确实更改了HEAD,但没有覆盖您的本地文件。这就是为什么您的最后状态仍然显示您的本地更改,尽管您位于master

如果您真的想放弃本地更改,则必须使用-f强制签出。

git checkout master -f

由于您的更改从未提交,因此您会丢失它们。

尝试回到分支,提交更改,然后再次签出主服务器。

git checkout new_branchgit commit -a -m"edited"git checkout mastergit status

您应该在第一次结帐后收到M消息,但在checkout master之后不再收到,git status应该显示没有修改的文件。

---编辑以清除有关工作目录(本地文件)的混淆---

在回答你的第一条评论时,本地更改只是……嗯,本地。Git不会自动保存它们,你必须告诉它保存它们以供以后使用。如果您进行更改但没有显式提交或存储它们,git将不会对它们进行版本控制。如果您更改HEAD(checkout master),则本地更改不会被覆盖,因为未保存。

你可以做两件事:

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

git stash -ugit branch sillyname stash@{0}

git checkout -<--破折号是上一个分支的快捷方式)

git stash -u<---u表示它也接受未暂存的更改)

如果您使用的是GitHub Windows客户端(就像我一样),并且您遇到了希望移动到新分支的未提交更改的情况,您可以通过GitHub客户端简单地“创建一个新分支”。它将切换到新创建的分支并保留您的更改。

在此处输入图片描述

windows的最新github客户端中,如果您有未提交的更改,请选择创建一个新分支。
它会提示您如何处理这种确切的情况:

在此处输入图片描述

如果你只是简单地切换分支也是如此。

如果您希望当前分支上当前未提交的更改移动到新分支,请使用以下命令创建一个新分支并自动复制未提交的更改。

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

这将在结帐时丢弃任何未提交的本地更改。