代码之家  ›  专栏  ›  技术社区  ›  Brad Robinson

将来自另一个分支的所有更改合并为单个提交

git
  •  398
  • Brad Robinson  · 技术社区  · 14 年前

    在Git中,有没有一种方法可以将一个分支中的所有更改合并到另一个分支中,但同时压缩到一个提交中?

    我经常在一个单独的分支中开发一个新特性,并会定期提交/推送—主要用于备份或将正在开发的内容传输到另一台机器。大多数提交都会说“featurexxx WIP”或是一些多余的东西。

    一旦这项工作完成,并且我想将WIP分支合并回主分支,我想放弃所有这些中间提交,只需要一个干净的提交。

    或者,使用一个命令来压缩分支上自分支点开始的所有提交,怎么样?

    6 回复  |  直到 4 年前
        1
  •  645
  •   0 _ Edward Ned Harvey    7 年前

    另一个选择是 git merge --squash <feature branch> 最后做一个 git commit

    Git merge

    --squash

    --no-squash

    发生了(除了合并 信息),但实际上并不 HEAD ,或记录 $GIT_DIR/MERGE_HEAD 导致下一个 git提交 创建合并的命令 在当前 合并另一个分支(或多个分支) 章鱼的案例)。

        2
  •  231
  •   Brad Robinson    14 年前

    --squash 选项

    git checkout master
    git merge --squash WIP
    

    git add .
    git commit -m "Merged WIP"
    
        3
  •  32
  •   fseto    14 年前

    尝试 git rebase -i master squashing commits with rebase

    最后,您可以从主分支进行合并。

        4
  •  9
  •   raratiru    4 年前

    使用 git merge --squash <feature branch> accepted answer

    因此,更好的解决方案是:

    • 最新母版 ,在启动功能分支的主分支中提交。
    • 合并 <feature branch> 在上面使用 git merge --squash

    This wiki 详细说明程序。

    qgit 右边的截图是:

    git log --graph --decorate --pretty=oneline --abbrev-commit
    

    屏幕截图显示了同一存储库中相同范围的提交。尽管如此,由于 --squash .

    • 随着时间的推移 master 分支偏离 db .
    • 分贝 tag 是在同一个提交中创建的 主人 那个 有它的根。
    • git merge --squash db 然后在一次提交中转移和提交所有更改。
    • 主人 , 标签 已合并: git merge tag
    • 分支机构 search 是不相关的,不以任何方式合并。

    enter image description here

        5
  •  3
  •   Stephen Crosby    5 年前

    git freebase ! 它将获取您现有的凌乱、不可恢复的功能分支,并重新创建它,使它成为一个具有相同名称的新分支,其提交被压缩为一个提交,并重新基于您指定的分支(默认情况下为master)。最后,它将允许您为新的“freebase”分支使用任何您喜欢的提交消息。

    通过在.gitconfig中放置以下别名来安装它:

    [alias]
      freebase = "!f() { \
        TOPIC="$(git branch | grep '\\*' | cut -d ' ' -f2)"; \
        NEWBASE="${1:-master}"; \
        PREVSHA1="$(git rev-parse HEAD)"; \
        echo "Freebaseing $TOPIC onto $NEWBASE, previous sha1 was $PREVSHA1"; \
        echo "---"; \
        git reset --hard "$NEWBASE"; \
        git merge --squash "$PREVSHA1"; \
        git commit; \
      }; f"
    

    通过运行以下命令从功能分支使用它: git freebase <new-base>

    我只测试过几次,所以请先阅读并确定是否要运行它。作为一个小的安全措施,它确实打印开始sha1,所以如果出现任何问题,您应该能够恢复您的旧分支。

    我将在github上的dotfiles repo中维护它: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig

        6
  •  3
  •   Akbar Pulatov    4 年前

    2020年更新

    --squash 它看起来像两个没有关系的平行分支:

    enter image description here

    排序与日期相关的提交如下所示:

    enter image description here

    就个人而言,我不喜欢——挤压选项,试试这个技巧,也许它适合你的需要,我把它用于小项目:

    1. 初始化
    2. git签出-b dev
    3. dev中的几个提交
    4. 在dev中完成了一些重要的提交(但还没有合并到master)之后,如果不想将所有提交复制到master分支,那么可以在master和(在README文件中添加一些空行,并在master中提交)中有意更改一些内容,
    5. git合并开发 它会导致合并冲突(自述文件中的空行),解决冲突,提交所需的新消息,然后就完成了。这是它的视觉表现。

    null commit表示有意合并冲突,可以随意命名

    null commit for intentionally merge conflict

        7
  •  -1
  •   Arjun Mullick    8 年前

    git merge --squash <feature branch> 是个不错的选择,“git commit”告诉您所有特性分支提交消息以及您选择保留它的方法。

    用于更少的提交合并。

    做x次——git复位头^——软 然后git提交。

        8
  •  -5
  •   NamshubWriter    14 年前

    您可以使用“rebase”命令执行此操作。让我们将分支称为“main”和“feature”:

    git checkout feature
    git rebase main
    

    git merge main git rebase main 如果在创建“feature”后(或最近的合并后)更改了“main”。这样的话,你仍然有你的完整历史,以防你有一个合并冲突。

    git checkout main
    git merge feature
    

    看到了吗 rebase 第页,共页 Understanding Git Conceptually