Git错误提交...未推送,但无法重置或还原

i7uaboj4  于 2023-06-28  发布在  Git
关注(0)|答案(2)|浏览(196)

我显然搞砸了,想把这作为一个学习的经验。
自从上次推送以来,我已经修改了很多代码(我知道这是一个糟糕的做法,我也学到了很多),但这就是我现在的情况。我尝试分组提交,而不是一次提交所有内容。所以我提交了第一个代码文件/工作单元,这很好。当我做第二个的时候,我忘了表演。已输入我的消息并提交(哎呀!每一次修改都是这一次提交的一部分!)。在第二次提交时进行了恢复,但我的本地代码没有恢复到提交之前的状态。
我看了看这里然后重置到第一次成功提交...但其他文件中的更改仍然全部丢失。
尝试重置为HEAD~1,如此处所述,但对所有文件的更改仍未显示。
有没有办法让整个解决方案(所有的更改)回到这个问题之前的位置???
更新...我只是做了一个重置到第二次提交(一个与一切),它得到了我的代码回来...我可能只是把它吸起来,把所有的文件放在一个提交中(反正我是唯一的开发人员),但我不喜欢这样做(强迫症!)

tzdcorbm

tzdcorbm1#

假设你的历史现在看起来是这样的

* FFF crap 3 (some-branch -> HEAD)
* EEE crap 2
* DDD crap 1
* CCC second commit with everything else instead of broken pieces
* BBB first commit
* AAA last commit in another branch

然后你可以这样做:

git reset --hard CCC # go back to the commit where you committed everything. Use with care. any uncommitted things in your working tree will be wiped

现在是这样的:

* CCC second commit with everything else instead of broken pieces (some-branch -> HEAD)
* BBB first commit
* AAA last commit in another branch

现在这样做:

git reset --soft @~
git reset .

现在是这样的

* BBB first commit  (some-branch -> HEAD)
* AAA last commit in another branch

你在CCC中所做的一切都将在你的工作树周围准备好,就像CCC根本没有发生一样。
现在,作为我的最后一个技巧,去看看如何使用git reset --softgit commit --amend,因为它们是主要的时间(和生命)节省者。

z9gpfhce

z9gpfhce2#

我在这里的第一个建议是不要急于使用有害的命令,特别是从一开始就使用reset --hard。在Git中,真正可以释放数据的情况非常罕见,但似乎大多数人在努力实现给定目标时都会直接关注它们。
当你忘记在最后一次提交中添加内容时(经常发生),只需添加此内容,然后使用git commit --amend。这允许您修改此提交,这实际上会将您带回到编辑时,其中包含更新的索引和您记录的最后一条消息。这使您能够修改此消息和/或提交的内容。Git在这里实际上做的是生成另一个提交来替换前一个。
如果你在之前的提交中忘记了一些东西,这不是到目前为止,但也不是最后一次,最简单的方法是使用rebase -i命令,与squash选项相关联。

备注rebase -i可能经常会被理解为重写一个分支。不完全是这样就像常规的变基一样,* 交互式 * 变基应该将分支“变基”到另一个起点,但是-i提供的工具非常有用,开发人员经常“变基到同一个地方”,只是为了利用这些副作用。

因此,为了重建包含您错过的内容的历史记录,您只需要:

  • 在你的分支上提交你需要包含到一个专门的提交中的东西,命名为“omitted stuff”或其他东西;
  • 使用git tag imessedituphere,这样如果这个过程失败了,你可以很容易地回到这一点;
  • 使用git status验证存储库是否干净;
  • git rebase -i <some commit id on the branch before things went wrong>;
  • 让Git按照历史顺序为您呈现这些提交的列表;
  • 如果需要的话,重新排列这些行,这样你的提交也会如此;
  • 移动列表中的最后一个row(省略了stuff),将其插入到引用提交的行之后,该提交应该包含该stuff;
  • 将此行旁边的edit关键字(省略了stuff)替换为squash;
  • 保存并退出编辑器以开始该过程。

squash实际上会将你的提交与前一个提交合并,其作用方式与--amend大致相同。然后你会进入一个编辑器页面,它会同时显示原始提交的消息和压缩后的消息,连接起来,这将允许你只保留真正相关的内容(你甚至可以利用这一步来执行额外的修改,但我们现在先把这一点放在一边)。

相关问题