1146

上下文:我正在为 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")

你知道有没有办法做到这一点?

4

6 回答 6

1381

没必要藏起来。

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

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

尝试回到您的分支,提交您的更改,然后再次签出 master。

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

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

--- 编辑以消除对工作目录(本地文件)的混淆---

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

于 2010-04-02T22:25:50.050 回答
73

尝试:

git stash
git checkout -b new-branch
git stash apply
于 2010-04-02T22:15:12.097 回答
26

你可以做两件事:

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

或者

git stash -u
git branch sillyname stash@{0}

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

git stash -u<-- 这-u意味着它也需要非分阶段的更改)

于 2016-01-13T21:38:46.597 回答
21

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

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

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

于 2020-04-26T22:08:59.870 回答
7

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

在此处输入图像描述

于 2016-09-13T13:35:49.187 回答
2

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

在此处输入图像描述

如果您也简单地切换分支,这同样适用。

于 2019-08-10T18:11:31.697 回答