git rebase 时会碰到的小问题和解决方法 - V2EX
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
bearzk
V2EX    git

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

  •  2
     
  •   bearzk Jan 17, 2015 14724 views
    This topic created in 4134 days ago, the information mentioned may be changed or developed.

    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 replies    2015-01-17 15:57:10 +08:00
    palxex
        1
    palxex  
       Jan 17, 2015
    git push --force对个人自己用的feature分支确实没啥问题。但如果是多人合作的分支……我估计其他人pull时会有问题吧?
    ZackYang
        2
    ZackYang  
       Jan 17, 2015
    呃,奇妙的衍合也并非完美无缺,要用它得遵守一条准则:

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

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

    来自: 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  
       Jan 17, 2015
    git push -f 时请小心,最好写上分支名。
    ery
        4
    ery  
       Jan 17, 2015
    git push origin HEAD --force

    强制推送当前分支到服务器上
    bcxx
        5
    bcxx  
       Jan 17, 2015
    > 我pull回来,把本地feature分支rebase到develop上

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

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


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

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

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

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

    不用 rebase,用 merge 。一般都是 fast forword 到你自己本地 develop 的(前提是你之前没在本地 develop 上进行过 rebase 之类的操作)
    bcxx
        17
    bcxx  
       Jan 17, 2015
    @fgwww 哈哈哈哈不要变基这个要 @tonyseek
    finian
        18
    finian  
       Jan 17, 2015
    @fgwww 同意,能不变基尽量不变,变基会改写历史。解决冲突不小心还可能会丢失改动,还是尽量使用合体
    bearzk
        19
    bearzk  
    OP
       Jan 17, 2015 via iPhone
    @old9 是的 每个人有自己的fork 在fork上开branch
    bearzk
        20
    bearzk  
    OP
       Jan 17, 2015 via iPhone
    @bcxx merge的办法看起来也不错 我下次试试 谢谢
    About     Help     Advertise     Blog     API     FAQ     Solana     3287 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 12:19 PVG 20:19 LAX 05:19 JFK 08:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86