协慌网

登录 贡献 社区

Git:从 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 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_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表示它也会进行非分段更改)