我想了解下面(尝试)的git合并是怎么回事。
我有一个名为llvm的分支,其中main分支是上游的llvmorg-12.0.0标记,另外:
通过这样做,我们可以看到我在分支中接触到的文件:
$ git diff --name-only llvmorg-12.0.0
.buildbot.sh # new file
bors.toml # new file
llvm/CMakeLists.txt # modified file
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp # modified file下面是我的main分支在tig中的样子:

现在,我想将最新的llvm版本同步到我的分支中,即llvmorg-13.0.0标记。我已经做了git fetch llvm来获取上游的所有提交和标记。
让我们首先创建一个分支来完成合并:
$ git co -b sync-llvm13
Switched to a new branch 'sync-llvm13'现在让我们进行合并:
$ git merge llvmorg-13.0.0
Performing inexact rename detection: 100% (8537886/8537886), done.
warning: Cannot merge binary files: llvm/test/tools/llvm-profgen/Inputs/recursion-compression-pseudoprobe.perfbin (HEAD vs. llvmorg-13.0.0)
Removing polly/lib/External/isl/cpp/cpp.h.pre
Removing polly/lib/External/isl/cpp/cpp-checked.h.pre
CONFLICT (add/add): Merge conflict in openmp/runtime/test/tasking/hidden_helper_task/capacity_nthreads.cpp
Auto-merging openmp/runtime/test/tasking/hidden_helper_task/capacity_nthreads.cpp
Removing openmp/runtime/src/tsan_annotations.h
Removing openmp/runtime/src/tsan_annotations.cpp
Auto-merging openmp/runtime/src/kmp_tasking.cpp
Auto-merging openmp/runtime/src/kmp_settings.cpp
Auto-merging openmp/runtime/src/kmp_runtime.cpp
Auto-merging openmp/runtime/src/kmp_config.h.cmake
CONFLICT (content): Merge conflict in openmp/runtime/src/kmp_config.h.cmake
Auto-merging openmp/runtime/src/CMakeLists.txt
Auto-merging openmp/runtime/cmake/config-ix.cmake
Auto-merging openmp/runtime/CMakeLists.txt
CONFLICT (add/add): Merge conflict in openmp/libomptarget/test/offloading/bug49334.cpp
Auto-merging openmp/libomptarget/test/offloading/bug49334.cpp
CONFLICT (add/add): Merge conflict in openmp/libomptarget/test/offloading/bug49021.cpp
Auto-merging openmp/libomptarget/test/offloading/bug49021.cpp
CONFLICT (add/add): Merge conflict in openmp/libomptarget/test/offloading/assert.cpp
...
Auto-merging clang/test/Preprocessor/riscv-target-features.c
CONFLICT (content): Merge conflict in clang/test/Preprocessor/riscv-target-features.c
Removing clang/test/Preprocessor/pragma_sysheader.h
Auto-merging clang/test/Preprocessor/macro_vaopt_check.cpp
CONFLICT (content): Merge conflict in clang/test/Preprocessor/macro_vaopt_check.cpp
Auto-merging clang/test/OpenMP/teams_distribute_simd_codegen.cpp
CONFLICT (content): Merge conflict in clang/test/OpenMP/teams_distribute_simd_codegen.cpp
Auto-merging clang/test/OpenMP/teams_distribute_parallel_for_simd_codegen.cpp
CONFLICT (content): Merge conflict in clang/test/OpenMP/teams_distribute_parallel_for_simd_codegen.cpp
Auto-merging clang/test/OpenMP/teams_distribute_parallel_for_codegen.cpp
...loads more conflicts这是个惊喜。有很多被标记为冲突的文件,但我从未碰过。
这些冲突是add/add、rename/delete和content的混合。
查看其中一个content冲突,文件中确实有冲突标记(例如,libcxx/include/__support/openbsd/xlocale.h):
...
<<<<<<< HEAD:libcxx/include/__support/openbsd/xlocale.h
#include <__support/xlocale/__strtonum_fallback.h>
=======
#include <cwctype>
>>>>>>> llvmorg-13.0.0:libcxx/include/support/openbsd/xlocale.h
... (因此这排除了行尾作为原因的可能性)
我很困惑。如上面使用git diff --only-name命令所示,我从未编辑过这些文件。
锣开着什么?
用户错误/误解?我应该以不同的方式合并吗?
这是在Debian 11上使用最新的git (2.33.0)。
发布于 2021-10-07 19:24:06
如果标记llvmorg-12.0.0 llvmorg-13.0.0**.**无法访问标记,则可以解释这一点。
换句话说,签出标记12,并尝试在标记13中合并,您可能会遇到冲突。如果您这样做(显然)与您的代码无关,这只意味着该回购使用的维护人员使用的分支策略不一定包括将发布的标记合并回main。或者,如果他们最终做到了,他们并没有在这两个版本之间这样做。
您还可以使用以下命令(在Git Bash或*nix shell中)测试是否可以从标记13中访问标记12:
git rev-list llvmorg-13.0.0 | grep `git rev-parse llvmorg-12.0.0`命令列表中的"rev-list“部分所有的提交都可以从标记13中找到,然后它会很高兴地查看标记12的提交ID是否是其中之一。
如果这没有结果,那么这就是正在发生的事情。
从您的合并输出中,您看到的CONFLICT (add/add)代码行表明,回购维护人员从版本12分支中选择了一些提交到main或release-13分支,而不是合并,这是另一个证据--这就是原因所在。这一策略意味着发布标记不能彼此访问,如果将一个发布标记合并到另一个发布标记中,则可能会出现合并冲突。
,那么你应该怎么做?
两种可能的选择是:
1. main的分支(原来的主板,而不是叉子然后继续重新定位到main,直到您准备好用代码做其他事情为止。在您的分支检查,重建您的分支如下:
git rebase --onto main llvmorg-12.0.0随后的重基将是正常的:git rebase main
2.从较新的标记重新构建分支,而不是在新标记中合并。在您的分支检查,重建您的分支如下:
git rebase --onto llvmorg-13.0.0 llvmorg-12.0.0https://stackoverflow.com/questions/69484251
复制相似问题