是否可以根据方便多次保留或删除提交?

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

我的分支看起来像这样

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 等等。

git rebase
2个回答
0
投票

我认为 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

注释

  1. 我使用“提交”和“补丁”有点松散,但最好考虑一下 这些东西作为补丁,因为这就是它们的应用方式(推送) 和未应用(弹出)

0
投票

将您的分支重新排序为

B1 --- B3 --- B4 --- B2

因此您的临时 B2 提交位于正常提交之上。

是的,您可能会因此而遇到一些冲突1,但在任何情况下,这些冲突都会在某个时刻发生(例如,当您想稍后删除 B2 以便交付时)。


假设您的 Bx 提交分支名为

myfeature
,作为工作流程,您可以创建一个指向 B2 的
myfeature.testing
分支,并在上面的示例中让
myfeature
“仅”指向 B4。

然后稍后 B5 和 B6 都会向你承诺

  1. myfeature
    上创建这些提交,然后运行
    git rebase myfeature myfeature.testing

例如来自

B1 --- B3 --- B4 --- B5 --- B6
                \           ^ myfeature
                 +-- B2
   myfeature.testing ^

B1 --- B3 --- B4 --- B5 --- B6 --- B2
                  myfeature ^      ^ myfeature.testing
  1. 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
  1. 与 2) 相同,但在准备交付工作结束之前不进行交互式变基,只需删除变基中的 B2。

例如来自

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来解决这些问题

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