为了记录,我使用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
我可以注意到以下内容:
7ba0df4
是多余的(它甚至是我想要摆脱的一个提交,因为它在消息中有拼写错误)这是我的分支机构:
$ git branch
rev-A
* rev-B
除此之外,我不确定我是否理解这两棵树,特别是关于分支名称出现的位置。我想要的是我的所有版本A 提交都属于分支rev-A
而所有版本B 属于rev-B
。我怎样才能安全地重新整理和整理那棵树?
编辑:经过进一步分析后,我推断提交86d6072 Revision A - Smaller capacitor footprint (...)
在某个地方丢失了,而它应该是修订版B应该分叉而不是260eb65
。那么我怎样才能将它重新放回rev-A
分支并替换260eb65
答案 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,但它很好,因为它只是一个本地存储库。
真正的解决方案仍有待找到,但我正处于一个菜鸟的尽头。让我花费更少的时间来废弃它并重新构建它,而不是我所有的不成功的尝试去理解该做什么,我承认,但我不能花更多的时间在它上面。