我想了解git pull --rebase
......为了做到这一点,该命令与以下内容有何不同:
git fetch origin
git reset --soft remotes/origin/foo
git add .
git commit -am "bar"
git merge remotes/origin/foo
git pull --rebase
与上述命令相同还是不同?当然显然不那么冗长。
不,他们是完全不同的。
假设您使用干净树检查了master
,您提出的命令集将具有将master
指向单个提交的效果,其父级是上游获取但其内容具有使用您的副本替换新上游树的效果预取master
,不合并任何上游变化。 (特别是,最终的git merge remotes/origin/foo
将始终说“已经是最新的。”并且永远不会做任何改变。)
那是因为命令:
git reset --soft remotes/origin/foo
将master
设置为指向remotes/origin/foo
而不更改当前工作目录(或索引)。然后,命令:
git commit -am "bar"
检查来自当前主服务器的(未更改的)树的单个提交。就Git而言,你只是刚刚取出了上游,然后有条不紊地改变它看起来就像你自己的master
基于早期的上游,撤消自你上一次拉动后所做的任何更改,然后在上面检查它上游。由于此提交现在是上游的后代,因此它已被视为已合并,并且:
git merge remotes/origin/foo
没有效果。
相比之下,qazxsw poi相当于
git pull --rebase
这样可以重放从git fetch origin
git rebase remotes/origin/foo # or wherever you pull from
上提交的提交序列,因为你上次从上游分支顶部的上游拉出并将master
指向结果。
因此,它与上述命令的不同之处在于它向上游添加了一系列提交而不是添加单个提交,并且它重放了提交的内容(这意味着它尝试重放这些提交中所做的更改)。上游,而不是用master
的旧内容替换上游,并消除上游变化。最后,master
仍然是master
的后代,所以运行:
remotes/origin/foo
仍然无能为力,但它不需要做任何事情,因为新获得的上游变化将被纳入新的git merge remotes/origin/foo
分支。