如何在git中编辑之前的提交而不删除它前面的提交?

时间:2014-03-07 15:35:35

标签: git git-commit

我试图从之前的提交(而不是HEAD)进行分支,但是当我提交这些更改时,而不是将更改保留在分支中,它会使我的提交在HEAD中超过该点。我可以看到这可能有用,但我认为VC的目的是永远保留所有提交,以便你可以随时回到之前的状态。

如何编辑先前的提交并提交它而不删除主服务器上提交的提交?

谢谢!

编辑:

This is the image that lead me to believe my other changes had been deleted

这是让我相信其他更改已被删除的图片

Here are the hidden branches I thought had been deleted

以下是我认为已删除的隐藏分支。为什么gitk不显示其他分支(HEAD,master)

2 个答案:

答案 0 :(得分:4)

最有可能没有被删除。您可能已经创建了一个新的匿名分支。如果您签出master或您开始的任何分支,那么缺失的更改仍应存在。

尝试git log --all;它应该显示存储库中的所有提交。

有一些git命令可以破坏信息,但你可能还没有这样做,虽然很难确定你不知道你执行了什么命令。

答案 1 :(得分:3)

提交可能不会丢失。先做备份。检查你的分支,以及它们中的内容。如果你真的找不到任何分支的提交,你可能有兴趣了解reflog

如果您没有安装存储库浏览器(我喜欢tig),您可以使用如下命令检查存储库:git log --graph --all --oneline --decorate

  

如何编辑先前的提交并提交它而不删除主服务器上提交的提交?

如果要编辑的提交是先前的提交:

  • 进行所需的更改。
  • 如果您没有添加新文件,可以使用git add -u暂存更改。
  • 修改上一次提交,git commit --amend将执行此操作,如果您不想编辑提交消息,请添加-C HEAD

如果要编辑较旧的提交,则需要使用rebase。 这可以以交互方式完成:

  • 从您要编辑的任何分支开始,通常不会更改您的工作副本。
  • 在之前的提交中进行所需的更改。
  • 分阶段并提交这些更改 - 不要在这里写一个明智的提交消息。
  • 运行git rebase -i,这将打开一个编辑器:
    • 向上移动最后一行(使用无意义提交消息),直到它位于您要编辑的提交下方的行上。
    • 将该行开头的pick更改为f(用于修正)。
    • 不对文件进行其他更改
    • 保存并退出
  • Git应该修改您之前的提交以包含编辑,并尝试在顶部修改您的其他更改。

这将尝试将您的编辑应用于先前的提交,并在之前的提交和编辑之上重新定义所有后续更改。如果后期提交受编辑影响,则可能会出现合并冲突。 Git将提供有关如何解决这些问题的说明。如果您不理解它们,可以使用git rebase --abort返回到您开始的位置,编辑是最新的提交。

请注意,您不应编辑已推送到共享存储库的提交。这可能会造成很多混乱。