[英]Git: Create a branch from unstaged/uncommitted changes on master
上下文:我正在为 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")
你知道是否有任何方法可以实现这一点?
没必要藏起来。
Git 2.23 增加了新的switch
子命令,试图清除checkout
使用过载(切换分支、恢复文件、分离 HEAD 等)导致的一些混乱。
从此版本的 Git 开始,将下面的git checkout
命令替换为:
git switch -c <new-branch>
行为保持不变。
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
),则本地更改不会因为未保存而被覆盖。
尝试:
git stash
git checkout -b new-branch
git stash apply
你可以做两件事:
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
意味着它也需要进行未分阶段的更改)
如果您希望当前分支上当前未提交的更改移动到新分支,请使用以下命令创建新分支并自动复制未提交的更改。
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
这将在结帐时丢弃任何未提交的本地更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.