V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
bearzk
V2EX  ›  git

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

  •  2
     
  •   bearzk · 2015-01-17 09:15:35 +08:00 · 13912 次点击
    这是一个创建于 3600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    20 条回复    2015-01-17 15:57:10 +08:00
    palxex
        1
    palxex  
       2015-01-17 09:50:13 +08:00
    git push --force对个人自己用的feature分支确实没啥问题。但如果是多人合作的分支……我估计其他人pull时会有问题吧?
    ZackYang
        2
    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
        3
    ushuz  
       2015-01-17 10:00:46 +08:00
    git push -f 时请小心,最好写上分支名。
    ery
        4
    ery  
       2015-01-17 10:22:31 +08:00
    git push origin HEAD --force

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

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

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

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

    不用 rebase,用 merge 。一般都是 fast forword 到你自己本地 develop 的(前提是你之前没在本地 develop 上进行过 rebase 之类的操作)
    bcxx
        17
    bcxx  
       2015-01-17 11:12:52 +08:00
    @fgwww 哈哈哈哈不要变基这个要 @tonyseek
    finian
        18
    finian  
       2015-01-17 13:16:42 +08:00
    @fgwww 同意,能不变基尽量不变,变基会改写历史。解决冲突不小心还可能会丢失改动,还是尽量使用合体
    bearzk
        19
    bearzk  
    OP
       2015-01-17 15:55:45 +08:00 via iPhone
    @old9 是的 每个人有自己的fork 在fork上开branch
    bearzk
        20
    bearzk  
    OP
       2015-01-17 15:57:10 +08:00 via iPhone
    @bcxx merge的办法看起来也不错 我下次试试 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5420 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 05:49 · PVG 13:49 · LAX 21:49 · JFK 00:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.