GIT树在意识不到修改后搞砸了 - 需要重新排序/清理

时间:2017-03-21 16:36:55

标签: git

为了记录,我使用git来维护我的电子项目gEDA套件。我当前的项目有两个分支, rev-A rev-B 。我目前正在修改B.我最近注意到我在旧版本A中出错(原理图和PDF文件中的版本号错误)所以我修复了两个文档并使用git reset -hard <ID>修改了更改git commit -a --amend

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

这是修改提交后树的样子(--date-order给出相同的结果):

$ git log --graph --all --oneline --decorate
* 35945e5 (rev-A) Revision A - Final product
| * aada926 (HEAD -> rev-B) Revision B - Updated BOM (...)
| * b88eb61 Revision B - Final product as ordered (...)
| * 0bda52b Revision B - Reduced to 25.4mm x 35mm
| * fe2246f Revision A - Final product
|/  
* 260eb65 Revision A - Smaller capacitor footprint (...)

这里有我做过的所有提交的树(--date-order给出相同的结果):

$ git log --reflog --graph --oneline --decorate
* 86d6072 Revision A - Smaller capacitor footprint (...)
* 35945e5 (rev-A) Revision A - Final product
| * aada926 (HEAD -> rev-B) Revision B - Updated BOM (...)
| * b88eb61 Revision B - Final product as ordered (...)
| | * 7ba0df4 Revision B - Final product as order (...)
| |/  
| * 0bda52b Revision B - Reduced to 25.4mm x 35mm
| * fe2246f Revision A - Final product
|/  
* 260eb65 Revision A - Smaller capacitor footprint (...)

git diff我可以注意到以下内容:

  • 提交 b88eb61 并且 7ba0df4 显示没有变化,显然7ba0df4是多余的(它甚至是我想要摆脱的一个提交,因为它在消息中有拼写错误)
  • 260eb65 86d6072 之间,后者是我想保留的
  • fe2246f 35945e5 之间,后者是我想保留的

这是我的分支机构:

$ git branch
  rev-A
* rev-B

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

编辑:经过进一步分析后,我推断提交86d6072 Revision A - Smaller capacitor footprint (...)在某个地方丢失了,而它应该是修订版B应该分叉而不是260eb65。那么我怎样才能将它重新放回rev-A分支并替换260eb65

3 个答案:

答案 0 :(得分:0)

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

除非直到遵循reflog命令,否则使用git reflog

仍然不容易理解
  

git reflog,参考日志,或&#34; reflogs&#34;,记录时的提示   分支和其他引用已在本地存储库中更新。

如果您没有将更改推送到远程来源,则可以做的一件事是squash the redundant commits。所以,是的,git rebase将执行重新排序提交的技巧。重新排序最后两次提交的示例:

git rebase -i HEAD~2

更复杂的例子:

$ git shortlog
 (3):
      A
      B
      C

如果您想用C重新排序B:

$ git rebase -i HEAD~2
pick 1f9133d B
pick 33f41be C

您只需将它们重新排序为:

pick 33f41be C
pick 1f9133d B

完成写作后,请参阅短信:

$ git shortlog
 (3):
      A
      C
      B

答案 1 :(得分:0)

无法将文字编辑为评论中的代码,这就是我发布新答案的原因。

哦,是的,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

答案 2 :(得分:0)

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

真正的解决方案仍有待找到,但我正处于一个菜鸟的尽头。让我花费更少的时间来废弃它并重新构建它,而不是我所有的不成功的尝试去理解该做什么,我承认,但我不能花更多的时间在它上面。