我有一个git分支,开始表现出无法进行甚至是微不足道的rebase回到某个时间点之前,声称许多提交已经消失了 - 在调试这个问题时,我发现了一个更简单的异常。
我从ID为367df61041c380b3e769177779cb7c8ab21630b4的提交开始,并且git日志看起来像:
如果我执行
但是现在,如果我第二次执行
我的怀疑之眼被引向提交a6818d5a2,它似乎包含了所有这些消失的更改。
这是怎么发生的?也许是从错误的基础分支或提交ID合并...但我们到底做错了什么?
让我自己处理,我会恢复到某个已知的好提交,然后逐个挑选提交,完全跳过合并。这不会很费力,但我觉得肯定有更好的方法。
以下是需要回答的问题:
1. 发生了什么?这是一个分支处于合理状态吗?我在使用git时犯了错误,还是有什么“损坏”? 2. 如果它被损坏了,我该如何修复它?我们如何改变我们的工作流程以避免再次破坏分支? 3. 如果没有损坏,我们该如何更改我们的git工作流程来处理这种情况?
我的答案是-禁止合并提交。
所有这些问题归结为一个问题——假设我有这些合并,如何在它们上面进行变基?
git log
给我一个完全一致的提交列表,我期望看到。如果我使用git reset --hard HEAD^
逐个向后移动提交,一切都按预期工作 - 直到突然间我只是回退了十几个提交,没有任何警告。我从ID为367df61041c380b3e769177779cb7c8ab21630b4的提交开始,并且git日志看起来像:
367df61 fixing flake8/syntax errors
14210b8 Merge remote-tracking branch 'origin/dev' into dev
a6818d5 Merge pull request #55 from rec/fast-gamma
e8ffdf2 Tweak exit manager code (fix #56). Please enter the commit message for your changes. Lines starting
d1c464c Tweak masterBrightness.
975de68 Re-enable timedata end-to-end.
bf7e918 Add optional timedata.Renderer to driver_base.py.
b4daff6 Simplify _render slightly.
a306798 Stop slicing colors and add an offset instead.
b379f21 Move generate_header into util.
e50ec8c Simplify frame rendering slightly.
12cfc2d Extract data and functions into return_codes.py
764e4b9 Convert LDP8806.py from DOS line endings to Unix.
d3dc333 Remove old gamma tables.
5ae2934 Simplify gamma.py; prove backward compatibility.
bae1cf4 Temporarily disable timedata and simplify rendering.
c436f19 showing timedata usage
5228261 updating colors.py for py3
如果我执行
git reset --hard HEAD^
一次,我会移动到14210b8 Merge remote-tracking branch 'origin/dev' into dev
,正如我所期望的那样,而且git log
与上述内容一致。但是现在,如果我第二次执行
git reset --hard HEAD^
,我会移动到c436f19 showing timedata usage
,接近上面列表的底部!a6818d5
和bae1cf4
之间的所有提交都消失了。我的怀疑之眼被引向提交a6818d5a2,它似乎包含了所有这些消失的更改。
这是怎么发生的?也许是从错误的基础分支或提交ID合并...但我们到底做错了什么?
让我自己处理,我会恢复到某个已知的好提交,然后逐个挑选提交,完全跳过合并。这不会很费力,但我觉得肯定有更好的方法。
以下是需要回答的问题:
1. 发生了什么?这是一个分支处于合理状态吗?我在使用git时犯了错误,还是有什么“损坏”? 2. 如果它被损坏了,我该如何修复它?我们如何改变我们的工作流程以避免再次破坏分支? 3. 如果没有损坏,我们该如何更改我们的git工作流程来处理这种情况?
我的答案是-禁止合并提交。
所有这些问题归结为一个问题——假设我有这些合并,如何在它们上面进行变基?
HEAD^
和HEAD^1
都是父提交#1,而HEAD^2
是父提交#2。如果您有一个章鱼合并(超过2个父提交),则继续使用HEAD^3
等。大多数工具很难观察到父提交的实际顺序(尽管一些图形查看器使用线条颜色:当通过合并时,相同的颜色表示“父提交#1”),但已经指定:第一个父提交是您进行合并时所在的分支(如git status
中所示,“在分支master上”)。 - torek