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

kno*_*opx 949 git git-stash

上下文:我正在为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")
Run Code Online (Sandbox Code Playgroud)

你知道有没有办法实现这个目标?

Gau*_*ier 1145

不需要藏匿.

git checkout -b new_branch_name
Run Code Online (Sandbox Code Playgroud)

不会触及您当地的更改.它只是从当前HEAD创建分支并在那里设置HEAD.所以我想这就是你想要的.

---编辑解释结账大师的结果---

您是否感到困惑,因为checkout master不会丢弃您的更改?

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

M   testing
Run Code Online (Sandbox Code Playgroud)

,这意味着您的工作文件不干净.git确实改变了HEAD,但没有覆盖你的本地文件.这就是为什么你的上一次状态仍会显示你当地的变化,尽管你已经开始了master.

如果您确实要放弃本地更改,则必须强制结帐-f.

git checkout master -f
Run Code Online (Sandbox Code Playgroud)

由于您的更改从未提交过,因此您将失去它们.

尝试返回到您的分支,提交更改,然后再次检出主服务器.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status
Run Code Online (Sandbox Code Playgroud)

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

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

在回答您的第一条评论时,本地变化只是......好吧,本地.Git不会自动保存它们,您必须告诉它以便以后保存它们.如果您进行更改并且未显式提交或存储它们,则git不会对它们进行版本控制.如果更改HEAD(checkout master),则自未保存后不会覆盖本地更改.

  • 令人困惑的是,git的手册页指出`git checkout`"更新工作树中的文件以匹配索引或指定树中的版本." 假设您之后对文件系统的更改将为*GONE*.没有任何机会让他们回来.即使你说他们不会,这仍然会留下非常糟糕的感觉.我根本不相信*.文档非常糟糕,或者git的默认行为非常危险.人们不应该相信一些"自动"启发式检测,在这种情况下,您不想丢失您的更改. (27认同)
  • 如果您正在检查将覆盖本地更改的提交(如果当前提交和目标提交之间的历史记录接触到您本地修改的文件),git将拒绝.只有当`checkout`与您的本地更改不冲突时,结帐才会起作用并且仅保留本地更改.我确实理解这种不好的感觉,手册页应该说"更新工作树中未修改的文件".另一方面,Git不会轻易失去本地变化.`git checkout`要么单独进行本地更改,要么在发生冲突时拒绝. (13认同)
  • @Alex`git checkout <other_branch> -f`.您将在没有警告的情况下丢失本地更改. (5认同)
  • @Evi1M4chine 第一个。文档 _is_ 真的很糟糕。 (3认同)

Gra*_*erg 57

尝试:

git stash
git checkout -b new-branch
git stash apply
Run Code Online (Sandbox Code Playgroud)

  • 这与仅仅执行'git checkout -b new-branch'不同吗? (6认同)
  • 或者代替最后两个步骤:git stash branch new-branch (5认同)

Pyl*_*nux 21

你可以做两件事:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 
Run Code Online (Sandbox Code Playgroud)

要么

git stash -u
git branch sillyname stash@{0}
Run Code Online (Sandbox Code Playgroud)

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

(git stash -u< - -u表示它也会进行非分段更改)


Mav*_*ick 15

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

git checkout -b branch_name
Run Code Online (Sandbox Code Playgroud)

这将从您当前的分支(假设它是主分支)创建一个新分支,复制未提交的更改并切换到新分支。

将文件添加到阶段并将您的更改提交到新分支。

git add .
git commit -m "First commit"
Run Code Online (Sandbox Code Playgroud)

由于创建了一个新分支,因此在将其推送到远程之前,您需要设置上游。使用以下命令设置上游并将其推送到远程。

git push --set-upstream origin feature/feature/NEWBRANCH
Run Code Online (Sandbox Code Playgroud)

一旦你点击这个命令,一个新的分支将在远程创建,你的新本地分支将被推送到远程。

现在,如果您想从 master 分支中丢弃未提交的更改,请使用:

git checkout master -f
Run Code Online (Sandbox Code Playgroud)

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

  • 尽管与已接受的答案有一些重叠,但这提供了一个简单的分步指南,并且还包括远程推送新分支所需的操作。简单、清晰且有用。 (3认同)

Tod*_*all 7

如果您正在使用GitHub Windows客户端(就像我一样)并且您正在进行未提交的更改,而您希望将其移至新分支,则可以通过GitHub客户端简单地"创建新分支".它将切换到新创建的分支并保留您的更改.

在此输入图像描述