我有这样的 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
是被子模块替换的目录,其他全部被删除。
(是的,我应该把更改藏起来,我的错)
我强烈不同意,你做得很好!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
。