gpt4 book ai didi

git - 为什么 Git 对一个 merge 执行自动提交而不对另一个 merge 执行自动提交?

转载 作者:太空狗 更新时间:2023-10-29 14:47:19 25 4
gpt4 key购买 nike

我试图理解为什么当我在一种情况下 merge 时 Git 会自动为我执行提交,而在另一种情况下却不会。

场景 1:

我们刚刚掌握了许多提交和一个或多个标签。

git checkout --orphan newbranch
rm -rf * # Plus removing a few .files other than the .git folder
git add -A
git commit -m "Created empty newbranch branch."
git merge tagname

场景 2:

就 repo 协议(protocol)的状态而言,与上述相同。

git checkout --orphan newbranch
git merge tagname

当我执行场景 1 并 checkout 新分支时,我将看到所有提交消息以及顶部的两个新消息,即“已创建空的新分支分支”。 (我把它放在自己身上)和另一个说“将标签'v1.02' merge 到新分支中”。

我已经阅读了文档(虽然可能从来没有按章节顺序阅读),但我不明白为什么它应该对场景 1 进行自动提交而对场景 2 不进行自动提交。

最佳答案

实际上,它确实做了一个自动提交。

git checkout --orphan newbranch 更新 HEAD 以告诉 git 你在分支 newbranch 上。它不会创建分支。结果是这样的:

$ git status
# On branch newbranch
#
# Initial commit
#
# Changes to be committed:
[snip]
$ git symbolic-ref HEAD
refs/heads/newbranch
$ git rev-parse HEAD
HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

如果你现在 git commit 一些东西,分支实际上被创建了。因为 refs/heads/newbranch 在你执行“git commit”时不存在,所以那个新提交的“parent”是空的,即分支现在标记了一个没有父提交的提交:a根提交。

类似地,如果您 git merge tagname 并且 merge 顺利进行,则会发生提交,并创建分支。因为这是一个 merge 提交,它通常(除非它是快进的)有两个父项:“之前的提交”和“现在的提交”。但是您明确地告诉 checkout ,应该“之前没有提交”。

那么,从逻辑上讲,结果是单亲提交,即被 merge 的提交。它作为快进 merge 执行,将 newbranch 设置为指向 tagname 指向的同一提交。

如果你请求非快进 merge ,你会得到一个错误:

$ git merge --no-ff master
fatal: Non-fast-forward commit does not make sense into an empty head

这遵循“根提交”和“merge 提交”的定义:根提交是没有父提交的提交,而“merge 提交”是有两个或更多父提交的提交。与单个父项进行 merge 提交是根本不可能的——那只是一个普通的非 merge 提交!

关于git - 为什么 Git 对一个 merge 执行自动提交而不对另一个 merge 执行自动提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com