【问题标题】:how to merge local commits at a develop branch in git?如何在 git 的开发分支中合并本地提交?
【发布时间】:2011-12-06 04:06:37
【问题描述】:

我有一个本地开发分支“dev”和一个远程“master”分支。对于“dev”分支,我有一个相当复杂的提交历史(近 20 次连续提交)。我尝试使用

"git rebase -i origin/master" 

然而,在“开发”,我发现这个过程很容易出错(你必须一个一个地应用每个提交并解决冲突......)并且令人沮丧...... 我现在需要的是将“dev”处的提交历史压缩为单个提交,并将这个大提交推送到“master”进行审查和合并。 有没有安全有效的方法来做到这一点? 非常感谢你们!

【问题讨论】:

  • 您可能想详细说明您为什么要这样做。如果您在执行此操作时遇到合并冲突,那么当您压缩更改并将它们作为一个提交应用时,您将遇到相同的冲突。你想把历史压缩成一个提交吗?您想要远程主服务器上的线性历史记录,还是介意合并?

标签: git merge branch


【解决方案1】:

我会这样做:

$> git merge-base dev origin/master
<commit>

无论返回什么都将是用于压缩提交的合并点...

然后,假设你在你的 dev 分支上,就这样做:

$> git reset <commit>

这将有效地将您连续 20 次提交的所有更改放回 git status 中的“已修改文件”部分...

然后像这样创建一个新的提交(确保 git add --all 是你想要的):

$> git add --all
$> git commit -m "my squeezed stuff"

然后解决你的冲突并推送到原点......

希望对你有帮助,

【讨论】:

  • 它不起作用,因为我已经与“dev”和“master”合并,运行 $> git merge-base dev origin/master 将返回最新的提交“dev”和“ master" 有...我想要的只是将我的提交压缩到新提交并将其推送到 "master" 以供审查。
  • 好吧,在这种情况下,只需在 dev 上执行 git reset --hard HEAD^ 以删除合并提交,然后执行我在那里建议的操作。这有意义吗?
  • 感谢 billaud,我终于用了最简单的方法:从“dev”复制到一个新的本地分支“dev2”,该分支已经与“master”同步并从“dev2”提交,这样,“ dev2" 只有一个干净的提交,而不是复杂的提交历史......
【解决方案2】:

如果重置当前分支有问题,那么创建一个新分支是一个不错的选择(并且您已经这样做了),但您不需要复制所有内容。

一旦你创建了 dev2(基于 master),你可以checkout dev,然后checkout dev2,而无需修改当前工作目录中存在的dev 的任何文件(!)。
见“switch git branch without files checkout”:

git symbolic-ref HEAD refs/heads/dev2
git reset

然后您可以添加所有内容并提交。

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 2015-12-22
    • 2017-04-12
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2015-11-18
    • 2010-10-08
    相关资源
    最近更新 更多