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

将主控形状挤压并合并到同一分支中

  •  17
  • CuriousDeveloper  · 技术社区  · 7 年前

    有没有办法将master压缩并合并到同一个分支中?有效地获取所有挂起的提交并将其放入1个提交中?

    我最初的想法是一个脚本 my-branch 并且做了一个 git checkout master && git pull && git checkout my-branch-squashed 然后 git merge --squash my-branch (处理任何合并冲突),然后最终删除 我的分支机构 和重命名 my-branch-squash 我的分支机构

    这看起来很迂回,可能很糟糕,所以我想看看是否还有其他办法。我试图解决的目的是,当我将分支放在github上,它们被“挤压并合并”到master中时,本地计算机上存在的分支与合并到master中的分支不匹配,因此在使用 git branch --merged ${1-master} | grep -v " ${1-master}$" | xargs -r git branch -d; 它无法正确删除已合并到master中的分支。我想要的是一种自动删除已合并到master中的旧分支的方法

    4 回复  |  直到 7 年前
        1
  •  8
  •   Maroun    7 年前

    您可以使用 git rebase ,并修复要合并的提交:

    $ git rebase -i HEAD~5
    
    pick c2e2c87 commit 1
    f 689d474 commit 2
    f aa9d9b4 commit 3
    f 888a009 commit 4
    f d396e75 commit 5
    
    # Rebase 2f7f53e..d396e75 onto 2f7f53e (5 commands)
    #
    # Commands:
    # p, pick = use commit
    # r, reword = use commit, but edit the commit message
    # e, edit = use commit, but stop for amending
    # s, squash = use commit, but meld into previous commit
    # f, fixup = like "squash", but discard this commit's log message
    # x, exec = run command (the rest of the line) using shell
    # d, drop = remove commit
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    #
    # However, if you remove everything, the rebase will be aborted.
    #
    # Note that empty commits are commented out
    

    您可以使用 git rebase -i --root 以便从第一次提交时重新设置基础。

        2
  •  1
  •   Useless    7 年前

    如果您真正想要的只是在提交拉请求之前压缩本地开发历史,那么最简单的方法就是只在本地功能分支上开发,它不同于您想要影响的任何上游分支。

    然后,将其挤压到母版上的步骤是

    git checkout master
    git merge --squash feature
    

    (更换 master 具有 integration 或者别的什么)。

    我会用 rebase -i 对于精细控制,但对于这个简单的例子,我们可以使用git对历史的了解来自动找出最后一个共同祖先。

        3
  •  0
  •   Chris Gunawardena    7 年前

    您可以软重置到您想要的最后一次提交,然后重新提交。

    enter image description here

    enter image description here

        4
  •  0
  •   LightBender    7 年前

    将合并挤压工作流的问题放在一边,考虑到工作流经常超出您的控制范围,这已经在许多地方进行了彻底的讨论。

    有一种方法你可以使用,虽然它不是百分之百有效,但根据我的经验,它确实有一个相当好的记录,而且总是故障安全的。

    没有可依赖的祖先,您需要的是一种确定两个快照是否相同的方法。您可以将提交树的哈希用于以下命令:

    git show --format="%T" <committish>
    

    为了检查是否可以删除分支,请首先将主控形状合并到分支中。如果此合并中存在冲突,或者原始挤压中存在冲突,则无法使用此方法(这是低于100%有效的部分)。

    由于git的特性,如果不发生冲突,那么应用一组补丁的顺序并不重要。因此,如果您的分支已被合并,则此合并的结果应与主分支的头相同。通过比较两个分支头的树哈希可以确认这一点,您可以发现分支上是否存在任何未合并的代码。

    这可以归结为一个单独使用的命令,可以很容易地别名如下:

    if [ $(git show --format="%T" origin/master) = $(git show --format="%T" HEAD) ]; then echo Merged; else echo Unmerged; fi
    

    或者内置到shell脚本中,该脚本将循环遍历所有本地分支,合并它们,测试它们,并删除已合并的分支。

    综上所述,使用交互式重基来扁平化分支,并让维护人员对拉请求使用仅快进的合并策略,这一切都是不必要的。