Git保留已暂存的更改

5
如何在不提交的情况下保留暂存更改并处理其他问题?我创建了一个名为b1的分支,进行了一些更改并将其暂存。现在我有一个紧急问题需要解决,但我在这里不需要已暂存的更改。因此,我切换到b2分支,并从上游获取和拉取。但是,b2分支仍然存在已暂存的更改。
3个回答

3
不要提交更改,而是将其存储起来。之后可以再次将其应用到你的工作副本中:
git stash
git checkout -b urgent-issue
git commit
git checkout -
git stash pop

3
请注意,git stash 命令会创建两个临时提交(它们都不在任何分支上):其中一个包含当前的索引,即包括您现在暂存的任何内容,另一个则包含当前的工作树,即包括您没有暂存的任何内容。当您要将 stash 恢复到原来的位置时,可以使用 git stash apply --indexgit stash pop --index 命令单独恢复已暂存和未暂存的状态。(我总是使用 apply 命令,因为我有一个拼错 --index 的习惯,而使用 apply 可以让我重试并使用正确的拼写)。 - torek
在这种方式下,您在暂存期间所做的任何选择都将丢失,您必须重新执行这些操作。 - john16384
1
如果您需要保留索引状态,可以使用 --keep-index 选项来指定。@john16384 - knittl

3

@knittl提供的另一种方法是实际上进行一个临时提交(请继续阅读):

git commit -m 'WIP'
git checkout urgent-issue

一旦你提交了你的工作,你的工作目录就会变得干净,你可以根据需要切换分支。当你想要返回到当前分支时,你可以继续工作并修改你所做的临时提交。

git checkout feature   # return to original branch
# work work ... complete the commit
git commit --amend -m 'Finished the work I started earlier'

当我需要进行关键性工作时,我通常更喜欢进行一次临时提交而不是使用stash命令。原因如下:首先,它省去了在stash堆栈中寻找要应用的stash的麻烦(让堆栈积累旧的垃圾很容易)。其次,因为我知道我的提交包含未完成的工作,所以它迫使我有条不紊地完成功能。


1
你也可以使用 git reset --soft HEAD^(保留已暂存的文件)或 git reset --mixed HEAD^(取消暂存)来回到之前的状态。使用 git stash 的优点是它会创建 两个 临时提交,这可能正是你想要的;请参考我即将添加到 knittl 回答中的评论。 - torek
@torek,我从你的评论中学到的比从答案中学到的更多。 - Tim Biegeleisen
1
顺便说一下,我通常更喜欢使用临时提交的方法,尽管在某些情况下我会使用 git stash。但是 git stash 有一个令人讨厌的 bug:如果您添加(暂存)了更改,然后使同一文件的工作树版本与该文件的 HEAD 版本匹配,则 git stash apply --index 会将错误的文件版本恢复到工作树中。我多年前在 Git 邮件列表上报告了这个 bug 并提出了修复方案,但没有人费心去修复它。 - torek
我对于 git stash 也有一种普遍的感觉,所以我倾向于避免使用它。另外,临时提交的一个好处是可以方便地与其他团队成员分享你可能拥有的部分工作。非常感谢您对这个问题提供的真正有价值的见解。 - Tim Biegeleisen

-1
# No need to stage
# put your current changes in stash
git stash

# create and checkout to b1 branch
git checkout -b b2

# resolve urgent issue and push changes 

# now get back to branch b1
git checkout b1

# Apply stashed changes back
git stash pop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接