[英]How does git rebase <repo> <branch> apply changes to local
鉴于:
git remote add upstream https://github.com/source-repo
并且我们从source-repo的分支中获得的一组K提交已成功合并到上游/主服务器中:
例如
commit C commit C-1 commit C-2 .. commit CK-1
现在,我们想将上游/主服务器重新建立到我们的fork的本地克隆上。
尝试了以下命令:
git checkout our_feature_branch
git fetch -a upstream master
git rebase upstream/master
结果? 合并冲突。
注意:我已经从github gui和本地编辑器验证了
upstream/master
和
local our_feature_branch
文件是相同的。
那么git rebase在做什么呢? 是否不将最终的主/上游版本直接应用于本地? 也就是说,它是否遍历了每个单独的提交(已被上游回购提交者btw压缩了。)?
这似乎是唯一可行的过程-鉴于上游/主服务器和(fork的本地克隆)/ our_feature_branch的先前状态为:
相同
不包含合并冲突中显示的文本(冲突中的文本来自K-1之前提交的..)
运行以下命令以查看分支的当前状态:
git remote show upstream
如果our_feature_branch
已经在跟踪upstream/master
,那么git pull
就足够了。
git rebase
当然不仅仅是将一个提交直接应用于另一个提交。 取而代之的是,它需要执行一系列提交并将其放置在您的提交之上。 它确实遍历并更改了所有基于重新提交的提交,因此它们都包含您提交的更改(要重新提交的更改)。
在这里如何发生合并冲突?
说,在提交历史记录的某个位置后面有一个文件A,其中包含“ A”。 然后在远程分支中将其更改为包含“ R”。 并且您将本地存储库中的相同文件更改为包含“ L”。
现在,您可以将远程基准重新部署到本地。 rebase工具必须更改远程所有提交的内容,以使其看起来像在本地版本之后和之后一样。 是否应该在A文件中用“ R”静默覆盖“ L”?
如果提示确实没有任何差异,请不要重新设置基准。 只是git checkout -B our_feature_branch upstream/master
除非您真的必须记住项目到达相同内容的两种不同方式,否则git merge upstream/master
。
Rebase会将每个重新调整的提交的更改按顺序应用于给定的提示-因此git不仅看到最终的,无冲突的内容,而且还看到了它的每个版本-因此可以确保对历史记录中的多个更改至少与新基地中已有的变更产生一些冲突。
我从未使用过git imerge
,但是如果中间历史记录之间的分歧太大,那么这可能会git imerge
。
而不是在编辑器和gui中git diff upstream/master our_feature_branch --name-status
来检测更改,而不是在git diff -b upstream/master our_feature_branch --name-status
来查看它们是否由于某种原因仅空白的更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.