我们意外地将sha XXX更改为分支A而不是B.
A: VVV-WWW-XXX
B: VVV-WWW
因此我们将按照guidance on SO将提交从A移动到B:
git checkout B
git merge A
git checkout A
git reset --hard HEAD~1
git push --force
这会让我们:
A: VVV-WWW
B: VVV-WWW-XXX
如果我们在分支A上提交YYY给我们:
A: VVV-WWW-YYY
B: VVV-WWW-XXX
将其合并到B中会将YYY干净地合并到B中,而不在B上还原XXX,因为之前的XXX是reset --hard
的事实?合并后我们想要的是:
A: VVV-WWW-YYY
B: VVV-WWW-XXX-YYY
我正在努力解决reset --hard
对合并行为的影响。我认为重置会擦除提交的任何历史记录,因此合并只会在不尝试从B中删除XXX的情况下工作。
答案 0 :(得分:4)
合并的结果将是
(A)
VVV --- WWW --- YYY
\ \ (B)
--- XXX --- ZZZ
ZZZ是父母为XXX和YYY的合并提交。括号中的单个字母代表引用或分支名称,它们只是历史图表中的路标。
使用git lola
(git log --graph --decorate --pretty=oneline --abbrev-commit --all
)的便捷别名
* 78d2930 (HEAD -> B) ZZZ
|\
| * 549c09e (A) YYY
* | f585976 XXX
|/
* 537d898 WWW
* 875611c VVV
我使用上面的提交消息来绑定您问题中的历史记录。您的SHA-1对象名称将与上述名称不同。
不要过度思考它。请记住,git存储树状态的快照,历史谱系来自提交对象。使用清晰工具git reset --hard
可以删除历史记录,就好像它从未发生过没有留下任何痕迹一样。
像任何锋利的工具一样,如果你不小心,git reset --hard
会削减你。考虑一下rm -rf
。
答案 1 :(得分:2)
reset
只是将HEAD /分支指针移动到另一个提交。它对存储库或任何未来的操作都没有任何影响。
你是正确的,因为未来的合并将完全相同,无论你是否提交了重置的提交。