GIT tree在不知情的情况下修改了&x2014;需要重新排序/清理

GIT tree在不知情的情况下修改了&x2014;需要重新排序/清理,git,Git,为了记录在案,我正在使用git用suite维护我的电子项目。我当前的项目有两个分支,rev-A和rev-B。我目前正在编写版本B。我最近注意到我在旧版本A中犯了错误(图表和PDF文件中的版本号错误),所以我修复了这两个文档,并使用git reset-hard和git commit-A--amend修改了更改 我做了两次这样的编辑,但我没有意识到我必须对这些更改采取的预防措施——我的意思是,我认为我把历史搞砸了,现在这棵树看起来不像我想要/期望的那样 下面是修改提交后树的外观(--dateorde

为了记录在案,我正在使用
git
用suite维护我的电子项目。我当前的项目有两个分支,rev-A和rev-B。我目前正在编写版本B。我最近注意到我在旧版本A中犯了错误(图表和PDF文件中的版本号错误),所以我修复了这两个文档,并使用
git reset-hard
git commit-A--amend
修改了更改

我做了两次这样的编辑,但我没有意识到我必须对这些更改采取的预防措施——我的意思是,我认为我把历史搞砸了,现在这棵树看起来不像我想要/期望的那样

下面是修改提交后树的外观(
--dateorder
给出相同的结果):

下面是我所做的所有提交的树(
--dateorder
给出了相同的结果):

使用
git diff
我可以注意到以下几点:

  • 提交b88eb617ba0df4没有显示任何更改,显然
    7ba0df4
    是多余的(它甚至是我想要删除的提交,因为它在消息中有一个输入错误)
  • 260eb6586d6072之间,我想保留后者
  • fe2246f35945e5之间,后者是我想要保留的
以下是我的分支:

$ git branch
  rev-A
* rev-B
除此之外,我不确定我是否理解这两棵树,尤其是分支名称出现的位置。我想要的是我提交的所有版本A都属于分支
rev-A
,所有版本B都属于
rev-B
。我怎样才能安全地重新整理那棵树

编辑:经过进一步分析,我推断commit
86d6072修订版A-较小的电容器占地面积(…)
在某个地方丢失了,而修订版B应该从中分叉,而不是
260eb65
。因此,我如何将其返回到
rev-A
分支并替换
260eb65

git reset--hard:
是一个非常致命的命令,因为它会丢弃所有未提交的更改,因此具有潜在的危险性。为了安全起见,在使用之前,您应该始终检查
git status-s
的输出是否干净(即为空)

尽管如此,它还是不容易理解,除非在遵循reflog命令之前,一定要使用
git reflog

git reflog、
参考日志或“reflogs”,记录 分支和其他引用已在本地存储库中更新

如果不将更改推送到远程源,可以做的一件事是。因此,是的,
git-rebase
将执行重新排序提交的技巧。重新排序最后两次提交的示例:

git rebase -i HEAD~2
对于更复杂的示例:

$ git shortlog
 (3):
      A
      B
      C
如果您想将B与C重新排序:

$ git rebase -i HEAD~2
pick 1f9133d B
pick 33f41be C
您只需将其重新排序为:

pick 33f41be C
pick 1f9133d B
完成写作后,请参阅简短日志:

$ git shortlog
 (3):
      A
      C
      B

无法在注释中编辑文本作为代码,这就是我发布新答案的原因

哦,是的,git rebase将实现重新排序提交的技巧。重新排序最近两次提交的示例,git rebase-i HEAD~2

$ git shortlog
 (3):
      A
      B
      C
If you want to reorder B with C:

$ git rebase -i HEAD~2
pick 1f9133d B
pick 33f41be C
You just re-order them to be:

pick 33f41be C
pick 1f9133d B
After your done writing, see the shortlog:

$ git shortlog
 (3):
      A
      C
      B

在尝试了两天多之后,我走了一条捷径:在tarball归档中备份了修订版a和B之后,我现在已经完全删除了我的GIT树(即
rm-rf.GIT
)。现在只有2个提交,而不是4-5个,但这很好,因为它只是一个本地存储库


真正的解决办法还没有找到,但我已经穷途末路了。我承认,与我所有不成功的尝试相比,我花更少的时间来放弃它并重新构建它,但我不能在它上花费更多的时间。

您重置并修改了哪些具体承诺?它们在你树上的什么地方?@没用,那是我迷路的地方。从我的bash历史记录中,我确实重置为
86d6072
并从那里进行修改,然后重置为
35945e5
并从那里进行修改。奇怪的是,这些提交包含了我需要保存的文档。对不起,我什么都不懂,不幸的是,我没有注意到更改ID。根据您的描述,
260eb65
86d6072
应该是兄弟,但您的图表显示新版本是旧版本的祖先。很难从你的描述中看出可能发生了什么,因为这简直是不可能的。也许您可以删除
--日期顺序
并将最后一个共同祖先包含在树中?@没用看起来
rev-A和
rev-B`之间的最后一个共同祖先是
260eb65
。我还发现无论我是否使用
--日期顺序
,都没有区别。谢谢你的提示。我只使用本地存储库。我还确保我已经提前提交了所有待定的更改,所以我没有丢失任何东西。嗯,我发现我的
头丢了
,但我可以用我最近的提交找到它,所以我恢复了它的位置,如果我可以这么说的话。我还从您的回复中猜测,我需要重新排列我的提交,对吗?«无法在注释中以代码形式编辑文本»啊,我可以帮助;-)。我现在合并了你的两个答案。你可以安全地删除这一个。我有一个“旧”GIT树的备份,所以可以继续尝试,以防万一。。。
$ git shortlog
 (3):
      A
      C
      B
$ git shortlog
 (3):
      A
      B
      C
If you want to reorder B with C:

$ git rebase -i HEAD~2
pick 1f9133d B
pick 33f41be C
You just re-order them to be:

pick 33f41be C
pick 1f9133d B
After your done writing, see the shortlog:

$ git shortlog
 (3):
      A
      C
      B