【问题标题】:Git: Merge in only one commitGit:仅合并一次提交
【发布时间】:2011-06-03 22:40:35
【问题描述】:

通常,我在 Git 中使用分支,但我不希望在我的工作树中看到数百个分支(Git 历史)。我想知道 Git 中是否有一种方法可以仅在一次提交中“加入”分支中的所有提交(最好带有明确的提交消息)。

类似这样的:

git checkout -b branch
<some work>
git commit -a -m "commit 1"
<some work>
git commit -a -m "commit 2"
<some work>
git commit -a -m "commit 3"
git checkout master
git SUPER-JOIN branch -m "super commit"

在此之后,git log 中将只存在“超级提交”。

【问题讨论】:

    标签: git branch


    【解决方案1】:

    听起来您正在寻找git-merge--squash 选项:

    git checkout master
    git merge --squash branch -m "super commit"
    

    【讨论】:

    • 这在过去可能有效,但不再有效。 (git v1.7.9) 消息Fast-forward (no commit created; -m option ignored) 被输出,我留下了一个未提交的更改。 --no-ff 选项看起来很有希望,但仍然创建了与所有单个提交的合并。
    • @BrianWhite:--no-ff--squash 都试过了吗?我不知道 Git 中有任何改变会改变这个命令的行为。如果您仍然无法使用它,我可以建议您提出一个新问题吗?
    • 我相信--squash 总是禁止立即提交。在我的搜索中,普遍接受的答案是 merge --squash 加上单独的提交(从技术上讲,它使分支“挂起”,在 UI 查看器中可见)和 rebase --squash 加上单独的合并(这更复杂,并且原始分支没有个人提交)。但我会继续寻找(和试验)以尝试找到更好的东西。
    • 我得到“自动合并顺利;在按要求提交之前停止。”
    【解决方案2】:

    这可以使用git rebase 和 squash 或使用git merge --squash 来完成,请参阅

    Git merge flattening

    git: squash/fixup earlier commit

    【讨论】:

    • git merge --squash 很棒。我希望我在 2011 年能更仔细地阅读这篇文章;)+1
    • git merge --squash 的问题在于它实际上并没有创建合并提交。像 GitHub 的网络查看器这样的 GUI 不会显示重新加入的分支;一个会突然结束,而另一个会继续。
    【解决方案3】:

    如果你确定你只需要一次提交,并且分支永远不会被标记为“合并”(可能是因为你将要使用 git branch -D my-squash-merged-branch 删除它并且再也不想看到它),请使用这个:

    git checkout master
    git merge --squash branch-to-merge
    git commit -m "message for commit"
    

    但是,经过大量测试,我认为合并大多数分支的最佳方法是:

    git checkout master
    git merge --no-ff branch-to-merge -m "message for commit"
    

    这避免了不允许为许多合并指定-m "message" 选项的“快进”合并。它实际上并没有按照最初的要求提供单个提交,但至少可以很容易地看到分支的开始/结束,因此可以轻松恢复等。 git log 将显示所有合并的单个提交...

    commit a6672a4c3d90c35d5f39c45f307ef6b385660196
    Merge: 015f8d6 f84e029
    Author: Brian White <bcwhite@example.com>
    Date:   Wed Jan 15 20:47:35 2014 -0500
    
        merged something trivial
    
    commit f84e02915faa02afc9a31b8c93a6e7712420687d
    Author: Brian White <bcwhite@example.com>
    Date:   Wed Jan 15 20:47:12 2014 -0500
    
        added something also trivial
    
    commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb
    Author: Brian White <bcwhite@example.com>
    Date:   Wed Jan 15 20:46:26 2014 -0500
    
        added something trivial
    
    commit 015f8d681bdaf65725067ee8058215cedb529dd6
    Author: Brian White <bcwhite@example.com>
    Date:   Wed Jan 15 20:23:31 2014 -0500
    
        optimizations to MyThing
    ...
    

    ...但是如果您查看日志 (git log --graph) 的 图表,您会发现 git 确实将其识别为单个合并。

    *   commit a6672a4c3d90c35d5f39c45f307ef6b385660196
    |\  Merge: 015f8d6 f84e029
    | | Author: Brian White <bcwhite@example.com>
    | | Date:   Wed Jan 15 20:47:35 2014 -0500
    | |
    | |     merged something trivial
    | |
    | * commit f84e02915faa02afc9a31b8c93a6e7712420687d
    | | Author: Brian White <bcwhite@example.com>
    | | Date:   Wed Jan 15 20:47:12 2014 -0500
    | |
    | |     added something also trivial
    | |
    | * commit 904d5b5ff00d691d63104a77d2e2ca484732a5fb
    |/  Author: Brian White <bcwhite@example.com>
    |   Date:   Wed Jan 15 20:46:26 2014 -0500
    |
    |       added something trivial
    |
    * commit 015f8d681bdaf65725067ee8058215cedb529dd6
    | Author: Brian White <bcwhite@example.com>
    | Date:   Wed Jan 15 20:23:31 2014 -0500
    |
    |     optimizations to MyThing
    ...
    

    如果主分支上发生提交或其他活动,图表将显示合并的分支从正确的位置开始并在当前头部加入,但当然所有提交仍将显示在日志中,其中包含来自分支的提交位居榜首。

    【讨论】:

    • 像我认为的那样工作 git merge --squash 会工作。
    猜你喜欢
    • 2012-08-31
    • 2021-06-23
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2013-06-20
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多