正如标题所示。我最近试着运行一个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
上重播;而不是相反!