在将本地分支从主分支上进行变基之前,我该如何合并所有本地提交?

3
当我在团队中工作,必须将我的本地分支推送到远程主分支时,我首先使用以下简单命令将我的本地分支变基到主分支:
git fetch && git rebase origin/main

但是当我这样做时,所有我的本地提交都被应用了,因为这些先前提交的代码与我的最后一个本地状态(保存在我的最后一个提交中)不同,所以会发生冲突。解决自己提交的冲突需要很多(无用的)时间...

我害怕出错,所以在这里寻求帮助。我的问题是:

如何在rebase之前将所有本地提交合并为一个?感谢这个方法,当我进行rebase时,只需要应用一个提交

我不知道这是否是更好的方法,请随意给我建议。:) 谢谢!


1
这回答了你的问题吗?如何将我的最后N个提交压缩在一起? - teapot418
这并不是一种优雅的解决方案(也不是标准答案),但在GitHub上,我经常将代码推送到一个单独的分支,然后创建一个针对与主分支匹配的分支的拉取请求,进行压缩和合并,然后从该提交哈希值使用 git cherry-pick... 命令。我这样做的原因是,GitHub的拉取请求合并策略通常可以在本地压缩无法解决或过于繁琐的情况下解决此问题,特别是对于长时间分叉的分支而言。它还具有并排合并冲突解决器的附加好处,用于那些实际上在压缩后存在冲突的文件。 - tresf
感谢您的帮助!@teapot418,如果我理解正确,我将使用squash命令“平整”所有提交,然后当我执行git fetch && git rebase origin/main时,只会有一个提交需要合并? - okli
1
是的,“压缩”是将多个提交合并为一个的常用术语。(我主要使用那边所接受的答案中描述的git rebase -i变量) - teapot418
2个回答

1
#!/bin/sh
## Usage: ./script <branch>
git fetch origin main
git checkout origin/main
git merge --squash $1
# You’ll want to modify the commit message here
git commit
git branch --force $1 HEAD
# Return
git checkout -

测试

我将此与在功能分支上运行 git rebase <upstream> 进行了比较,得到了相同的树 ID。

根据默认提交信息 (相当详细),压缩也压缩了我所期望的范围。

关于提交信息的注意事项

git merge --squash 的默认提交信息比使用 git rebase --interactivesquash 所获得的信息要少得多。

其他:重新应用冲突

如果在使用 git-rebase(1) 时,你已经厌倦了一遍又一遍地修复相同的合并冲突,则可以考虑使用 git-rerere(1)。


1
运作得非常完美!你让我的一天都变得美好了 :D - okli

0

您可以通过以下方式轻松完成:

  1. git rebase -i HEAD~n(其中n是您在主分支上方的提交数)
  2. 一个编辑器将打开,您需要在顶部提交上保留 pick,然后将以下行中的 pick 替换为 s,表示合并。
  3. 在下一个编辑器中,按您的意愿编辑提交消息
  4. 您将看到一条消息,显示“成功地重新设置了...”
  5. 然后运行 git pull --rebase origin main 将该提交放置在远程分支上的提交之上

1
我认为使用分支根提交的SHA-1比使用HEAD~n更容易且更安全。 - Gauthier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接