Git:合并来自基本分支的更改

Git: Merging changes from a base branch

前言,我对使用 git 和一般的版本控制系统还很陌生。我想我理解大部分概念,但我似乎已经 运行 进入了墙/我正在使用 smartgit 作为我的客户端,这可能是相关的,并为游戏服务器编码

所以几周前,我开始了一个主要项目,从我们项目的开发分支中分支出来。在那段时间里,代码库进行了一次重大更新,一些事情发生了变化,导致我的分支无法编译。显然,它不是以当前开发分支为基础,而是我开始这个项目时开发分支的状态,而且新的更改似乎没有合并到本地代码中

我刚开始使用 smartgit,有一大堆功能我不太了解。

这是我的项目 DionaOverhaul 的工具提示分支:

我最初分支的基础分支是 aurorastation/development。我在想也许应该将其设置为跟踪分支?

我需要以某种方式将对 aurorastation/development 的所有更改合并到我的 dionaoverhaul 分支中,并创建一个包含所有当前开发代码的分支,我的 dionaoverhaul 提交在它。我不知道该怎么做。

经过一些研究,我想我想做的是将我的分支重新定位到 aurorastation/development

的顶端

但我看到的一个问题是,我正在处理的至少一个图块在此期间已更改,我不想完全覆盖对该文件的更改,我分支中的版本。我不确定这是否是存储库管理器在合并我的拉取请求时会处理的事情,或者它是否是我在 rebase

期间需要处理的事情

您有两个分支:your_localdevelopment

完成 your_local 并希望将所有更改带到 development 后,您有 two options:

  1. 切换回 development 分支,拉入所有更改,并将 your_local 合并到其中。
  2. 切换回 development,拉入所有更改,切换回 your_local,将 development 合并到其中并解决所有冲突。然后转到选项 1。

当您在 development.

中没有大的变化时,第一个选项是一个简单的案例

第二个看起来像你的情况:development中有变化,它们与你的冲突。

实际上,还有更多(例如,您可以 rebase your_local 到最新的 development),但我们先保持简单。

跟踪分支

您不需要更改跟踪分支,这是 a pointer to the remote copy of your local branch

冲突

当您在 developmentyour_local 中有冲突的更改时 git 将尝试解决它(这就是 git 的目的)。然而,这并不总是可能的,git 会将此类文件标记为冲突,您将不得不 manually resolve 这些冲突。

Smartgit 有 some basic functionality for merging 和解决冲突。

无论如何,如果您对 git/smartgit 不是很熟悉,我建议您备份您的存储库,这样您就可以放心地尝试合并。

跟踪分支

"Tracked branch" 表示您推送到的分支。它应该始终与本地分支的名称相同,并以 "refs/remotes/NAME_OF_REMOTE" 为前缀。 NAME_OF_REMOTE 可以是任何东西,但是如果你只推送到一台服务器,惯例是叫它 "origin"。所以不要改变它。如果这样做,下次推送时,您将收到一条消息,提示您无法推送,因为它会覆盖远程分支,如果您确定要这样做,请使用 git push --force。如果你使用git push --force,你最终会覆盖别人在开发分支上的辛勤工作。 (是的,它是可以恢复的,但它很让人头疼,所以就不要了。)

合并更改

I need to merge all the changes to aurorastation/development into my dionaoverhaul branch somehow, and create a branch that has all the current development code, with my dionaoverhaul commits ontop of it

你有2个选项。如果你真的想要你所有的dionaoverhaul commits ontop of it,那么这样做:

  1. git fetch # 这会从服务器下载所有最新的更改
  2. 确保您在 dionaoverhaul 分支。
  3. git 变基 origin/development 终端将向您显示它正在您的分支上应用提交,一次一个。它会定期停止并告诉您存在需要手动解决的冲突。您可能需要多次执行此操作。每次解决每个文件中的冲突,然后git add -A && git rebase --continue

另一方面,如果您只想处理最多一组手动冲突,则使用 merge 而不是 rebase。缺点是您的分支机构的历史将不再是一条直线。然而,这种方法有许多优点,超出了这里的范围。要合并,而不是运行宁git rebase origin/development,运行git merge origin/development。同样,您可能不得不处理手动冲突,但是一旦它们全部解决,请使用 git add -A && git commit.