如何正确合并拉取请求并协调本地存储库

How to correctly merge pull request and reconcile local repository

提问人:Max 提问时间:8/9/2023 最后编辑:GuildensternMax 更新时间:8/10/2023 访问量:140

问:

当我在 GitHub 上合并拉取请求然后在本地存储库上运行时,我发现了另一个提交:合并 github.com:repository 的分支“blabla”和“main”,在日志中,写着:由“ort”策略进行的合并。然后我被迫推送此提交。git pull -a

重现步骤:

  1. 创建存储库并提交
  2. 创建一个分支并进行一些更改,然后推送
  3. 在 GitHub 门户上,单击“创建拉取请求”并合并
  4. 在本地存储库中,在主分支上运行git pull -a
  5. 此时将显示新的提交。
  6. 现在你必须运行git push

问题在于,在 GitHub 存储库上,有在分支上完成提交时运行的 Actions 工作流。

在不创建另一个提交的情况下执行拉取请求并协调本地存储库的正确工作流程是什么?

编辑: 我是唯一与存储库交互的人

git github git-pull

评论

0赞 Guildenstern 8/9/2023
如果所有这些步骤都是由您完成的,则不应获得任何额外的合并提交。只有当其他人远程做某事(除了你之外)时,你才会得到它们。
0赞 Guildenstern 8/9/2023
尝试。git pull --ff-only
0赞 Guildenstern 8/9/2023
这个问题可能足够清楚,以防这可能具有启发性(至少有点):关于“拉力主要是邪恶的”的初学者问题
1赞 Guildenstern 8/9/2023
第一个行动项目(在反对者解释之前)不应该是你对你收到的答案提供反馈吗?因为这可以是一种澄清形式。

答:

2赞 vatbub 8/9/2023 #1

有几个关于 git 的细节导致了这种行为:

  1. 您当地的分支机构是完全独立的分支机构。mainorigin/main

  2. git fetch origin从存储库下载任何更改(例如,新提交或新分支),但不会将它们与本地分支合并(即本地分支保持不变)。要实际查看文件系统上的更改,您需要检查它们,例如使用 .originmaingit reset --hard origin/main

  3. git pull origin main执行 a 后跟 .通常,git 会执行所谓的快进合并,它只会将您的本地内容推进到 ,但如果由于某种原因无法做到这一点,它将创建一个完整的合并提交。git fetchgit mergemainorigin/main

出于这个原因,我总是使用以下工作流程,我建议你做同样的事情:

  • 切勿使用,因为它可能会产生意想不到的副作用。git pull
  • 相反,请始终使用后跟(将分支名称替换为您当前正在处理的任何名称)。git fetch origingit reset --hard origin/main

或者,您可以使用 GitKraken、Git Extensions 或 SmartGit 等 UI,它们将为您可视化当前情况。

如果你想更深入地挖掘,我强烈推荐这个YouTube视频,它向我解释了这一点。

0赞 matt 8/10/2023 #2

这里有几个错误:

  • 如果你是唯一使用此存储库的人,则不应使用拉取请求。拉取请求不是 Git 功能;它们是 GitHub 的一项功能,仅用于促进协作。你没有合作,所以拉取请求是没有意义的,只是让你的生活不必要地复杂化。

  • 如果您决定使用拉取请求合并到 ,那么您不应该有本地 .你不需要它做任何事情,因为你永远不会融入其中。如果需要在 的末尾启动一个新分支,或者只是调查 的状态,请执行一个 并查看 ,远程跟踪分支。我已经在其他地方解释了我如何在没有本地.mainmainmainmaingit fetchorigin/mainmain

  • 这些建议中的任何一个都不需要这个问题。但是,如果你确实有一个本地人,你仍然应该遵循规则:永远不要说。它的行为是不确定的(至少从用户的角度来看;它的行为方式有原因,但很难找出它们是什么),它不会做任何你不能通过说然后继续合并或变基或其他什么来做得更干净的事情。maingit pullgit fetch

评论

1赞 vatbub 8/10/2023
好吧,事实上,即使您自己工作,PR 仍然有用。就我而言,即使我是唯一从事该项目的人,我仍然在功能分支和 PR 之间切换,这是将 CI 状态保持在一个地方并允许我在合并之前查看自己的代码的好方法