问题描述
我在我的分支中错误地对 properties
文件夹进行了一些更改。它提交了来自多个文件的更改(包括我想要的文件)
我想从我的分支中删除所有提交到 properties
文件夹。然后我应该从 master 分支中提取更改以保持最新。
这怎么可能?
谢谢
解决方法
git 中的提交是整个存储库的不可变快照,因此您实际上需要在这里创建新提交,其中包含您做想要的更改。
执行此操作的标准工具是 git rebase,这可能会令人困惑,但非常值得了解。
1.确保您的工作副本干净
每当您运行任何会更改您的工作副本的命令时 - 例如合并、拉取、变基 - 您应该确保没有任何未提交的更改。否则,您可能会面临这些更改丢失或提交到您不希望的地方的风险。
git status
如果这显示未提交的更改,请决定是否需要它们,然后提交或丢弃它们。如果不确定是 "stash" them,这是一个相当安全的做法。
2.创建一个备份分支
如果出现问题,请创建一个保留当前历史记录的新分支,以便您知道如何返回。运行以下将创建一个名为“backup-before-rebase”的分支,指向您当前已检出的内容,但不切换到它。
git branch backup-before-rebase
3.找到要编辑的提交范围
rebase 命令将重新创建一系列提交,以您当前检出的内容结束,但它需要知道从哪里开始。这可以是:
- “main”或“master”或“develop”,或任何您“分支”的分支名称
- “HEAD~3”、“HEAD~4”等,其中的数字是您需要返回历史记录的提交次数(基于查看
git log
)
4.开始“交互式变基”
选择您决定的起点,并将其用作 git rebase -i
的参数,例如
git rebase -i main
git rebase -i master
git rebase -i HEAD~3
5.编辑说明
git 将弹出一个文本编辑器(与输入提交消息时弹出的文本编辑器相同)。每行包含三件事:
- 一个动作,默认为“pick”
- 提交哈希
- 一个描述,仅供参考,编辑它没有任何作用
在列表中找到需要修改的提交,将“pick”改为“edit”。
现在保存并退出编辑器,git 将开始运行您的指令。
6.修改提交
在您标记为“编辑”的每次提交时,git 都会停止并让您有机会进行更改。
在您的情况下,您希望更改提交以包含未更改的“属性”文件夹。首先,从已知好的副本中恢复文件 - “HEAD^”表示“当前提交的父级”,它应该在这里工作:
git restore --source=HEAD^ properties/
这就像您刚刚编辑了所有这些文件一样,因此现在我们可以将它们暂存以进行提交,但我们不是创建新提交,而是修改现有提交:
git add properties
git commit --amend
最后,我们告诉 git 进行下一步的 rebase:
git rebase --continue
7.结束
一旦到达说明的末尾,您将拥有一个新的、重写的分支。如果您已经将分支推送到某个地方,则需要“强制推送”它 - 小心这一点,它会影响从该分支拉出或分支的任何其他人:
git push --force-with-lease
如果出错
如果您在 rebase 中途陷入困境,您可以“中止”rebase 并重新开始:
git rebase --abort
如果这不能让您达到您希望的效果,您可以通过“硬重置”从之前返回到您的备份分支。这会丢弃您工作副本中的所有内容,并将当前分支指向您的备份:
git reset --hard backup-before-rebase
,
免责声明:git rebase
是一项高级操作,很难恢复原始提交。确保您了解它的作用并有备份!
使用交互式变基 (git rebase -i
) 来编辑您的“错误”提交:
git rebase -i HEAD~10 # rebase last 10 commits
将命令从“pick”更改为“edit”,用于您要...编辑的提交。然后关闭编辑器以启动 rebase。 Git 现在将在每个具有“编辑”命令的提交处停止。修复您的更改,例如检查文件夹的先前状态(git checkout HEAD^ -- properties/
,修改您的提交(git commit --amend
),然后运行 git rebase --continue
以应用下一个补丁。