Git rebase 通过将文件提取到子模块的提交

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

我有这样的 git 历史记录:

commit 027dbda16679e8c737c8ec63676aa564807cfaeb (HEAD -> master)
Author: Camden Narzt <[email protected]>
Date:   Thu Dec 19 15:36:42 2024 -0700

    migrate homebrew stuff into tap
    update setup script for new tap

commit 53d1c2147f78144098c3fc7c62f6a6f6e00063e7
Author: Camden Narzt <[email protected]>
Date:   Wed Nov 20 23:24:06 2024 -0700

    don’t push

commit 3fbb7f8af3870237627ae7d0e027697499ffa74b
Author: Camden Narzt <[email protected]>
Date:   Wed Dec 18 12:42:15 2024 -0700

    bump colima config

commit

53d1c2147f78144098c3fc7c62f6a6f6e00063e7
包含我不想推送的内容,但我将其放入提交中,以便能够更轻松地处理历史记录(是的,我应该隐藏更改,我的错)。我不想丢失
53d1c2147f78144098c3fc7c62f6a6f6e00063e7
中的更改,但不想将它们保留在历史中的位置,因为我想推动其他一切。

当我运行:

git rebase -i 3fbb7f8a
并将提交
53d1c2147f78144098c3fc7c62f6a6f6e00063e7
移动到末尾以便它是最新提交时,我从 git 收到以下错误:

error: The following untracked working tree files would be overwritten by checkout:
    homebrew/Brewfile
    homebrew/Brewfile.lock.json
    homebrew/emacs-test.el
Please move or remove them before you switch branches.
Aborting
error: could not detach HEAD

错误消息中提到的文件已被删除,然后替换为commit

027dbda16679e8c737c8ec63676aa564807cfaeb
中子模块的内容。我想继续使用子模块中的文件。奇怪的是,错误中并未提及所有移入子模块的文件。

如何将提交

53d1c2147f78144098c3fc7c62f6a6f6e00063e7
移动到最后,以便我可以将其他提交推送到远程?

Commit

53d1c2147f78144098c3fc7c62f6a6f6e00063e7
完全不涉及错误中提到的文件。

这是引入子模块的提交中的文件:

.gitmodules
Formula/awscli.rb
Formula/bdsup2sub.rb
Formula/fakeapxs.rb
Formula/libipt.rb
Formula/libxed.rb
Formula/mbuild.rb
Formula/pam-duress.rb
Formula/tiny_php.rb
Formula/vobsub2srt.rb
homebrew
homebrew/Brewfile
homebrew/Brewfile.lock.json
homebrew/Formula
homebrew/bin
homebrew/emacs-test.el
setup.sh
usr/local/bin/brew-baggage
usr/local/bin/brew-bottle-outdated
usr/local/bin/brew-clean
usr/local/bin/brew-junk

setup.sh
被修改,
.gitmodules
被添加,
homebrew
是被子模块替换的目录,其他全部被删除。

git git-submodules git-rebase
1个回答
0
投票

(是的,我应该把更改藏起来,我的错)

我强烈不同意,你做得很好!Stash 很糟糕,你绝对不应该使用它。相反,像您已经做的那样,继续将其检查为临时提交

这是处理“不推送”更改的正确方法,由于引入了子模块,您只会遇到一点冲突,并且当从提交之前移动提交时,any交互式变基会出现此问题027dbda1 到提交后 027dbda1。


我的处理方式是:

  • 在“不要推送”之上创建一个临时分支。
  • 创建一个提交,删除子模块中将存在的所有文件。
  • 恢复最后一次提交(例如,在实践中恢复为“不推送”)。
git branch move_prep 53d1c2
git switch move_prep
git rm homebrew/Brewfile homebrew/Brewfile.lock.json homebrew/emacs-test.el
git commit -m "-- remove homebrew files --"
git revert HEAD
git diff move_prep 53d1c2     # Will show no changes

现在您想要将包含提交 027dbda166 的

master
分支变基到分支
move_prep
之上。由于该分支与提交 53d1c2 相同,因此您不会遇到任何冲突。

git branch master.backup master
git rebase move_prep master

现在启动第一个交互式变基并将“--删除自制文件--”行更改为

fixup
,以便它将“不推送”提交加入到不包含以下文件的新提交中:移动到子模块,因此现在这个新提交可以在引入子模块之后移动到,没有任何问题。

# On master branch
git rebase -i 3fbb7f8af
pick 53d1c21 don’t push
fixup 1111111 -- remove homebrew files --
pick 2222222 Revert commit 1111111
pick 3333333 migrate homebrew stuff into tap

完成此操作后,我们就有了一个新的 4444444“不要推送”提交,可以毫无问题地移动它(并且应该删除相应的恢复)。 所以开始第二次交互式变基

git rebase -i 3fbb7f8af

并更改为

pick 4444444 don’t push
pick 2222222 Revert commit 1111111
pick 3333333 migrate homebrew stuff into tap

pick 3333333 migrate homebrew stuff into tap
pick 4444444 don’t push

现在你的

master
分支应该像你想要的那样(你可以删除
move_prep
master.backup
分支)。

git diff master.backup master    # Should show no difference

以上所有内容都取决于移动的提交,而不更改子模块中的任何文件。如果修改任何此类文件,这些更改将会丢失(在外部存储库中)。为了保留它们,我想我会尝试组合

git format-patch
(在提交时,自制更改已被提取为唯一的更改),编辑补丁文件中的文件名,然后在子模块内编辑
git am

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.