删除 select 提交并合并或变基并添加重要提交

Delete select commits and merge or rebase and add important commits

所以我正在检查其他 solutions 但它并不完全适合我我也在处理 b运行ch 合并

git log
commit 6d034e1b1f03241b2c660312660ce29acca23f60
Author: ME <myfakemail@gmail.com>
Date:   Thu Jun 30 13:09:08 2016 +0100

    text so people click the button

commit b9295485e17ccb6662b688b5c0f796656ef5f0de
Author: Me-again <myfakemail@fakeville.com>
Date:   Wed Jun 29 17:22:33 2016 +0100

    Adding the 4th celebration to index.php

commit 01ab5a9cfcefe34e72f06f52974da96ce1c2980a
Author: Me-again <myfakemail@fakeville.com>
Date:   Wed Jun 29 12:40:37 2016 +0100

    do the status check after all stops have been performed

commit 904bfdfbc4b536d052e61a303a17e6e108b7d9fe
Author: ME <myfakemail@gmail.com>
Date:   Thu Jun 23 15:16:39 2016 +0100

    changing music to StarSpangled

commit 5874707b022fb6039df84372a750c8fc57215af1
Author: ME <myfakemail@gmail.com>
Date:   Thu Jun 23 15:15:30 2016 +0100

    Quintessential american music

commit 175d5e53c43c7175b6478070d5660e7426aeade9
Author: Me-again <myfakemail@fakeville.com>
Date:   Wed Jun 22 13:11:48 2016 +0100

    Adding error logging and messaging for stop and start

commit 630c25055044a44be304353d3d18e385fed091a3
Merge: 7019947 35eb826
Author: Not Me <notme@mail.com>
Date:   Fri Jun 17 16:57:17 2016 +0100
    Quintessential american music

commit 175d5e53c43c7175b6478070d5660e7426aeade9
Author: Me-again <myfakemail@fakeville.com>
Date:   Wed Jun 22 13:11:48 2016 +0100

    Adding error logging and messaging for stop and start

commit 630c25055044a44be304353d3d18e385fed091a3
Merge: 7019947 35eb826
Author: Not Me <notme@mail.com>
Date:   Fri Jun 17 16:57:17 2016 +0100

    Merge branch 'master' of https://github.com/ME/MyProject

commit 7019947ceea28bd80d020e062a003433529c2a5a
Author: Not Me <notme@mail.com>
Date:   Fri Jun 17 16:57:00 2016 +0100

    4th of July draft

commit 35eb826c39f8b8e0fafd51a9cebae68dd434c7eb
Merge: f0a144f 6a6937d
Author: Me-again <myfakemail@fakeville.com>
Date:   Fri Jun 17 16:26:18 2016 +0100

    Merge branch 'master' of https://github.com/ME/MyProject

    Entering the new cast iron  options

所以基本上我们有这个项目,并决定为我们的美国弟兄们添加一点 flavour/fun。唯一的事情虽然我们已经准备好了,但对项目做出了一些认真的承诺。

现在第 4 期结束了,我想删除主题内容并恢复正常

我在想我的选择是

所以我运行

git revert --no-commit 6d034e1b1f03241b2c660312660ce29acca23f60 b9295485e17ccb6662b688b5c0f796656ef5f0de    904bfdfbc4b536d052e61a303a17e6e108b7d9fe 5874707b022fb6039df84372a750c8fc57215af1 630c25055044a44be304353d3d18e385fed091a3 7019947ceea28bd80d020e062a003433529c2a5a
error: Commit 630c25055044a44be304353d3d18e385fed091a3 is a merge but no -m option was given.

据我所知,它使我处于半还原状态,只有在暂存区中删除了那些提交的编辑,但合并中引入的更改仍然存在

我是否最好只更改提交 35eb826c39f8b8e0fafd51a9cebae68dd434c7eb 然后添加

很抱歉 运行t 但如果您 git 专家处于类似情况,您会采取什么行动?

