从意外切换到另一个分支中恢复未提交的Git更改

3

我有一个项目,在分支A中做了很多更改。我没有提交这些更改,因为我遵循的是只在代码处于工作状态时才提交的建议实践。

今天,我犯了一个愚蠢的错误,切换到另一个分支,忘记了存储或提交我的更改。

代码在PyCharm中打开,我没有单击PyCharm窗口将其放在焦点上,因为我知道它会监听更改并清除屏幕上的所有内容。我也没有回到分支A中,因为担心会造成更多的损失。

我刚才抹掉了大量的工作吗?我能通过Git或PyCharm的当前状态恢复其中任何部分吗?


2
git statusgit diff 分别表示什么? - eftshift0
2
欢迎来到SO,Amish。让我们强调一下,我之前只提交可运行的代码是因为这是建议做法,而不是为了羞辱你,而是为了向人们警示这种做法的后果。经常进行代码提交。 - Romain Valeri
@RomainValeri 谢谢你,罗曼。我现在明白了追随这种做法是多么愚蠢。我以前从未犯过这个错误,并且一直相信自己不会犯如此严重的错误。 - Amish
1
进一步解释@RomainValeri的评论:理解它的关键在于Git中完全可以(而且很容易)_重写现有历史记录。_这意味着可以绝对放心地进行微型提交,无论存在什么“错误”状态,然后在你满意结果时将它们全部“压缩”在一起,以产生一个或多个逻辑上原子化、美观且注释良好的提交。只要确保不要将这些“错误”的提交推送到应该是你正在工作的功能的“主线”分支(或整个项目)。 - kostix
1
@Amish 只是想补充一些内容:如果您不想在分支历史记录中添加大量无关紧要的提交(这可以说是您在此处遵循的建议的根源),那么就不要推送它们。在本地环境中经常提交,当您有一个工作状态、某个特定的里程碑时,然后花点时间(真的不需要太多)根据您的需求组织您的提交,然后推送所需的分支最终状态。 - Romain Valeri
显示剩余5条评论
2个回答

1
当你切换到另一个分支时,你的更改会被保留。你只需要切换回你的分支并提交或存储。
此外,如果你当前的更改与另一个分支发生了冲突,git 将拒绝切换分支。
你可以使用 "git status" 命令查看你当前的更改。
一些命令可能会删除你的工作,如 "git clean"、"git reset"、"git checkout --force mybranch" 和 "git checkout ."(注意点号),这个命令将丢弃工作树中的所有更改(由 git 跟踪的文件,例如通过添加 "git add" 跟踪的文件)。
总之:
执行 "git checkout MyBranch" 不会覆盖或删除你的更改。

根据您的回答,您表示使用 git checkout 将会清除更改。我特意使用了 git checkout BranchA,因为那是我学习切换分支的方式。这是否意味着我已经清除了我的更改? - Amish
哦,抱歉,我的意思是如果你使用 git checkout . 它会擦除你的更改。点很重要。我更新了我的答案。执行 git checkout mybranch 是可以的。 - Nitixx
答案应该重新表述,明确说明git checkout命令的这种形式。你所演示的是git checkout应用于工作树中的路径 - 因为点.表示工作树的根目录。 - kostix
“git checkout --force mybranch” 会清除本地更改。但据我所知,PyCharm的git客户端不会这样做。因此,OP应该是安全的。 - Adrian W
我编辑了我的回答,现在应该更清晰了。谢谢。 - Nitixx
如果我有合并冲突,并希望将其还原并切换到旧分支,该怎么办? - Fluqz

1
为了进一步解释 @Nitixx 的回答,根据 OP 的要求,让我们引用手册:
“git checkout ”
为了准备在 上工作,通过更新索引和工作树中的文件,并将 HEAD 指向该分支来切换到它。保留对工作树中文件的本地修改,以便可以将其提交到 。
(强调我的)。
所以,是的,除非您还明确地搞乱了受影响文件的内容,否则仅仅检出原始分支就会保留您的本地修改。

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