git rebase 时会碰到的小问题和解决方法

2015-01-17 09:15:35 +08:00
 bearzk

tl;dr

如果只有你一个人在一个分支上工作,完全可以从origin pull再rebase,紧着着用git push --force解决push分支时被reject的问题。


我工作的时候经常碰到这个问题:同事的pull request被merge到develop,我pull回来,把本地feature分支rebase到develop上,到这一步没有任何问题。但是如果我在这个rebase之前已经把一些本地feature分支的commits push到我的fork,那这些fork上的commits就会reject rebase之后的push了。用git push --force确实可以解决这个问题,不过总感觉这个并不必要的--force好可怕。


然后我就在stackoverflow上看到了完全相同的这个问题,被采纳的答案消除了我害怕用--force的疑惑。这个回答下面的第一条评论确实也可以解决这个问题,但是就会有完全一样的commits重复出现一次,在git log里看起来实在不好看。

我想大家可能也碰到过这个问题,所以把这个问题和回答分享在这里,希望会有帮助。

bearzk

13942 次点击
所在节点    git
20 条回复
palxex
2015-01-17 09:50:13 +08:00
git push --force对个人自己用的feature分支确实没啥问题。但如果是多人合作的分支……我估计其他人pull时会有问题吧?
ZackYang
2015-01-17 09:57:54 +08:00
呃,奇妙的衍合也并非完美无缺,要用它得遵守一条准则:

一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

如果你遵循这条金科玉律,就不会出差错。否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你。

来自: http://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E8%A1%8D%E5%90%88
ushuz
2015-01-17 10:00:46 +08:00
git push -f 时请小心,最好写上分支名。
ery
2015-01-17 10:22:31 +08:00
git push origin HEAD --force

强制推送当前分支到服务器上
bcxx
2015-01-17 10:29:32 +08:00
> 我pull回来,把本地feature分支rebase到develop上

你先在 develop 上合并了 remote 的 develop 再去 rebase 自己的 feature 应该会好点吧?

我一般都是不在本地(自己)的 develop 里面进行 rebase,而是通过 pr 到 remote 并且 merge 之后再在本地 fast forward 过去……


rebase 的确只适合在本地操作啊,多几个 merge commit 也比搞砸了啊~
bearzk
2015-01-17 10:37:41 +08:00
@palxex 你说的没错 所以我们目前都是在自己的fork上工作然后 pull request
bearzk
2015-01-17 10:38:35 +08:00
@ZackYang 说的很对 包含别人的commit的公用branch不能轻易merge
bearzk
2015-01-17 10:39:50 +08:00
@ushuz 谢谢 我会注意 我一般都是切换到要push的分支操作
fgwww
2015-01-17 10:42:21 +08:00
不要变基
bearzk
2015-01-17 10:45:19 +08:00
@bcxx 谢谢 我下次按照你说的想想再来一遍 也许因为我们都在自己的fork上工作..同事的pr被merge到upstream develop以后我会pull upstream develop再rebase分支到develop 不过这时会提示pull 照做的话就会有些重复的(尽管hash不同)的commits了
bearzk
2015-01-17 10:46:19 +08:00
@fgwww ??
old9
2015-01-17 10:55:32 +08:00
我觉得 --force 没什么可怕的,因为你的本地分支一旦 rebase ,他就不是以前的他了,以前的他已经烟消云散,那么远程服务器上的对应分支也失去了意义,自然要被(而且应该要被) --force 给替换掉。

这种私有的 branch,大胆 --force 好了。

如果不是私有 branch,那就压根不应该 rebase。如果一个协作用的 branch 需要经常 rebase,那一定是你们的工作流程有问题。
comcuter
2015-01-17 11:04:04 +08:00
@old9 如果是多个人需要在同一个仓库上的同一个分支上进行开发呢?
你的意思是每个人尽量多开 feature 分支, 然后 merge 到 develop 上去?
bcxx
2015-01-17 11:10:09 +08:00
@comcuter 对的。
old9
2015-01-17 11:11:13 +08:00
@comcuter 是的,而且楼主也正是如此吧?
bcxx
2015-01-17 11:11:44 +08:00
@bearzk

> 我会pull upstream develop再rebase分支到develop

不用 rebase,用 merge 。一般都是 fast forword 到你自己本地 develop 的(前提是你之前没在本地 develop 上进行过 rebase 之类的操作)
bcxx
2015-01-17 11:12:52 +08:00
@fgwww 哈哈哈哈不要变基这个要 @tonyseek
finian
2015-01-17 13:16:42 +08:00
@fgwww 同意,能不变基尽量不变,变基会改写历史。解决冲突不小心还可能会丢失改动,还是尽量使用合体
bearzk
2015-01-17 15:55:45 +08:00
@old9 是的 每个人有自己的fork 在fork上开branch
bearzk
2015-01-17 15:57:10 +08:00
@bcxx merge的办法看起来也不错 我下次试试 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/162905

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX