分支中的提交在本地合并和推送后记录在主分支中

Commits in branch are recorded in master branch after local merge and push

这是我的问题:

  1. 我有一个 Github 存储库,我在本地 clone 编辑了它,因此有一个本地 master 分支跟踪 origin/master

  2. 我创建了一个新的本地分支 foobar,我使用命令 git push origin foobar 将其发布到远程 Github 存储库。此时,在 Github 上我可以看到 masterfoobar 分支。当我将 foobar 中的后续本地提交推送到远程时,可以在 Github 中的 foobar 分支下看到这些提交。

  3. 在本地,我 git checkout master 移动到 master 分支,运行 git merge foobar 将我的更改合并到 master

  4. I 运行 git push 将更改推送到 Github.

问题是在 Github 上,我在 foobar 分支中(在步骤 2 中)所做的提交被记录为 master 分支中的提交!这可以通过查看我的 Github 存储库的 Insights 选项卡中的网络图看到:我在 foobar 中所做的提交显示为代表 master 的线上的点。换句话说,就 Github 而言,本地合并似乎将所有提交放入 master 分支,但这不是我想要的存储库 "history"!

但是,如果我重复上述步骤直到第 3 步,然后我创建一个合并拉取请求 within Github 将 foobar 合并到 masterfoobar 中的提交将出现在该分支中。我可以通过查看 Github 存储库的 Insights 选项卡中的网络图来确认这一点(即我在 foobar 中的提交在 foobar 行而不是 master 行中显示为点).

有没有办法 运行 我的本地 git 命令,这样我就不需要在 Github 网站上合并?

您所做的称为快进合并。换句话说,当您要合并的分支 (foobar) 是您要合并到的分支 (master) 的超集时,默认情况下 Git 只是将两个分支更新为一样。

当您在 GitHub 上执行合并时,GitHub 默认总是执行非快进合并;也就是说,它总是创建一个合并提交。这对于跟踪更改很有用,如果这是您想要的本地行为,您可以使用 --no-ff 选项:git merge --no-ff foobar.

这主要是关于您想要什么的风格和偏好问题。有些项目更喜欢没有合并提交的线性历史,有些更喜欢通过合并提交明确跟踪单个功能。