Git 交互式 Rebase 使用子树拆分提交

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

我有以下 git 历史记录:

|    Merge (HEAD)
|\   SubTree Add (Squashed)
|    ** Git Commit I need to Split Into Two Commits **
|    Git Commit 1

我正在尝试清理一下我的 git 历史记录,并且我有一个提交,我想使用交互式变基将其分成两个提交。

git rebase -i HEAD~3
git reset HEAD^

问题是我与项目的 .gitignore 文件和我从远程拉入的子树发生变基冲突。我意识到这是由于 rebase 不保留合并,这就是为什么线性文件历史记录中的两个项目存在文件冲突的原因。我进一步挖掘,发现有一个 --rebase-merges 标志来保留合并。

git rebase -i HEAD~3 --rebase-merges

当我运行此命令时,我从未进入交互模式,该命令也不会失败,它只是将自身重新设置为完全相同的存储库,并且我永远无法进行无济于事的编辑。

不确定我的方法是否错误,但目标是根据需要拆分我以前的提交并尊重我的子树项目和后续合并而不会发生冲突。

我熟悉变基,但不熟悉涉及的子树。我哪里错了?

更新: VSCode 似乎在变基方面存在一些奇怪的问题。我必须为我的 git 配置添加 sequence.editor 'code -w' 设置,以便让 vscode 停止并等待交互式变基。

话虽如此,我再次尝试根据需要重新调整我的提交,并取得了成功。但是,即使使用 --rebase-merges 标志,变基仍然会因文件冲突而失败。

git git-rebase git-subtree
1个回答
0
投票
在这种情况下,

git rebase
不会有太大帮助。问题是
--rebase-merges
使用了
git merge
也使用的通常合并策略,但是需要完全不同地对待这种子树合并。

您最好的选择可能是:

  1. 在子树合并之前重置分支,这也恰好是您要拆分的提交:
    git reset --hard HEAD~2
    ,但首先验证您没有任何未提交的更改。
  2. 然后您就可以对该提交执行需要完成的操作。
  3. 最后你只需重复
    git subtree add
    命令即可。
  4. 如果您在发布问题后在顶部构建了进一步的提交,您只需将它们挑选到重建的分支即可。
© www.soinside.com 2019 - 2024. All rights reserved.