【问题标题】:Has the Pro Git book got the syntax of git-rebase backwards?Pro Git 书是否有向后使用 git-rebase 的语法?
【发布时间】:2014-08-27 16:02:44
【问题描述】:

正如标题所示。我最近尝试运行一个 git rebase 命令,该命令与 Git pro 关于 rebase 的部分具有相反的效果。也许我解释错了,但它让我发疯,因为我认为应该发生的事情失败了,我需要知道出了什么问题。

我提到的部分在更有趣的变基下,特别是当您将服务器工作分支变基到主分支时的示例。 Git Rebasing.

我的解释是,服务器工作将被粘贴在主工作之上,这显然是根据插图发生的情况。

我在本地机器上有两个名为 OTWO-3196(Capistrano 配置)和 origin/orgs_phase_2 的分支。我打算做的是让 origin/orgs_phase_2 工作基于我的 OTWO-3196(Capistrano 配置)工作。我在终端中输入了这个命令:

git rebase OTWO-3196(basebranch) origin/orgs_phase_2(topicbranch)

我认为将 orgs_phase_2 工作放在 OTWO-3196(Capistrano 工作)上,而不是将 OTWO-3196(Capistrano 工作)放在 orgs_phase_2 上。这与我想要的完全相反。

但是这个命令有效:

git rebase origin/orgs_phase_2 OTWO-3196

这会将 origin/orgs_phase_2 的工作放到 OTWO-3196 上。

我对命令的解释有误吗?书有错吗?究竟发生了什么?多一双眼睛会很有帮助。谢谢。

【问题讨论】:

    标签: git git-rebase


    【解决方案1】:

    我不知道你做了什么,或者认为你做了什么,但origin/orgs_phase_2 是一个远程跟踪分支。它的唯一目的是指出上次与后者通信时名为orgs_phase_2 的分支引用在名为origin 的远程仓库中指向的位置。这种引用可以移动的唯一方法是通过获取或推送。特别是,您不能对远程跟踪分支进行变基。

    此外,Pro Git 的书是正确的git-rebase的语法倒过来了。 Git 的rebase 就像那本书中所宣传的那样工作,

    git rebase [basebranch] [topicbranch]
    

    为您检查主题分支 [...] 并将其重播到基本分支 [...]

    git-rebase 手册页中,

    假设存在以下历史且当前分支为“topic”:

          A---B---C topic
         /
    D---E---F---G master
    

    从此时开始,以下任一命令的结果:

    git rebase master
    git rebase master topic
    

    应该是:

                  A'--B'--C' topic
                 /
    D---E---F---G master
    

    为了修正想法,这里有一个小例子,你可以在家里复制:

    #!/bin/bash
    
    # set things up
    cd ~/Desktop
    mkdir test
    cd test
    git init
    
    # write an initial shopping list
    printf "4 pears\n" > shopping.txt
    printf "3 lemons\n" >> shopping.txt 
    printf "1 stalk of celery\n" >> shopping.txt 
    printf "4 bananas\n" >> shopping.txt 
    
    # make a first commit on master
    git add shopping.txt
    git commit -m "add shopping list"
    
    # modify the shopping list and make a second commit on master
    sed -i '' 's/4 pears/4 apples/' shopping.txt 
    git add shopping.txt
    git commit -m "replace pears by apples"
    
    # create and check out a new branch called "kidscominghome"
    git checkout -b kidscominghome
    
    # make two more commits on kidscominghome
    printf "16 pots of yoghurt\n" >> shopping.txt
    git add shopping.txt
    git commit -m "add yoghurt"
    printf "beer\n" >> shopping.txt 
    git add shopping.txt
    git commit -m "add beer"
    
    # check out master, modify the file, and make one more commit
    git checkout master
    sed -i '' 's/stalk of celery/cauliflower/' shopping.txt 
    git add shopping.txt
    git commit -m "replace celery by cauliflower"
    

    在这个阶段,输出

    git log --graph --decorate --oneline --all
    

    应该是

    * 5a0e340 (HEAD, master) replace celery by cauliflower
    | * d3d22d0 (kidscominghome) add beer
    | * edd730d add yoghurt
    |/  
    * 7dc55b7 replace pears by apples
    * 7079948 add shopping list
    

    这是一个更漂亮的图表,显示了相同的历史:

    现在,如果你运行

    git rebase master kidscominghome
    

    然后运行同样的git log 命令,你应该会看到

    * 2acf37d (HEAD, kidscominghome) add beer
    * dfac4a8 add yoghurt
    * 5a0e340 (master) replace celery by cauliflower
    * 7dc55b7 replace pears by apples
    * 7079948 add shopping list
    

    再一次,这是一个更漂亮的图表,显示了相同的历史:

    正如宣传的那样,kidscominghome 分支已被签出,只能从kidcominghome 访问的提交已在master 之上重放;不是相反!

    【讨论】:

    • 嘿@Jubobs,我有一个后续问题。因此,按照您的示例并运行 git log,我想在 master 分支或 kidscominghome 下看到 5 个提交吗?就目前而言,我可以看到 kidscominghome 的 5 次提交,但 master 只能看到 3 次。这就是我认为我感到困惑的地方。如果kidscominghome 被重新设置为master,master 分支不会显示5 次提交吗?你能帮我澄清一下吗?
    • 没关系,我确实想通了。我需要做的就是通过运行 git merge 来推动 master 前进,所以现在 master 已经赶上了 kidscominghome 的步伐。感谢您通过该示例澄清这一点。毕竟这本书是对的。
    • @DanRubio 很高兴一切都好。不过,不要因为搞混而自责。我记得一开始就被rebase 的语法弄糊涂了。但是,在虚拟存储库中尝试使用当时深奥的 Git 命令(正如我在回答中所做的那样)总是可以很好地解决想法:)
    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2015-03-21
    相关资源
    最近更新 更多