`gitmergeorigin`有什么作用?
今天有人问我做什么git merge origin
。
我说:你是说,git merge origin/branch
?
他们:不,只是git merge origin
。
所以我试了一下,我不知道它有什么作用。
让我们比较一下git pull origin
获取当前分支的尝试:
$ git pull origin
You asked to pull from the remote 'origin', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
公平,那么呢git merge origin
:
$ git merge origin
Auto-merging ...
Merge made by the 'recursive' strategy.
...
1 file changed, 1 insertion(+), 1 deletion(-)
嗯?刚刚发生了什么?
$ git log -n 2
commit ec0fe8f2fd20064db34f9379d30b841c692cfced (HEAD -> test2)
Merge: 982c831 ec3393e
Author: Me
Date: Fri Nov 27 11:14:34 2020 +0800
Merge remote-tracking branch 'origin' into test2
commit 982c83128f7f77fb187fa85c930a6d11bbfde735 (origin/feature/recon, feature/recon)
Author: Me
Date: Fri Nov 27 10:43:20 2020 +0800
lint errors
? 那不是师父说的。
$ git branch -vv
feature/azure-data 81481f5 [origin/feature/azure-data] fix lint errors
feature/recon 982c831 [feature/recon] lint errors <--- !!!
master ec3393e [origin/master] Merged in feature/backfill (pull request #42)
test2 ec0fe8f Merge remote-tracking branch 'origin' into test2
什么?为什么feature/recon
我跑的时候被合并了git merge origin
?
好的,所以我创建了 test2 出来feature/recon
,如果我在 master 上做呢?
$ git checkout master
$ git checkout HEAD~5
$ git switch -c test6
$ git merge origin
...
$ git branch -vv
* test6 ec3393e Merged in feature/backfill (pull request #42)
那么...将当前的父分支合并到这个分支?
我看到一些模糊的手波浪形答案git merge origin
相当于git merge origin/HEAD
,但是......这是什么意思?每个遥控器都链接到某种 HEAD ref 吗?
这是怎么回事?
注意:据我所知,这不是重复的,因为其他问题正在询问git merge remote/branch
各种组合中的作用。我得到它; 这不是我在这里问的问题。
回答
我看到一些模糊的手波浪答案
git merge origin
相当于git merge origin/HEAD
......
他们(通常)是正确的。
为了消除模糊性,请查阅文档,特别是 gitrevisions 的文档。请注意将字符串解析为提交哈希 ID 的六步过程:
<refname>, eg, master , head/master , refs/heads/master
一个符号引用名。例如master通常表示refs/heads/master引用的提交对象。...通过采用以下规则中的第一个匹配项来消除<refname>的歧义:
- 如果$GIT_DIR/<refname>存在,那就是你的意思(这通常只对
HEAD
,FETCH_HEAD
,ORIG_HEAD
,MERGE_HEAD
和有用CHERRY_PICK_HEAD
);...
- 否则,refs/remotes/<refname>/HEAD如果存在。
现在,假设origin/HEAD
存在。这是 的缩写refs/remotes/origin/HEAD
。假设我们要求 Git 解析 name origin
。然后,如果步骤 1、2、3、4 和 5 无法解析origin/HEAD
为原始哈希 ID,我们将到达步骤 6。我们刚才说refs/remotes/origin/HEAD
确实存在。如果它可以解析为哈希 ID,则这就是git merge
将使用的哈希 ID 。
每个遥控器都链接到某种 HEAD ref 吗?
如果origin/HEAD
存在,它通常是一个符号 ref,就像HEAD
通常是一个符号 ref 一样。运行git branch -r
或git branch -a
以列出远程跟踪名称,包括origin/HEAD
它是否存在。请注意,这里有个古怪,有点不对称的:git branch
没有列出象征裁判HEAD
,但git branch -r
还是git branch -a
不列表中的每个远程跟踪象征-REF HEAD
。
该git clone
命令origin/HEAD
最初创建符号引用,该git remote
命令可用于更新它,或者如果您不喜欢它,则可以删除它。如果您确实删除了它,git merge origin
将无法解析origin
为哈希 ID,并会告诉您它origin
是not something we can merge
.