我正在克隆存储库的某个分支。然后我取第二个分支。我最终想运行
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
一起使用?
看起来是这样的:
test-branch
在某个时刻已被拉入一定深度,git pull --depth=<n>
,因此它不包含其完整历史记录。限制从每个远程分支历史记录的尖端获取指定的提交次数。
test-branch
和 dev
实际上源自的祖先分支。第三种选择可能是两个分支具有不相关的历史记录,但由于它们的远程分支 do 返回带有
git merge-base
的提交,那么只能是本地历史记录不完整。
要了解您的情况属于这两种情况中的哪一种,您可以:
使用
git clone <URL>
下载存储库的完整克隆。
启动
git merge-base test-branch dev
以检索合并基础提交。
使用
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)
并检索两者之间的更改。
您的问题在于:
-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
和“你的活跃提交”的历史记录