我注意到以下git命令的两个块有不同的行为,我不明白为什么。
我有一个A和一个B分支,它们在一次提交中分离
---COMMIT--- (A)
\
--- (B)
我想在最近的A上重新建立B分支(并在B分支上提交)
---COMMIT--- (A)
\
--- (B)
如果我这样做没有问题:
checkout B
rebase A
但如果我这样做了:
checkout B
rebase --onto B A
根本不管用,什么都没发生。我不明白为什么这两种行为不同。
PhpStorm GIT客户端使用第二种语法,所以看起来完全被破坏了,这就是为什么我问这个语法问题。
为了更好地理解git rebase和git rebase之间的区别,最好了解这两个命令可能的行为。Git rebase允许我们将提交移到所选分支的顶部。像在这里:
git rebase master
结果是:
Before After
A---B---C---F---G (master) A---B---C---F---G (master)
\ \
D---E (HEAD next-feature) D'---E' (HEAD next-feature)
Git rebase -onto更精确。它允许我们选择特定的提交,我们想从哪里开始,也想在哪里结束。像在这里:
git rebase --onto F D
结果是:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD my-branch) E'---H'---I' (HEAD my-branch)
要获得更多详细信息,我建议您查看我自己关于git rebase的文章—进入概述
为了更好地理解git rebase和git rebase之间的区别,最好了解这两个命令可能的行为。Git rebase允许我们将提交移到所选分支的顶部。像在这里:
git rebase master
结果是:
Before After
A---B---C---F---G (master) A---B---C---F---G (master)
\ \
D---E (HEAD next-feature) D'---E' (HEAD next-feature)
Git rebase -onto更精确。它允许我们选择特定的提交,我们想从哪里开始,也想在哪里结束。像在这里:
git rebase --onto F D
结果是:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD my-branch) E'---H'---I' (HEAD my-branch)
要获得更多详细信息,我建议您查看我自己关于git rebase的文章—进入概述
Git的措辞在这里有点令人困惑。如果你把命令伪装成这样可能会有所帮助:
Git rebase - to=<new_base> <old_base>[<分支>]
如果我们现在在分支上,它可以被省略:
git rebase - access =<new_base> <old_base>
如果new_base和old_base相同,我们可以省略——onto形参:
Git rebase <new_old_base>
这可能听起来很奇怪:如果旧的基数和新的基数相同,您如何重设基数?但是可以这样想,如果你有一个功能分支foo,它已经(可能)基于你的主分支中的一些提交。通过“re- based”,我们只是让它基于的提交更当前。
(In fact, <old_base> is something that we compare branch against. If it's a branch, then git looks for a common ancestor (see also --fork-point); if it's a commit on current branch, the commits after that are used; if it's a commit that has no common ancestor with current branch, all commits from current branch are used. <new_base> can also be a commit. So, for instance, git rebase --onto HEAD~ HEAD will take commits between old base HEAD and current HEAD and place them on top of HEAD~, effectively deleting the last commit.)
简单地说,git rebase——onto选择了一系列提交,并根据参数给出的commit对它们进行了重基。
阅读git rebase的手册,搜索“onto”。下面的例子非常好:
example of --onto option is to rebase part of a branch. If we have the following situation:
H---I---J topicB
/
E---F---G topicA
/
A---B---C---D master
then the command
git rebase --onto master topicA topicB
would result in:
H'--I'--J' topicB
/
| E---F---G topicA
|/
A---B---C---D master
在这种情况下,您告诉git将提交从topicA重置为topicB,位于master之上。