如何在git日志中只删除一个特定的提交

wn9m85ua  于 2022-11-20  发布在  Git
关注(0)|答案(4)|浏览(220)

我只想删除git日志中间的一个特定的提交,它不应该影响到上面的提交。

lhcgjxsq

lhcgjxsq1#

它不应该受到上述提交的影响。
如果你从一个分支的中间删除了一个提交,或者实际上除了分支的HEAD之外的任何地方,你将 * 重写 * 该分支的历史,这是因为你将使用的工具,即git rebase --interactivegit filter-branch,将需要重新提交您删除的提交之后的所有内容。对于公共共享分支来说,这通常是不可取的,因为它迫使每个人都采取非常严厉的措施来跟上这种变化。
更安全的做法是使用git revert

git revert <SHA-1 of commit to delete>

这将在分支的顶部添加一个 * 新 * 提交,有效地撤销中间提交所做的一切。
顺便说一下,如果你真的想删除那个提交,我建议你做一个交互式的rebase。

d7v8vwbk

d7v8vwbk2#

如果提交没有被推送到远程服务器,你可以使用git rebase来修改git历史记录。
您可以这样做:

git rebase -i commit-hash^

它将显示一个提交列表。第一行应该是你要删除的提交。从你编辑的文件中删除该行,保存并关闭。
如果你在此之前已经推送到了远程服务器上,请注意,在你刚刚删除的提交之后的提交会根据你刚刚从历史记录中删除的提交之前的提交进行重写。由于这个特殊原因,所有的提交都会因为你的历史记录刚刚发生了分歧而被更改。所以如果你尝试推送它,它不会是快进的,你必须强制推送。
出于这个原因,如果你不熟悉git rebase,我建议保持一个分支指向你修改历史的分支,以防出现错误。
此外,如果某个特定的提交在多个分支中共享,那么分散一个分支的历史记录会导致多个问题,因为您无法轻松地将旧历史记录中的一个分支合并到新历史记录中的分支。这会复制许多提交,并且您在一个分支中删除的提交不会在其他分支中删除。
想想看,修改git历史就像时间旅行。任何一个点的改变都创造了一个新的平行宇宙。过去改变后的一切都受到了你过去所做的改变的影响。

4xrmg8kj

4xrmg8kj3#

你可以使用git cherry-pick来实现这个目的。假设你的git日志看起来像这样。你想从分支中移除第二次提交。

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 xyze456git 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
您已完成。
请注意,这可能会对使用同一存储库/分支的其他用户产生不利影响。

nwlqm0z1

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,解决了冲突,提交并推送。

相关问题