关于git stash:Git:从master上的非分段/未提交的更改创建分支

Git: Create a branch from unstaged/uncommitted changes on master

上下文:我正在研究master添加一个简单的特性。几分钟后,我意识到这并不是那么简单,应该更好地发展成一个新的分支。

这种情况总是发生在我身上,我不知道如何切换到另一个分支,并在主分支保持干净的情况下接受所有这些未被限制的更改。我本以为git stash && git stash branch new_branch可以简单地做到这一点,但这就是我所得到的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
~/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")

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


不需要藏起来。

1
git checkout -b new_branch_name

不会影响您的本地更改。它只是从当前头部创建分支,并将头部设置在那里。所以我想这就是你想要的。

---编辑以解释签出主机的结果---

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

因为这些更改只是本地的,所以Git不希望您太容易丢失它们。更改分支后,Git不会覆盖本地更改。您的checkout master的结果是:

1
M   testing

,这意味着您的工作文件不干净。Git确实更改了头部,但没有覆盖本地文件。这就是为什么你的最后一个状态仍然显示你的本地变化,尽管你在master上。

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

1
git checkout master -f

因为您的更改从未提交,所以您将丢失它们。

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

1
2
3
4
git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

您应该在第一次签出之后收到一条M消息,但在checkout master之后就不会再收到,并且git status不应该显示任何修改过的文件。

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

作为对您第一条评论的回应,本地更改只是…嗯,本地的。Git不会自动保存它们,您必须告诉它以后保存它们。如果您进行了更改,并且没有显式地提交或存储它们,Git将不会对它们进行版本化。如果更改head(checkout master),则不会覆盖本地更改,因为未保存。


尝试:

1
2
3
git stash
git checkout -b new-branch
git stash apply


你可以做两件事:

1
2
3
git checkout -b sillyname
git commit -am"silly message"
git checkout -

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

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

(git stash -u<---u意味着它也会发生未老化的变化)


如果您使用的是Github Windows客户端(和我一样),并且您正处于希望移动到新分支的未提交更改的情况下,您可以通过Github客户端"装入新分支"。它将切换到新创建的分支并保留您的更改。

enter image description here