kef_rem Asked: 2025-04-16 09:19:40 +0800 CST2025-04-16 09:19:40 +0800 CST 2025-04-16 09:19:40 +0800 CST 如何移除/删除新分支上的唯一提交?[重复] 772 我创建了一个新分支,想在不影响主分支的情况下修改代码。结果什么也没做,所以我回到了主分支继续工作,没有带上任何修改。新分支上只有一个提交,但我希望它从提交历史记录中移除! 提交已推送至远程仓库,因此其中存在一个源指针。我不确定这是否与此有关。求助! git rebase -i <commit id>它对我没有任何作用,只是提示我修改较新的分支。我尝试在提交的分支和父分支上运行它。 git 4 个回答 Voted UncleMelo 2025-04-16T12:01:01+08:002025-04-16T12:01:01+08:00 # 撤消最后一次提交但保留更改 git reset --soft HEAD~1 # 撤消最后一次提交并取消暂存文件(但保留更改) git reset --mixed HEAD~1 # 完全删除最后一次提交并放弃更改 git reset --hard HEAD~1 Best Answer grawity_u1686 2025-04-16T13:15:38+08:002025-04-16T13:15:38+08:00 提交已推送至远程仓库,因此其中存在一个源指针。我不确定这是否与此有关。求助! 是的——可以将它们视为两个半独立的分支;“原点指针”代表同名的远程分支。因此,您必须从本地分支中删除提交,并将更新推送到相应的远程分支(这也会更新您本地的“原点”指针)。 我认为 rebase 在这里没什么用。你不需要重写任何提交,就像从中间删除一个提交时那样——它d9e7124不会链接不需要的提交——你删除的提交除了分支指针之外没有被任何其他东西引用,所以只需更新分支指针就可以从末尾截断。 因此,如果分支当前已签出并且您想要将其回滚: git reset [--keep] d076a2e 如果不带任何选项,该提交的更改将恢复为未提交的更改。添加--keep将丢弃已提交的更改,但保留未提交的更改。使用--hard将丢弃已提交的更改和未提交的更改,将所有文件精确地返回到指定的提交。 另一方面,如果您当前位于不同的分支(例如回到主/主),您可以重新创建侧分支;可选择指定不同的起点: git branch --force BranchName [starting_point_commit] -or- git branch --delete BranchName 无论哪种方式,更新都需要强制推送到远程 - 或者如果您不再需要它在服务器上,您可以推送分支删除。 git push --force origin BranchName -or- git push --delete origin BranchName 提交136b98cID 将会在您的存储库存储中保留一段时间(因此如果需要的话可以将其重新附加到分支),但最终它会在几周后被垃圾收集。 Jasvinder singh 2025-04-16T11:55:15+08:002025-04-16T11:55:15+08:00 git rebase -i <commit id>不起作用。这可能是由于指定了错误的父提交或在错误的分支上运行了命令。我们将使用正确的父提交136b9 由于136b9在新分支上只有一个提交,因此可以使用交互式 rebase 来删除它,同时保留其他提交136b9 切换到包含136b9 git checkout <branch-name> 开始交互式变基 git rebase -i d076a 编辑器打开后 pick d9e71 <message for d9e71> # remove line for 136b9 or change pick to drop 如果136b9引入了后续提交所依赖的更改,Git 可能会因冲突而暂停变基。如果发生冲突,请通过编辑冲突的文件来解决。 解决所有冲突后 git add . git rebase --continue 推送到新分支 git push origin new-branch --force 如果136b9不包含在主分支的历史记录中,则主分支将保持不变,其提交(例如 7D71D、d9e71、d076a、97433、06de3)也将保持原样。但是,如果 new-branch 已合并到main并且136b9已经包含在main的历史记录中,136b9则从 new-branch 中移除不会自动影响主分支——您需要显式修改主分支的历史记录才能将136b9其移除。删除该提交后,如果需要,您也可以删除 new-branch。 eftshift0 2025-04-16T14:06:21+08:002025-04-16T14:06:21+08:00 如果提交已经创建,只需从中创建一个新的孤立分支并提交: git checkout -b --orphan a-new-branch git add . git commit -m "Here's a new commit on a branch new branch"
# 撤消最后一次提交但保留更改
git reset --soft HEAD~1
# 撤消最后一次提交并取消暂存文件(但保留更改)
git reset --mixed HEAD~1
# 完全删除最后一次提交并放弃更改
git reset --hard HEAD~1
是的——可以将它们视为两个半独立的分支;“原点指针”代表同名的远程分支。因此,您必须从本地分支中删除提交,并将更新推送到相应的远程分支(这也会更新您本地的“原点”指针)。
我认为 rebase 在这里没什么用。你不需要重写任何提交,就像从中间删除一个提交时那样——它
d9e7124
不会链接不需要的提交——你删除的提交除了分支指针之外没有被任何其他东西引用,所以只需更新分支指针就可以从末尾截断。因此,如果分支当前已签出并且您想要将其回滚:
如果不带任何选项,该提交的更改将恢复为未提交的更改。添加
--keep
将丢弃已提交的更改,但保留未提交的更改。使用--hard
将丢弃已提交的更改和未提交的更改,将所有文件精确地返回到指定的提交。另一方面,如果您当前位于不同的分支(例如回到主/主),您可以重新创建侧分支;可选择指定不同的起点:
无论哪种方式,更新都需要强制推送到远程 - 或者如果您不再需要它在服务器上,您可以推送分支删除。
提交
136b98c
ID 将会在您的存储库存储中保留一段时间(因此如果需要的话可以将其重新附加到分支),但最终它会在几周后被垃圾收集。由于
136b9
在新分支上只有一个提交,因此可以使用交互式 rebase 来删除它,同时保留其他提交136b9
切换到包含
136b9
开始交互式变基
编辑器打开后
如果
136b9
引入了后续提交所依赖的更改,Git 可能会因冲突而暂停变基。如果发生冲突,请通过编辑冲突的文件来解决。解决所有冲突后
推送到新分支
如果
136b9
不包含在主分支的历史记录中,则主分支将保持不变,其提交(例如 7D71D、d9e71、d076a、97433、06de3)也将保持原样。但是,如果 new-branch 已合并到main
并且136b9
已经包含在main
的历史记录中,136b9
则从 new-branch 中移除不会自动影响主分支——您需要显式修改主分支的历史记录才能将136b9
其移除。删除该提交后,如果需要,您也可以删除 new-branch。如果提交已经创建,只需从中创建一个新的孤立分支并提交: