11

我正在分支A上工作,但功能/任务尚未完成。然后我需要切换到另一个分支B进行快速修复。当我尝试打开另一个分支时,Git 会强制我保存本地更改,否则我将丢失所有本地更改。

我需要提交我不完整的代码。有什么方法可以在多个分支之间切换而不会提交和丢失任何代码?或者有没有更好的方法来处理这种情况?

4

3 回答 3

16

正如mipadi 所展示的,一种选择是简单地使用git stash.

另一种选择是简单地提交您当前正在进行的工作,切换分支,然后当您准备好切换回来时,将混合重置回您之前的提交:

# While working on "feature" branch,
# you suddenly need to go work on a hotfix:
$ git commit --all --message "Backup my feature work"
$ git checkout -b hotfix master

# You did your hotfix, and are ready to go back to feature
$ git checkout feature
$ git reset HEAD^

git reset HEAD^将在您进行备份提交之前对提交进行混合重置,并且您在备份提交中所做的所有更改都将恢复到您的工作副本。来自(强调我的)的官方 Linux 内核文档:git reset

重置索引但不重置工作树(即保留更改的文件但未标记为提交)并报告尚未更新的内容。这是默认操作。

于 2013-08-06T06:52:31.733 回答
12

您可以使用git stash,这将在不创建提交的情况下保存您的更改。1

首先,隐藏您的更改:

$ git stash

然后切换到您的另一个分支:

$ git checkout branch-B

当你阅读时,回到你原来的分支并取消你的更改:

$ git checkout branch-A
$ git stash pop

有关其他用例的更多详细信息和细节,请参阅上面链接的文档。


1从技术上讲,它确实创建了一个提交,但git stash使用了一些魔法,因此您实际上看不到提交,而且 Git 的工具知道如何正确处理这些伪提交。

于 2013-08-06T06:35:18.177 回答
0

我知道这个问题很老,我只想分享一种可以帮助您处理这种情况的技术。您实际上可以将其提交到分支并稍后撤消它。

1. 提交到分支。(仅提交。不要推动。)

$ git commit --all --message "Commit Message here."

2. 如果您想继续在分支上工作,只需签出并撤消您的最后一次提交,而不会丢失您的最新更改。

$ git reset --soft HEAD~1

请注意 --soft 标志:这可确保保留未完成的修订中的更改。运行命令后,您会在工作副本中发现更改为未提交的本地修改。

你可以在这里阅读更多。

于 2019-12-18T11:04:37.993 回答