正如标题所示。我最近试着运行一个git rebase命令,这个命令的效果与git pro关于rebacking的部分相反。也许我解释错了,但这让我疯狂,因为我认为应该发生的事情失败了,我需要知道哪里出了问题。
我所指的部分是在更有趣的rebackes下,特别是在您将服务器工作分支重新定位到主分支时的示例中。Git Rebasing.
我的解释是,服务器工作将被粘贴到主工作的顶部,这显然是它发生在插图的基础上。
我在本地机器上有两个分支,分别是otwo-3196(capistrano配置)和origin/orgs_phase_2。我想做的是在我的otwo-3196(capistrano配置)工作的基础上,让origin/orgs_phase_2工作回扣。我在终端输入了这个命令:

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

我所想的是把组织阶段放在otwo-3196(capistrano工作)上,而不是把otwo-3196(capistrano工作)放在组织阶段。这和我想要的正好相反。
但是,此命令起作用:
git rebase origin/orgs_phase_2 OTWO-3196

这将起源/起源阶段的工作放在OTWO-3196上。
我把命令解释错了吗?这本书错了吗?到底发生了什么?多一双眼睛会有帮助的。谢谢。

最佳答案

我不知道你做了什么,或者你认为你做了什么,但是origin/orgs_phase_2是一个远程跟踪分支。它的唯一目的是指出您上次与远程回购(称为orgs_phase_2通信)中名为origin的分支引用指向的位置。这样的引用可以移动的唯一方法是通过获取或推送。尤其是,您不能重新设置远程跟踪分支的位置。
另外,pro-git的书是正确的。您已经得到了git-rebase语法。Git的rebase就像那本书上宣传的那样,

git rebase [basebranch] [topicbranch]

为您签出主题分支[…],并将其重放到基分支[…]
git-rebase手册页中,
假设存在以下历史,当前分支是“主题”:
      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上重播;而不是相反!

07-24 09:37
查看更多