我的分支看起来像这样
M1 --- M2 --- M3 --- ............. --- M50 --- M51
\
\
B1 --- B2 --- B3 --- B4
这里 M 是主提交, B 是分支提交
提交 B2 包含更改,我在其中检查各种函数和 src 文件等中的执行时间、线程 ID 等。因此,不应合并提交 B2。
在我的开发工作中,在添加 B3 后,我希望对 B2 进行更改以在本地进行测试,但是当我推送 B3 或 B4 并进行构建时,我不希望对 B2 进行更改。同样,如果其他人从我的 B3 或 B4 提交创建分支,我不希望他们进行 B2 更改。
所以B2是一个我需要添加、删除、添加、删除多次的提交。有没有简单的方法可以实现这一目标?
我考虑重新排序提交并将 B2 保留在顶部,然后进行软重置。但由于 B3 和 B4 等也位于相同的 src 文件中,因此当我进行交互式 rebase 时经常会出现合并冲突。
提前致谢。
P.S:目前我已将 B2、B3、B4 推送到远程。接下来我想删除 B2,添加 B5(用于构建),添加 B2(本地测试)以及类似的 B6 等等。
我认为 Stacked Git/StGit (命令
stg
)非常适合这个
工作流程。
Stacked Git 是一个堆栈补丁管理器,它扩展了 Git 工作流程。基本上它可以很容易地操纵提交的内容 你的“堆栈”,这是你的分支上任何深度的最后一次提交 你要。假设您有时想要使用三个补丁[1] 有时不是:如果它们是您最近的提交,那么您运行:
stg uncommit -n 3
以便这三个提交成为您可以推送和的补丁 流行音乐。现在它们将被压入堆栈,但您可以弹出它们 使用他们的名字(基于他们的提交消息)。
stg repair
Stacked Git 只是一个使用 Git 存储库的应用程序。所以保留 请记住,如果您运行一些 git(1) 命令,它可能会变得混乱 影响堆栈。说一下你运行的三个应用的补丁堆栈 git-rebase(1) 并将它们压缩为一次提交:这些只是 Git 承诺,所以它不会妨碍他们。下次你跑步的时候 stg(1),它可能会对你的堆栈发生了什么感到困惑,因为它 与自己记录的元数据不匹配。
使用
stg repair
来解决此类问题/困惑。我不记得跑步了
陷入 Stacked Git 过于混乱而无法自行恢复的情况。
您可能需要从存储库手动安装此程序。这 原因是它最近被重写了,你的包 经理可能正在使用旧版本。我更喜欢重写,因为 命令现在感觉“即时”,而不是花费可能超过一百个 毫秒。这对于这种 CLI 应用程序很重要。
cd /tmp
tmp=$(mktemp -d)
cd $tmp
git init
git commit --allow-empty -m1
# After the first commit
stg init
printf 'temporary, dev-only change\n' > dev-only.txt
git add dev-only.txt
git commit -mTEMP
# Now you can pop and push “TEMP” on the stck
stg uncommit
# Remove it
# (The name is based on the commit message)
stg pop
# Put it back
stg push
将您的分支重新排序为
B1 --- B3 --- B4 --- B2
因此您的临时 B2 提交位于正常提交之上。
是的,您可能会因此而遇到一些冲突1,但在任何情况下,这些冲突都会在某个时刻发生(例如,当您想稍后删除 B2 以便交付时)。
假设您的 Bx 提交分支名为
myfeature
,作为工作流程,您可以创建一个指向 B2 的 myfeature.testing
分支,并在上面的示例中让 myfeature
“仅”指向 B4。
然后稍后 B5 和 B6 都会向你承诺
myfeature
上创建这些提交,然后运行 git rebase myfeature myfeature.testing
。例如来自
B1 --- B3 --- B4 --- B5 --- B6
\ ^ myfeature
+-- B2
myfeature.testing ^
到
B1 --- B3 --- B4 --- B5 --- B6 --- B2
myfeature ^ ^ myfeature.testing
myfeature.testing
上创建这些提交,然后运行 git rebase --interactive myfeature
将 B2 重新排序为 HEAD,然后运行 git checkout myfeature; git merge --ff myfeature.testing^
将 myfeature
带到 B6(或任何最新的提交,仅排除 B2 提交)。例如来自
B1 --- B3 --- B4 --- B2 --- B5 --- B6
^ myfeature ^ myfeature.testing
到
B1 --- B3 --- B4 --- B5 --- B6 --- B2
myfeature ^ ^ myfeature.testing
例如来自
B1 --- B3 --- B4 --- B2 --- B5 --- B6
^ myfeature ^ myfeature.testing
到
B1 --- B3 --- B4 --- B5 --- B6
^ myfeature ^ myfeature.testing
然后
git checkout myfeature; git merge --ff myfeature.testing
B1 --- B3 --- B4 --- B5 --- B6
^ myfeature.testing
^ myfeature
1我建议使用KDiff3来解决这些问题。