git - merge pull 请求后 git 标签会发生什么

标签 git github-api

如果你有一个像这样的 git 提交树会发生什么:

A-B-C-D          D <-- v0.9 (tag)

并且您接受了一个 pull 请求,该请求的更改早于先前标记的提交;标签现在会包含来自 merge pull 请求的提交吗?

A-F-B-G-C-D      D <-- ? v0.9 (tag)

最佳答案

在git中,tag指向具体的commit对象。如果您实际上已经执行了 git pull --rebase,那么您的图表将如下所示:

A-B-C-D

A-F-B'-G-C'-D'

实际的提交对象取决于树的状态和出身,因此即使从 C 到 D 的差异与 C' 和 D' 之间的差异完全相同,它们也是不同的提交对象。

所以你的问题的答案是 v0.9 标签在第一次创建标签时总是指向 D 的版本。因此,如果您重写了历史记录,您将拥有一个标记,该标记指向一个已不在当前分支的树中的提交。

但是,如果您的意思是有人在您推送 B C 和 D 之前提交并推送到分支 F B G 和 C,那么会发生什么将取决于您在执行所需的 pull 操作时是进行 merge 还是 rebase 使用现有历史记录更新您的本地分支。

默认是 merge 。这将使您的图形看起来像这样:

A-F-B-G-C
 \       \
  B-C-D---M

你的分支头将指向 M,而树的每个分支中的 B 和 C 将是不同的(即使你们都从其他地方挑选了相同的提交)。

更新

tl;博士:

  • 谁先提交(时间)并不重要:顺序取决于图表和您组合和/或更改图表的选项( merge 、 rebase 、挑选)。您决定最终结构的样子。
  • 提交对象(标签指向的东西)永远不会改变,所以你标记的提交不会更新
  • 由于提交不会改变,当重写历史时,您实际上拥有 提交对象,即使差异相同。看起来事情正在发生变化,但实际上它们在图表中被看起来非常相似的东西所取代。

关于git - merge pull 请求后 git 标签会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16640224/

相关文章:

git - 使用 ssh 进行远程 Git pull 会导致权限被拒绝(公钥)?

git - 如何在 TortoiseGit 上更改 GitHub 帐户

git - 重写子模块历史后的子模块存储库

git - 我如何在 Windows 上设置一个 git 存储库,然后在 Mac OSX 上将其推送到/从中提取

GitHub WebHooks 全局触发,而不是每个分支

oauth - Electron 和 ReactJS,使用 BrowserWindow 进行 GitHub oAuth 身份验证

git - Heroku 认为我的 ssh 放错地方了

github - 获取GitHub上的组织列表

没有本地工作目录的 Github 远程仓库上的 Python 更新文件

github - 有没有办法通过 GitHub Rest API v3 获取存储库见解