我只想删除git日志中间的一个特定的提交,它不应该影响到上面的提交。
lhcgjxsq1#
它不应该受到上述提交的影响。如果你从一个分支的中间删除了一个提交,或者实际上除了分支的HEAD之外的任何地方,你将 * 重写 * 该分支的历史,这是因为你将使用的工具,即git rebase --interactive和git filter-branch,将需要重新提交您删除的提交之后的所有内容。对于公共共享分支来说,这通常是不可取的,因为它迫使每个人都采取非常严厉的措施来跟上这种变化。更安全的做法是使用git revert:
git rebase --interactive
git filter-branch
git revert
git revert <SHA-1 of commit to delete>
这将在分支的顶部添加一个 * 新 * 提交,有效地撤销中间提交所做的一切。顺便说一下,如果你真的想删除那个提交,我建议你做一个交互式的rebase。
d7v8vwbk2#
如果提交没有被推送到远程服务器,你可以使用git rebase来修改git历史记录。您可以这样做:
git rebase
git rebase -i commit-hash^
它将显示一个提交列表。第一行应该是你要删除的提交。从你编辑的文件中删除该行,保存并关闭。如果你在此之前已经推送到了远程服务器上,请注意,在你刚刚删除的提交之后的提交会根据你刚刚从历史记录中删除的提交之前的提交进行重写。由于这个特殊原因,所有的提交都会因为你的历史记录刚刚发生了分歧而被更改。所以如果你尝试推送它,它不会是快进的,你必须强制推送。出于这个原因,如果你不熟悉git rebase,我建议保持一个分支指向你修改历史的分支,以防出现错误。此外,如果某个特定的提交在多个分支中共享,那么分散一个分支的历史记录会导致多个问题,因为您无法轻松地将旧历史记录中的一个分支合并到新历史记录中的分支。这会复制许多提交,并且您在一个分支中删除的提交不会在其他分支中删除。想想看,修改git历史就像时间旅行。任何一个点的改变都创造了一个新的平行宇宙。过去改变后的一切都受到了你过去所做的改变的影响。
4xrmg8kj3#
你可以使用git cherry-pick来实现这个目的。假设你的git日志看起来像这样。你想从分支中移除第二次提交。
git cherry-pick
COMMITS MESSAGES abcd123 4th commit message xyze456 3rd commit message 98y65r4 2nd commit message wants to be removed. bl8976t 1st commit message
步骤1 -检查最后一次正确提交:git checkout bl8976t步骤2 -从此处创建新分支:git checkout -b commit-remove步骤3 -挑选你想要保留的提交:git cherry-pick xyze456和git cherry-pick abcd123第4步-检查您原来的分支:git checkout masterSTEP 5 -将原始分支重置为最后一次可用提交:git reset --hard bl8976tSTEP 6 -将新分支合并到原始分支上:git merge commit-removeSTEP 7 -检查原始分支是否有正确的提交:git logSTEP 8 -将原始分支推入远程存储库:git push -f origin master您已完成。请注意,这可能会对使用同一存储库/分支的其他用户产生不利影响。
git checkout bl8976t
git checkout -b commit-remove
git cherry-pick xyze456
git cherry-pick abcd123
git checkout master
git reset --hard bl8976t
git merge commit-remove
git log
git push -f origin master
nwlqm0z14#
如果你使用智能假设分支X类似于提交[A]〈--上次提交提交[B]提交提交[D]你想删除两个提交B和C。1-使用git log对话框右击commit D(在你想要删除的那个之前的最后一次提交),并从它创建一个新的分支,称之为Y,intellij会自动在分支Y checkoutNew branch3-你可以在git log对话框的左栏看到你的分支,右击分支X并选择Compare with currentCompare with current现在您将看到此对话框Compare dialog4-您可以右键单击commit A并选择Cherry-pickCherry pick现在,在分支Y中,你已经提交了A和D,解决了冲突,提交并推送。
4条答案
按热度按时间lhcgjxsq1#
它不应该受到上述提交的影响。
如果你从一个分支的中间删除了一个提交,或者实际上除了分支的HEAD之外的任何地方,你将 * 重写 * 该分支的历史,这是因为你将使用的工具,即
git rebase --interactive
和git filter-branch
,将需要重新提交您删除的提交之后的所有内容。对于公共共享分支来说,这通常是不可取的,因为它迫使每个人都采取非常严厉的措施来跟上这种变化。更安全的做法是使用
git revert
:这将在分支的顶部添加一个 * 新 * 提交,有效地撤销中间提交所做的一切。
顺便说一下,如果你真的想删除那个提交,我建议你做一个交互式的rebase。
d7v8vwbk2#
如果提交没有被推送到远程服务器,你可以使用
git rebase
来修改git历史记录。您可以这样做:
它将显示一个提交列表。第一行应该是你要删除的提交。从你编辑的文件中删除该行,保存并关闭。
如果你在此之前已经推送到了远程服务器上,请注意,在你刚刚删除的提交之后的提交会根据你刚刚从历史记录中删除的提交之前的提交进行重写。由于这个特殊原因,所有的提交都会因为你的历史记录刚刚发生了分歧而被更改。所以如果你尝试推送它,它不会是快进的,你必须强制推送。
出于这个原因,如果你不熟悉
git rebase
,我建议保持一个分支指向你修改历史的分支,以防出现错误。此外,如果某个特定的提交在多个分支中共享,那么分散一个分支的历史记录会导致多个问题,因为您无法轻松地将旧历史记录中的一个分支合并到新历史记录中的分支。这会复制许多提交,并且您在一个分支中删除的提交不会在其他分支中删除。
想想看,修改git历史就像时间旅行。任何一个点的改变都创造了一个新的平行宇宙。过去改变后的一切都受到了你过去所做的改变的影响。
4xrmg8kj3#
你可以使用
git cherry-pick
来实现这个目的。假设你的git日志看起来像这样。你想从分支中移除第二次提交。步骤1 -检查最后一次正确提交:
git checkout bl8976t
步骤2 -从此处创建新分支:
git checkout -b commit-remove
步骤3 -挑选你想要保留的提交:
git cherry-pick xyze456
和git cherry-pick abcd123
第4步-检查您原来的分支:
git checkout master
STEP 5 -将原始分支重置为最后一次可用提交:
git reset --hard bl8976t
STEP 6 -将新分支合并到原始分支上:
git merge commit-remove
STEP 7 -检查原始分支是否有正确的提交:
git log
STEP 8 -将原始分支推入远程存储库:
git push -f origin master
您已完成。
请注意,这可能会对使用同一存储库/分支的其他用户产生不利影响。
nwlqm0z14#
如果你使用智能
假设分支X类似于
提交[A]〈--上次提交
提交[B]
提交
提交[D]
你想删除两个提交B和C。
1-使用git log对话框右击commit D(在你想要删除的那个之前的最后一次提交),并从它创建一个新的分支,称之为Y,intellij会自动在分支Y checkout
New branch
3-你可以在git log对话框的左栏看到你的分支,右击分支X并选择Compare with current
Compare with current
现在您将看到此对话框
Compare dialog
4-您可以右键单击commit A并选择Cherry-pick
Cherry pick
现在,在分支Y中,你已经提交了A和D,解决了冲突,提交并推送。