首页 > 解决方案 > GIT - 进行更改后合并问题

问题描述

我搜索并发现了许多建议使用rebase命令和fetch命令的问题和答案,但它们并不清楚。

  1. 我分叉了我的项目。然后我将 fork 克隆到我的本地机器上。
  2. 我更新并提交了一个 PR 说 #100。
  3. 假设您的评论在两天后回来了。与此同时,主人也得到了更新。我的 fork 和我的本地克隆与原始 master 不同步。
  4. 请告知我必须做些什么才能在重新调整后再次进行更改。

这就是我所做的,但没有奏效:

git remote add upstream git://github.com/masterproject/projectname.git

git fetch upstream

git pull upstream master

git push

当我执行上述操作时,许多其他文件也被推送到 master 进行审查。如何确保只有我的文件进入?

标签: gitmergerebase

解决方案


git pull 上游大师

您在已经进行的更改之上将更改拉入您的分支。这使得这些更改看起来很新git,因为分支具有不同的版本历史记录。您真正想要做的是调整您自己分支的历史记录以匹配远程主分支中的内容,这就是您需要该rebase命令的原因。

我不确定您的描述是否足够完整,以至于我们可以准确地告诉您您应该做什么,但通常的事情是这样的:

git remote add upstream git://github.com/masterproject/projectname.git

git fetch upstream

git rebase upstream/master

git push -f origin

所以你的第一部分是正确的......你已经添加了一个远程调用upstream到你的仓库,这样你就可以直接从远程仓库获取更改。该fetch命令基本上将这些更改复制到您的本地存储库,但它们仍然与远程存储库相关联,而不是您分支的一部分。

下一步是关键:您要重新定位您的分支,以便您的分支的历史记录(直到您进行新更改)与远程主分支的历史记录相匹配。上面的 rebase 命令为您执行此操作......它基本上将您的提交保存在某个地方,将 master 中的新提交添加到您的分支,然后“重播”您在分支中提交的更改。这并不总是顺利......有时会出现冲突,因为来自主分支的新提交和您的提交都涉及相同的代码。发生这种情况时,您可能必须在继续之前手动解决冲突。无论哪种方式,当 rebase 操作完成时,您的更改应该是远程 master 分支的当前状态和您的分支之间的唯一更改。

一旦你达到了这一点,你就需要推动你的改变。但是你已经推送了你的分支,并且它有不同的版本历史,所以 git 通常会拒绝接受推送。该-f标志表示force选项,它使 git 接受分支的新版本,包括它的不同版本历史记录。

只要您了解风险,这一切都很好。如果其他人从您的 fork 中提取了您的分支副本,那么他们的分支副本现在将具有不同的版本历史记录,这可能会让人感到困惑。但是对于您所描述的那种工作流程,您可能不会与其他人共享您的分叉,您应该没问题。


推荐阅读