`git pull --rebase`与`git reset --soft origin / b`有什么不同?

问题描述 投票:0回答:1

我想了解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与上述命令相同还是不同?当然显然不那么冗长。

git git-rebase git-reset
1个回答
1
投票

不,他们是完全不同的。

假设您使用干净树检查了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 分支。

© www.soinside.com 2019 - 2024. All rights reserved.