gpt4 book ai didi

git - 将一个父级的提交重新定位到另一个父级

转载 作者:行者123 更新时间:2023-12-01 13:14:44 32 4
gpt4 key购买 nike

我有一个正在开发的现有存储库,但最近我学到了很多关于良好实践和 git 本身的知识。我想根据自己的喜好改变我的历史,尤其是一些早期的提交。
以下是当前历史的片段。我想将 e5cb9b8 提交重新设置到 1a92e84 上,这样我就可以在历史图中只有一/两个深度级别(视觉上,更改 e5cb9b8 的父级)。我试过 rebase

git rebase -p --onto 1a92e84 e5cb9b8 master
并选择从 9ecbe00 创建的新分支。 Cherrypicking 让我获得平坦的历史,rebase 失败并显示以下消息

error: commit ca230d8c048d22de6f219da8a22e70a773827c38 is a merge but no -m option was given.

fatal: cherry-pick failed

Could not pick ca230d8c048d22de6f219da8a22e70a773827c38

* | 45a0a21 - (7 weeks ago) #17 Updates README.md - Kamil Pacanek
|/
* ca230d8 - (8 weeks ago) Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts - Kamil Pacanek
|\
| * e5cb9b8 - (8 weeks ago) Adds support for removing parts on ReactorCells - KamilPacanek
* | 1a92e84 - (8 weeks ago) Merge pull request #1 from KamilPacanek/enable-gh-pages - Kamil Pacanek
|\ \
| |/
| * 81761ff - (8 weeks ago) Adds GH Pages support - KamilPacanek
|/
* 9ecbe00 - (8 weeks ago) Initial commit - KamilPacanek
预期的:
* | 45a0a21' - (7 weeks ago) #17 Updates README.md - Kamil Pacanek
|/
* ca230d8' - (8 weeks ago) Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts - Kamil Pacanek
|\
| * e5cb9b8' - (8 weeks ago) Adds support for removing parts on ReactorCells - KamilPacanek
|/
* 1a92e84 - (8 weeks ago) Merge pull request #1 from KamilPacanek/enable-gh-pages - Kamil Pacanek
|\
| |
| * 81761ff - (8 weeks ago) Adds GH Pages support - KamilPacanek
|/
* 9ecbe00 - (8 weeks ago) Initial commit - KamilPacanek
我在 StackOverflow 上搜索过类似的问题,似乎没有人将这种修改描述得如此深入。
解决方案
好的,对于 future 的读者和我自己,我正在写下我的问题的解决方案。 @alfunx answer是解决它的关键 - 我已经在 git rebase 的其他主题解释中找到了答案和 git rebase --onto并开始在我的存储库上进行实验。通过反复试验,我设法*通过执行来实现预期的历史图
git rebase -ir --onto 1a92e84 81761ff develop
并替换待办事项列表的后续片段
label onto

# Branch KamilPacanek/feat/rmb-support-removing-parts
reset onto
pick e5cb9b8 Adds support for removing parts on ReactorCells
label KamilPacanek/feat/rmb-support-removing-parts

# Branch enh/add-uranium-cells
reset 9ecbe00 # Initial commit
merge -C 1a92e84 onto # Merge pull request #1 from KamilPacanek/enable-gh-pages
merge -C ca230d8 KamilPacanek/feat/rmb-support-removing-parts # Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts
label branch-point
具有以下内容(更改了重置位置并删除了一个,多余的, merge 提交):
label onto

# Branch KamilPacanek/feat/rmb-support-removing-parts
reset onto
pick e5cb9b8 Adds support for removing parts on ReactorCells
label KamilPacanek/feat/rmb-support-removing-parts

# Branch enh/add-uranium-cells
reset onto
merge -C ca230d8 KamilPacanek/feat/rmb-support-removing-parts # Merge pull request #2 from KamilPacanek/feat/rmb-support-removing-parts
label branch-point
*)
实际上,要达到这种状态还有更多工作要做,但我不想用次要问题来混淆解决方案。先 git rebase该消息失败:

error: refusing to update ref with bad name 'refs/rewritten/Implement-durability-loss.'

hint: Could not execute the todo command

hint: label Implement-durability-loss.


如您所见,我在提交消息的末尾有一个句点。在我解决了这个问题之后(使用 reword 命令进行另一个 rebase ),我能够继续前进。
另外,好像是 git rebase --abort doesn't cleargit rebase -r 期间创建的 refs ..所以我的历史一团糟。通过 rm -rf .git/refs/rewritten 解决了这个问题.另一件事,我有一个剩余的 .git/sequencer 文件夹,可以通过 git revert --quit 删除。 .

最佳答案

您为 rebase 选择的基数错误,应为 81761ff而不是 e5cb9b8 .我建议你做一个交互式 rebase 并使用 --rebase-merges而不是 --preserve-merges .所以命令应该是:

git rebase -ir --onto 1a92e84 81761ff master

现在,Git 可能会产生一个额外的 merge 提交。为了避免这种情况并产生您想要的结果,您应该将待办事项列表调整为:
label onto
pick e5cb9b8 Adds support for removing parts on ReactorCells
label new
reset onto
merge -C ca230d8 new
pick 45a0a21 #17 Updates README.md
# Remaining commits...

在待办事项列表中, label可用于标记当前提交( HEAD )和 reset可用于设置 HEAD一些提交/标签。 merge显然用于产生 merge 提交, -C使 merge 使用与原始 merge 提交相同的提交消息。

这是相当高级的,对于大多数用户和用例来说确实不需要,所以请考虑 man git-rebase , 部分 Rebase Merges (或 the online version here ) 以获得更深入的信息。那里的示例实际上与您的情况非常相似。

关于git - 将一个父级的提交重新定位到另一个父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56361900/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com