我可以在不先签出其中一个分支的情况下合并 Git 分支吗?

Can I merge Git branches without checking one of them out first?

提问人:user5855178 提问时间:10/13/2023 最后编辑:isherwooduser5855178 更新时间:10/14/2023 访问量:62

问:

无论您签出哪个分支,有没有办法合并分支?Git 是否支持与 --source 和 --destination 标志合并?

我正在寻找一个简单的命令来支持像这样简单的东西:

git merge --sourcebranch --destinationbranch

不得不在分支之间移动以合并内容非常尴尬。我宁愿合并分支,而不管我现在签出的是哪个分支。

git git-merge

评论

2赞 eftshift0 10/13/2023
我认为在这个方向上正在做一些工作,但我认为它还没有可用(至少,我还没有听说过它可用)。但是,如果您需要执行的合并不在您当时已签出的内容上,并且您不想丢失工作树的当前状态,则可以创建一个新的工作树(在您正在处理的本地存储库中),以便您可以执行此操作,然后可以删除工作树。检查。git help worktree
1赞 knittl 10/14/2023
当发生冲突时,您希望发生什么?

答:

3赞 knittl 10/14/2023 #1

您可以使用低级 git merge-tree 命令。手册页甚至在使用说明部分有一个示例,说明您正在尝试执行的操作:

NEWTREE=$(git merge-tree --write-tree $BRANCH1 $BRANCH2)
test $? -eq 0 || die "There were conflicts..."
NEWCOMMIT=$(git commit-tree $NEWTREE -p $BRANCH1 -p $BRANCH2)
git update-ref $BRANCH1 $NEWCOMMIT

把它变成一个 shell 函数,你就可以开始了:

my_merge() {
  NEWTREE=$(git merge-tree --write-tree "$1" "$2")
  if [ "$?" -ne 0 ]; then
    echo 'There were conflicts...' >&2
    return 1
  }
  NEWCOMMIT=$(echo "Merge branch '$2' into $1" | git commit-tree "$NEWTREE" -p "$1" -p "$2")
  git update-ref "$1" "$NEWCOMMIT"
}

并使用它:

my_merge first_branch second_branch

first_branch将被转发到新的合并提交; 保持不变。如果存在冲突,则操作将中止,并且不会发生任何操作。second_branch

评论

0赞 TTT 10/14/2023
这太棒了。阅读这个答案就像看一个伟大的魔术,然后看一个解释它是如何表演的视频一样。:)
1赞 knittl 10/14/2023
@TTT文档中存在:“日志消息是从标准输入中读取的,除非给出了 -m 或 -F 选项。但我也错过了;应该在答案中提到
1赞 knittl 10/14/2023
@TTT :D好吧,它有效™,它只是坐在那里等待用户输入提交消息。我更新了该函数,以根据分支名称提供默认提交消息:)
0赞 TTT 10/14/2023
(我删除了我的其他评论,因为你已经修复了它。
0赞 TTT 10/14/2023
现在你的答案比 Git 文档更好。;)