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

git:重写历史:重新排序和合并提交

  •  25
  • Albert  · 技术社区  · 15 年前

    origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3   mybranch
    

    我想清理历史(A1到B3),特别是因为我还没有把它推到任何地方,因为我想准备一个补丁,只有那些B*。

    我想要的是:

    origin/mybranch --- A1+A2+A3 --- B1+B2+B3   mybranch
    

    我可能根本不会推这个(或者如果我会推的话,只有求和的B*,我必须删除A*提交),并且当我进一步研究这个问题时,我可能会得到额外的此类提交,例如:

    origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4   mybranch
    

    我想重写一遍,就像上面一样。

    我不只是想知道做这件事的任何方法(因为我能以一种有点黑客的方式得到类似的东西),我特别是在这里问正确的/最好的/最干净的/最简单的方法来做这件事。


    1 回复  |  直到 8 年前
        1
  •  30
  •   CharlesB Craig McQueen    12 年前

    你想做一个 interactive rebase .

    在尝试git命令时,我喜欢做的第一件事是制作分支的备份副本:

    $ git branch my-backup-branch
    

    假设你的A1提交有一个散列 152274b . 试试这个:

    $ git rebase -i 152274b^
    

    pick 152274b A1
    pick 14b0838 B1
    pick 661b993 A2
    pick a6510db B2
    pick 557e171 A3
    pick 85da0e4 B3
    
    # Rebase 39a47e4..85da0e4 onto 39a47e4
    #
    # Commands:
    #  p, pick = use commit
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    # However, if you remove everything, the rebase will be aborted.
    #
    

    从这里您可以更改提交的顺序,完全删除它们,甚至压扁它们。在本例中,您可能希望像这样移动和挤压:

    pick 152274b A1
    squash 661b993 A2
    squash 557e171 A3
    pick 14b0838 B1
    squash a6510db B2
    squash 85da0e4 B3
    

    $ git reset --hard my-backup-branch