git 挤压与移动的指针合并

问题描述 投票:0回答:1

考虑这个仓库提交结构

dev: [base]....A..B..C..D..E..F..G..H..I..J..K..L..M..N..O..P..Q..R..S..T..U..V..W..X..Y..Z....
       |                                                    \                       \     \
tst: [base]..................................................P'......................X'....Z'....
       |                                                                                   \
prd: [base].................................................................................Z''....

每个字母都是一个提交。我们希望保留每个分支的完整历史记录,但挤压会提交下来 所以每个更高的环境都有一个逐渐干净的历史。这样做一次显然是一次挤压合并, 很容易。但是挤压合并不会移动内部指针,因此每个后续合并都可能 产生冲突。

例如,将 devA..devP 压缩合并到 tstP' 中很容易。但随后将 tst 更新为 X' 将产生 冲突,例如版本文件中的冲突——因为 P' 在 P 之后出现,从技术上讲,该文件较新 并没有反映在 tst 中。只要没有发生文件移动,通常

--squash -X theirs
就能完成这项工作, 但并非总是如此(
checkout BRANCH *
更接近,但在某些情况下并不相同)。变基已被淘汰,因为根据定义,我想保留较低环境的历史。

我想要的是“是的,我们做了真正的合并,但不,我们实际上并不想要来自其他分支的提交,只是假设你现在已经同步了”合并。您可以通过返回环境并返回来让合并发挥良好作用,但这与提交图有关。基本上,我想要一个永久的、永恒的单向瀑布合并。

我不确定这是否可能(需要隐藏一些提交等价映射),例如说在 tst 上提交 c9c9c9c9 on dev == b8b8b8b8,因此在 c9c9c9c9 之后从 dev 合并到 tst 应该只查看提交的子集,但我想不妨问问。

git merge
1个回答
0
投票

假设

merge -s ours

当前指向

tst
并且您即将进行
P'
的第二次挤压合并:
X

如果您想删除临时分支,您可以在压缩合并提交消息中包含提交 ID,以便您知道下一次合并的起点在哪里。或者您可以无限期地保留 
# 1.) Create and checkout a temp branch called temp/tst starting at tst git switch -c temp/tst tst # Now both branches are pointing to P' # 2.) Merge in P (Note this doesn't change state so -s ours isn't necessary) git merge P # 3.) Now merge in X (This no longer has conflicts because P is already merged) git merge X # 4.) Now squash merge temp/tst into tst git switch tst git merge --squash temp/tst # No conflicts because temp/tst is fully ahead git commit -m "Squash merge up to X"

temp/txt
分支,因为它们不会伤害任何东西。如果您这样做,也许您会调整步骤如下:
temp/prd

	
© www.soinside.com 2019 - 2024. All rights reserved.