git rebase <repo> <branch>如何将更改应用于本地

时间:2015-05-17 11:48:22

标签: git github

假设:

git remote add upstream https://github.com/source-repo

来自source-repo的fork的一组K提交已经成功合并到上游/ master中:

e.g。

commit C
commit C-1
commit C-2
..  
commit C-K-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提交之前..)

2 个答案:

答案 0 :(得分:0)

运行以下命令以查看分支的当前状态:

git remote show upstream

如果our_feature_branch已经跟踪upstream/master,那么git pull就足够了。

git rebase当然不仅仅是直接将提交应用于另一个提交。相反,它需要一系列提交,并将其放在您的提交之上。它真的遍历并更改了所有重新提交的提交,因此它们都包含您的提交的更改(转换到的链接)。

如何在这里实现合并冲突?

说,在提交历史中有一个文件A,它包含&#34; A&#34;。然后在远程分支中将其更改为包含&#34; R&#34;。并且您在本地仓库中更改了相同的文件以包含&#34; L&#34;。

现在你将远程登录到你的本地。 rebase工具必须更改远程上所有提交的内容,看起来像是在本地版本之后和之后完成的。它应该默默地覆盖&#34; L&#34;与&#34; R&#34;在A档?

答案 1 :(得分:0)

如果提示中确实没有任何差异,请不要改变。只是git checkout -B our_feature_branch upstream/master,除非您真的必须记住项目达到相同内容的两种不同方式,或git merge upstream/master

Rebase正在按顺序将每个重新定位的提交更改应用于给定的提示 - 因此git不仅会看到最终的,没有冲突的内容,而且还会看到它的每个版本方式 - 所以历史上对大块头的多次改变保证至少与新基地中已经存在的变化产生一些冲突。

我从未使用git imerge,但如果中间历史出现过多分歧,看起来可能会有很大帮助。

执行git diff upstream/master our_feature_branch --name-status而非在编辑器和gui中观察它以检测更改,并git diff -b upstream/master our_feature_branch --name-status查看它们是否由于任何类型的仅限空白的更改。