如何在不提交的情况下保留暂存更改并处理其他问题?我创建了一个名为b1的分支,进行了一些更改并将其暂存。现在我有一个紧急问题需要解决,但我在这里不需要已暂存的更改。因此,我切换到b2分支,并从上游获取和拉取。但是,b2分支仍然存在已暂存的更改。
git stash
git checkout -b urgent-issue
git commit
git checkout -
git stash pop
@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的麻烦(让堆栈积累旧的垃圾很容易)。其次,因为我知道我的提交包含未完成的工作,所以它迫使我有条不紊地完成功能。
git reset --soft HEAD^
(保留已暂存的文件)或 git reset --mixed HEAD^
(取消暂存)来回到之前的状态。使用 git stash
的优点是它会创建 两个 临时提交,这可能正是你想要的;请参考我即将添加到 knittl 回答中的评论。 - torekgit stash
。但是 git stash
有一个令人讨厌的 bug:如果您添加(暂存)了更改,然后使同一文件的工作树版本与该文件的 HEAD
版本匹配,则 git stash apply --index
会将错误的文件版本恢复到工作树中。我多年前在 Git 邮件列表上报告了这个 bug 并提出了修复方案,但没有人费心去修复它。 - torekgit stash
也有一种普遍的感觉,所以我倾向于避免使用它。另外,临时提交的一个好处是可以方便地与其他团队成员分享你可能拥有的部分工作。非常感谢您对这个问题提供的真正有价值的见解。 - Tim Biegeleisen# 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
git stash
命令会创建两个临时提交(它们都不在任何分支上):其中一个包含当前的索引,即包括您现在暂存的任何内容,另一个则包含当前的工作树,即包括您没有暂存的任何内容。当您要将stash
恢复到原来的位置时,可以使用git stash apply --index
或git stash pop --index
命令单独恢复已暂存和未暂存的状态。(我总是使用apply
命令,因为我有一个拼错--index
的习惯,而使用apply
可以让我重试并使用正确的拼写)。 - torek--keep-index
选项来指定。@john16384 - knittl