代码之家  ›  专栏  ›  技术社区  ›  matt

git commit,如何将一个commit分解为两个commit

git
  •  -2
  • matt  · 技术社区  · 6 年前

    在分公司工作 临时雇员 ,我创建了一个新的分支, TUNM2 . 我重排了一个文件,然后做了一些清理。我答应了。

    后来我突然想到,如果我重新安排,承诺,然后清理,然后承诺,我会有一个更清晰的历史。

    换句话说,我只想将这个提交分为两个阶段,两个提交。

    嗯,我记得重排部分。所以我换了分支机构 临时雇员 在没有清理的情况下,重新安排了工作。我的想法是我可以从 TUNM2 在温度上。

    我所拥有的:

    ------ before ----- rearrangement <-- temp
                  \
                   \ 
                    \
                     ------- rearrangement plus cleanup <-- temp2
    

    我想要什么:

    ------ before ----- rearrangement ----- rearrangement plus cleanup <-- temp
    

    首先我尝试重新平衡 TUNM2 到上面 临时雇员 但是我有合并冲突。这让我很惊讶,因为没有要求合并任何内容。我认为重新平衡只是在附加了一个承诺的地方发生了变化。所以我放弃了。

    然后我试着从 TUNM2 进入之内 临时雇员 . 但我 仍然 发生合并冲突。那 真的? 我很惊讶,因为我认为这是完全不可能的。所以我也放弃了。

    我被困住了。我不明白这是怎么回事。Git不基于diff。提交只是快照。为什么会有冲突?我要做的就是按一定的顺序排列这些快照。为什么这么难,我怎么能做到?

    2 回复  |  直到 6 年前
        1
  •  2
  •   torek    6 年前

    git checkout temp
    hash=$(git log --no-walk --pretty=format:%B temp2 | git commit-tree -p temp temp2^{tree})
    git merge --ff-only $hash
    

    C C' temp

    A--B  <-- temp
     \
      C   <-- temp2
    

    git checkout temp2; git rebase temp B

         C'  <-- temp2
        /
    A--B   <-- temp
     \
      C   [abandoned]
    

    git rebase git cherry-pick A

    git commit-tree git write-tree gitrevisions syntax temp2^{tree} temp2

    git log --no-walk --pretty=format:%B

    git gc git prune git merge --ff-only

    git log ... | git commit-tree

        2
  •  2
  •   William Chong    6 年前

    1. rearrangement plus cleanup