考虑这个仓库提交结构
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 应该只查看提交的子集,但我想不妨问问。
假设
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