- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我开始使用 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 branch
或 git 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/
我是一名优秀的程序员,十分优秀!