GIT - 修改后合并问题
GIT - Merging Question After Making Changes
我搜索并找到了很多建议使用 rebase 命令和 fetch 命令的问题和答案,但它们并不清楚.
- 我分叉了我的项目。然后我将 fork 克隆到我的本地机器上。
- 我更新并提交了一个 PR,比如 #100。
- 假设您的评论在两天后回复。与此同时,主人得到了更新。我的分叉和本地克隆与原始母版不同步。
- 请告诉我在变基后必须做什么才能再次进行更改。
我就是这样做的,但没有用:
git remote add upstream git://github.com/masterproject/projectname.git
git fetch upstream
git pull upstream master
git push
当我执行上述操作时,许多其他文件也被推送到 master 以供审查。如何确保只有我的文件进入?
git pull upstream master
您在 已经做出的更改之上 将更改拉入您的分支。这使得这些更改对于 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 您的分支,以便您的分支的历史,直到您进行新更改的那一点,与远程主机的历史相匹配分支。上面的 rebase 命令为你做了这个......它基本上将你的提交保存在某个地方,将 master 中的新提交添加到你的分支,然后“重放”你分支中提交的更改。这并不总是顺利......有时会发生冲突,因为来自 master 分支的新提交和你的提交都涉及相同的代码。发生这种情况时,您可能必须在继续之前手动解决冲突。无论哪种方式,当 rebase 操作完成后,您的更改应该是远程 master 分支的当前状态与您的分支之间的唯一更改。
达到这一点后,您需要推送您的更改。但是你已经推送了你的分支,并且它有不同的版本历史,所以 git 通常会拒绝接受推送。 -f
标志表示 force
选项,这使得 git 接受分支的新版本,包括它的不同版本历史。
这样做没问题,只要您了解其中的风险。如果其他人从您的分支中删除了您的分支副本,那么他们的分支副本现在将具有不同的版本历史记录,这可能会让人感到困惑。但是对于您所描述的那种工作流程,您可能不会与其他人共享您的分叉,您应该没问题。
我搜索并找到了很多建议使用 rebase 命令和 fetch 命令的问题和答案,但它们并不清楚.
- 我分叉了我的项目。然后我将 fork 克隆到我的本地机器上。
- 我更新并提交了一个 PR,比如 #100。
- 假设您的评论在两天后回复。与此同时,主人得到了更新。我的分叉和本地克隆与原始母版不同步。
- 请告诉我在变基后必须做什么才能再次进行更改。
我就是这样做的,但没有用:
git remote add upstream git://github.com/masterproject/projectname.git
git fetch upstream
git pull upstream master
git push
当我执行上述操作时,许多其他文件也被推送到 master 以供审查。如何确保只有我的文件进入?
git pull upstream master
您在 已经做出的更改之上 将更改拉入您的分支。这使得这些更改对于 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 您的分支,以便您的分支的历史,直到您进行新更改的那一点,与远程主机的历史相匹配分支。上面的 rebase 命令为你做了这个......它基本上将你的提交保存在某个地方,将 master 中的新提交添加到你的分支,然后“重放”你分支中提交的更改。这并不总是顺利......有时会发生冲突,因为来自 master 分支的新提交和你的提交都涉及相同的代码。发生这种情况时,您可能必须在继续之前手动解决冲突。无论哪种方式,当 rebase 操作完成后,您的更改应该是远程 master 分支的当前状态与您的分支之间的唯一更改。
达到这一点后,您需要推送您的更改。但是你已经推送了你的分支,并且它有不同的版本历史,所以 git 通常会拒绝接受推送。 -f
标志表示 force
选项,这使得 git 接受分支的新版本,包括它的不同版本历史。
这样做没问题,只要您了解其中的风险。如果其他人从您的分支中删除了您的分支副本,那么他们的分支副本现在将具有不同的版本历史记录,这可能会让人感到困惑。但是对于您所描述的那种工作流程,您可能不会与其他人共享您的分叉,您应该没问题。