此处关于 Git 的知识:

  • Git 总是添加新内容。还原添加新的提交。变基添加新的提交。就此而言,合并会添加一个新的提交。

  • 但是 git rebase 以一种不寻常的方式添加了新的提交。它 复制 现有提交,通过将它们更改为补丁(或 mostly-equivalently,更改为 git cherry-pick 操作)然后 patch-applied 到不同的早期 更晚——起点比之前更晚。

  • 此外,git rebase 通常 跳过 合并提交。不可能以这种方式复制合并提交,因此如果您使用 --preserve 选项(试图保留合并),git rebase re-does合并,而不是试图复制它们。 (这是否有效,如果它有效,通常取决于合并最初的简单程度以及您将新 commit-chain“移动”到的位置。)

  • interactive rebase 让您可以选择要复制的提交,以及是否停止和调整副本。这意味着如果你复制一个提交链,遗漏一个“坏”的,你会得到一个永远不会做出“坏”改变的新链。它还允许您将多个提交“压缩”为一个提交,方法是应用除最后一个提交之外的所有提交的更改而不进行新提交 yet,然后使用final work-tree,以及来自所有提交的 commit-text(并让您将该文本编辑成一条消息)。

  • 一旦 rebase 完成复制提交,它就会移动 b运行ch 名称,这样它就不再指向 b运行ch 的前一个提示,而是现在指向 tip-most copied 提交。旧提交仍在您的存储库中,但效果是 好像 它们已被删除,然后 b运行ch 倒带,然后新副本添加到新的您将它们复制到的位置。

    这意味着任何其他使用原始提交的人——假设您已经发布(通常是 git push-ed)它们并且其他人拥有原件——现在必须采取一些特殊措施来说明您的“复制和倒带并指向副本”效果。

  • 最后,由于 Git 是围绕这种“添加新内容”模型构建的,如果您始终以最简单的方式添加新内容(包括普通还原),那么 Git 周围的每个人和所有事物=150=] 无需额外操作即可正常工作。

结论:还原更容易

因此,您可能确实想要还原,就像您尝试过的那样。

在我看来,您在此处的 git revert 序列中几乎做对了所有事情。你做了一件完全可选的事情——你选择了 --no-commit 这样所有的恢复都可以合并成一个大的“撤消一堆东西”提交——然后你 运行 进入了恢复合并的问题比恢复“常规”(non-merge)提交更难。

还原的工作原理

恢复合并提交更难的原因与操作机制有关。要进行还原,Git 本质上是一个“向后差异”:不是比较“之前”与“之后”,而是查看如何将旧版本更改为更新版本,Git 比较“之后”与“之前”,看看如何变回去。

要实现任一比较,Git 需要两个 commit-IDs:“之前”版本和“之后”版本。对于普通的 (non-merge) 提交,这很容易。提交本身是“之后”,它的 parent 是“之前”。 运行 git log --oneline --graph --decorate 直观地查看 parent/child 关系。注意现在普通,non-merge 提交有一个 parent。但是,合并提交有两个(或更多)parent,这意味着 git revert 不知道将哪一个视为“之前”版本。

这就是您收到 is a merge but no -m option was given 错误的原因:提交是合并,git revert 需要知道 哪些更改要撤消 ,即parent 进行比较。 (您几乎可以肯定在这里想要 -m 1。)

因为您使用了 --no-commit,Git 没有提交,而是按照命令行中指定的方式一次还原一个。然后它遇到错误并停止,因此它没有恢复该合并,也没有恢复命令行上列出的任何后续提交。

如果没有 --no-commit,Git 会执行每个还原 然后提交还原 ,当投诉失败时让您处于更明显的状态关于 -m.

不幸的是,您必须指定一个-m选项来恢复合并提交,并且您不能指定一个-m 选项来恢复 non-merge 提交。这意味着您必须使用多个 git revert 命令。

好消息是您可以继续现有的 git revert --no-commit:只需 git revert -n -m 1 <the merge>,然后每个 git revert -n额外提交(只是多做一次)。当你全部完成后,git commit 撤消一个巨大的一切的结果。

或者,如果您希望一次还原一件事——这会让您在一年后回顾时更容易看到自己在做什么,但也会让它变得更嘈杂(因此更难) ) 看看你在做什么——你可以使用 git reset --hard 返回到最近提交的 index/staging-area 和 work-tree 状态:

$ git reset --hard HEAD

当然,这假设当您开始整个 git revert 序列时所有内容(索引和 work-tree 两者)都是干净的。现在您可以:

$ git revert ...

每次提交,这次没有 -n。 (假设您已经改变了想要进行一次大逆转的想法。)

我该怎么做

请注意,您可以一次进行一个还原,然后使用 git rebase -i 将它们全部压缩成一个大的还原。这最终的工作方式与使用 git revert -n 完全相同:首先你制作了一个由六个单独的还原链组成的链,然后你将(未发布的)链折叠成一个大的还原,然后你发布(git push)最终的结果。

我可能会自己这样做,这样我就可以验证每个还原是否正常工作,查看具有六个单独提交的版本,考虑一下并决定 future-me 是否更喜欢这个或one-big-revert,然后是 rebase-and-push,或者只是推,基于此。