git merge-base HEAD <remote branch>不返回任何内容?

问题描述 投票:0回答:2

我正在克隆存储库的某个分支。然后我取第二个分支。我最终想运行

merge-base
但每次我这样做都什么也没有返回:

git-init \
  -url="${PARAM_URL}" \
  -revision="test-branch" \
  -path="${CHECKOUT_DIR}" \
  -depth="1";
cd "${CHECKOUT_DIR}";
git fetch origin dev:refs/remotes/origin/dev;
git switch test-branch;
git merge-base HEAD remotes/origin/dev;

git merge-base
命令不返回任何内容。这些都没有返回任何内容:

git merge-base HEAD remotes/origin/dev;
git merge-base $(git rev-parse HEAD) remotes/origin/dev;
git merge-base remotes/origin/test-branch remotes/origin/dev;

我可以使用

git branch
查看分支,并且可以使用
git rev-parse HEAD
获取当前提交。

最终,我只需要运行它即可获取分支上与

dev
不同的文件列表:

git diff --name-only HEAD $(git merge-base HEAD remotes/origin/dev)

那么为什么

HEAD
没有注册以及如何让它与
HEAD
一起使用?

git git-diff git-remote
2个回答
0
投票

看起来是这样的:

  1. test-branch
    在某个时刻已被拉入一定深度,
    git pull --depth=<n>
    ,因此它不包含其完整历史记录。

限制从每个远程分支历史记录的尖端获取指定的提交次数。

  1. 或者您仅使用一些分支克隆了存储库,而您的本地存储库没有
    test-branch
    dev
    实际上源自的祖先分支。

第三种选择可能是两个分支具有不相关的历史记录,但由于它们的远程分支 do 返回带有

git merge-base
的提交,那么只能是本地历史记录不完整。

要了解您的情况属于这两种情况中的哪一种,您可以:

  1. 使用

    git clone <URL>
    下载存储库的完整克隆。

  2. 启动

    git merge-base test-branch dev
    以检索合并基础提交。

  3. 使用

    git branch --contains <merge-base-commit>
    检查哪个分支包含合并基础提交。

此时,如果

git branch --contains
在包含合并基础提交的分支中显示
test-branch
,请返回到原始存储库,删除跟踪分支
remotes/origin/test-branch
,然后再次获取它。这将确保获取
test-branch
的整个历史记录;否则,Git 将尝试仅检索新的更改。然后,将主题分支
refs/heads/test-branch
硬重置为跟踪分支
refs/remotes/heads/test-branch
。这将重新调整您的本地分支与其远程对应分支。 在继续进行硬重置之前,请确保将不在远程的
test-branch
的任何本地更改保存在临时分支上。

步骤如下:

# creating a new temporary branch with test-branch's history (and eventual local changes)
git checkout -b my_temp

# deleting the tracking branch
git branch --delete --remotes remotes/origin/test-branch

# fetching test-branch's history
git fetch origin test-branch

# checking out test-branch
git checkout test-branch

# bringing test-branch to the tip of its remote's counterpart
git reset --hard remotes/origin/test-branch

# cherry-picking any old local changes
git cherry-pick HEAD..my_temp

相反,如果

git branch --contains
显示合并基础提交所在的另一个分支:返回到原始存储库,使用合并基础提交为远程分支创建本地分支,获取其更改,然后硬重置本地分支分支到其跟踪分支。

# creating a local branch for the branch containing the merge-base commit
git branch other_branch

# fetching the other branch's history
git fetch origin other_branch

# checking out the other branch
git checkout other_branch

# resetting the other branch to its remote counterpart
git reset --hard remotes/origin/other_branch

现在,您应该能够运行

git diff --name-only HEAD $(git merge-base test-branch dev)
并检索两者之间的更改。


0
投票

您的问题在于:

-depth="1"

为了找到两个提交的合并基础,git 需要检查它们的历史记录。

如果您指示 git 仅下载

test-branch
的头提交,那么您没有其历史记录。


快速解决方法是:从 git init 命令中删除

--depth=1
,然后下载分支的整个历史记录
test-branch


旁注:有一种语法可以访问

HEAD
和“分支
dev
HEAD
之间的合并基础”之间的差异:

git diff --name-only dev...HEAD
# other shortcuts or implicit 'HEAD' also work:
git diff --name-only dev...@
git diff --name-only dev...

(记录于

git help diff

这只是语法糖,这个命令仍然需要扫描

dev
和“你的活跃提交”的历史记录

© www.soinside.com 2019 - 2024. All rights reserved.