gpt4 book ai didi

git - 如何将分支中的快照(提交)副本创建到 git 中的另一个分支?

转载 作者:行者123 更新时间:2023-12-04 13:48:55 27 4
gpt4 key购买 nike

当我开始使用 Git 时,我了解到的第一件事就是 Git 不将信息存储为基于文件的更改(补丁)列表,而是存储为快照流。提交是所有存储库的快照。

假设我们在存储库 Branch_A 和 Branch_B 中有两个分支。无论它们之间的关系如何,它都可能非常简单或非常复杂(与其他分支 merge ......)。就像这样代表他们:

A <--- ... -- I <----- J <----- K                Branch_A


M <------ N <----- O <----- P Branch_B

出于某些原因,我希望 Branch_A 的下一次提交恰好是 Branch_B 中提交 P 的状态(快照)。

是否有 git 命令来执行此操作?

我不能使用“正常” merge ,因为我不想解决 P 和 K 之间的冲突。我不能使用选项“theirs”的递归 merge ,因为它将保留 K 中不与 P 冲突的所有文件,即使它们不存在于 P 中也是如此。

我可以这样做:

cd /path/to/myrepo;
git checkout Branch_B
cp -R * /path/to/save_branch_b_state
git checkout Branch_A
rm -rf *
cp -R /path/to/save_branch_b_state . (In fact, I copy everything but the .git directory)
git add *
git commit

但我想有一个 git 命令可以做到这一点。

最佳答案

没有一个 单个 git 命令可以做到这一点,但你可以只用几个命令来完成。

不过,第一个问题是:您是否希望它至少类似于 merge (在这种情况下,它真的是 merge )?也就是说,您希望提交图看起来像什么——它是否应该显示来自 branch_B(提交 P 所在的位置)的某种链接,a la:

A <--- ... -- I <----- J <----- K <--- *         Branch_A
/
M <------ N <----- O <----- P Branch_B

* 是你的新提交?还是您希望它完全独立?

低级命令 git commit-tree 将使用任意父年龄进行新提交(您使用 -p 提供父 ID,一条消息,以及现有的“树”对象)。它打印生成的提交对象 ID。所以要用低级命令来做到这一点:

tree=$(git rev-parse B^{tree})  # or similar to find the tree ID
commit=$(git commit-tree -p ... -m message $tree) # or use -F, or stdin

然后将 Branch_A 设置为指向 $commit(使用 git branchgit update-ref)。这可以变成一行 shell 的东西,因此作为 git 别名来完成,但它有点棘手,可能值得成为一个 shell 脚本。只选择一个 ID 作为父项以使您的新提交成为常规(非 merge )提交,或选择多个 ID 使其成为 merge ;如果您确实将其 merge ,请根据您希望 --first-parent 将来的工作方式选择父 ID 顺序。

或者,您可以使用更高级别的 git 命令来完成。例如,如果您希望它成为(并且类似于) merge ,您可以简单地从 Branch_A 开始,删除所有内容(从索引中删除整棵树和工作树),重新填充提交 P 中的所有内容(基于提交 P 创建新的索引内容和工作树),然后提交:

$ git checkout Branch_A
$ git rm -rf . # cd to top dir first if needed
$ git checkout Branch_B -- . # index and work tree = commit P
$ git commit

或者,将上述操作作为真正的 merge :参见 this question 的答案.

关于git - 如何将分支中的快照(提交)副本创建到 git 中的另一个分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com