删除 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 期结束了,我想删除主题内容并恢复正常
我在想我的选择是
- 还原所有第 4 个相关提交
- 变基并将两个重要的提交添加回代码
所以我运行
git revert --no-commit 6d034e1b1f03241b2c660312660ce29acca23f60 b9295485e17ccb6662b688b5c0f796656ef5f0de 904bfdfbc4b536d052e61a303a17e6e108b7d9fe 5874707b022fb6039df84372a750c8fc57215af1 630c25055044a44be304353d3d18e385fed091a3 7019947ceea28bd80d020e062a003433529c2a5a
error: Commit 630c25055044a44be304353d3d18e385fed091a3 is a merge but no -m option was given.
据我所知,它使我处于半还原状态,只有在暂存区中删除了那些提交的编辑,但合并中引入的更改仍然存在
我是否最好只更改提交 35eb826c39f8b8e0fafd51a9cebae68dd434c7eb
然后添加
01ab5a9cfcefe34e72f06f52974da96ce1c2980a
175d5e53c43c7175b6478070d5660e7426aeade9
很抱歉 运行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,或者只是推,基于此。
所以我正在检查其他 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 期结束了,我想删除主题内容并恢复正常
我在想我的选择是
- 还原所有第 4 个相关提交
- 变基并将两个重要的提交添加回代码
所以我运行
git revert --no-commit 6d034e1b1f03241b2c660312660ce29acca23f60 b9295485e17ccb6662b688b5c0f796656ef5f0de 904bfdfbc4b536d052e61a303a17e6e108b7d9fe 5874707b022fb6039df84372a750c8fc57215af1 630c25055044a44be304353d3d18e385fed091a3 7019947ceea28bd80d020e062a003433529c2a5a
error: Commit 630c25055044a44be304353d3d18e385fed091a3 is a merge but no -m option was given.
据我所知,它使我处于半还原状态,只有在暂存区中删除了那些提交的编辑,但合并中引入的更改仍然存在
我是否最好只更改提交 35eb826c39f8b8e0fafd51a9cebae68dd434c7eb 然后添加
01ab5a9cfcefe34e72f06f52974da96ce1c2980a
175d5e53c43c7175b6478070d5660e7426aeade9
很抱歉 运行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,或者只是推,基于此。