繁体   English   中英

我可以删除 git 提交但保留更改吗?

[英]Can I delete a git commit but keep the changes?

在我的一个开发分支中,我对我的代码库进行了一些更改。 在我能够完成我正在处理的功能之前,我不得不将我当前的分支切换到 master 以演示一些功能。 但是仅仅使用“git checkout master”就保留了我在我的开发分支中所做的更改,从而破坏了 master 中的一些功能。 所以我所做的是使用提交消息“临时提交”在我的开发分支上提交更改,然后为演示签出 master。

现在我已经完成了演示并回到我的开发分支上工作,我想删除我所做的“临时提交”,同时仍然保留我所做的更改。 那可能吗?

就这么简单:

git reset HEAD^

注意:某些 shell 将^视为特殊字符(例如,某些 Windows shell 或启用了通配符的 ZSH ),因此在这些情况下您可能需要引用"HEAD^"

没有--hard--soft git reset将您的HEAD移动到指定的提交,而不更改任何文件。 HEAD^指的是当前提交的(第一个)父提交,在您的情况下是临时提交之前的提交。

请注意,另一种选择是照常进行,然后在下一个提交点运行:

git commit --amend [-m … etc]

这将改为编辑最近的提交,具有与上述相同的效果。

请注意,如果您已经将错误提交推送到其他人可能已将其拉出的地方,则这(与几乎每个 git 答案一样)可能会导致问题。 尽量避免这种情况

有两种处理方法。 哪个更容易取决于你的情况

重启

如果您想删除的提交是最后一次提交,并且您还没有做任何额外的工作,您可以简单地使用git-reset

git reset HEAD^

将您的分支带回当前 HEAD 之前的提交。 但是,它实际上并没有更改工作树中的文件。 结果,该提交中的更改显示为已修改 - 它就像一个“取消提交”命令。 事实上,我有一个别名来做到这一点。

git config --global alias.uncommit 'reset HEAD^'

然后你可以在未来使用git uncommit来备份一次提交。

压扁

压缩提交意味着将两个或多个提交合并为一个。 我经常这样做。 在您的情况下,您提交了一个已完成的功能,然后您将完成它并使用正确的永久提交消息再次提交。

git rebase -i <ref>

我在上面说是因为我想明确表示这可能是任意数量的提交。 运行git log并找到要删除的提交,复制其 SHA1 并使用它代替<ref> Git 将带您进入交互式 rebase 模式。 它将显示您当前状态与您放置的任何内容之间的所有提交<ref> 所以如果<ref>是 10 次提交前,它会显示所有 10 次提交。

在每次提交之前,它都会有单词pick 找到您想要删除的提交并将其从pick更改为fixupsquash 使用fixup简单地丢弃提交消息并将更改合并到列表中的直接前任中。 squash关键字做同样的事情,但允许您编辑新组合提交的提交消息。

请注意,当您退出编辑器时,提交将按照它们在列表中显示的顺序重新提交。 因此,如果您进行了临时提交,然后在同一分支上进行了其他工作,并在以后的提交中完成了该功能,那么使用 rebase 将允许您重新排序提交并压缩它们。

警告:

变基会修改历史记录 - 不要对您已经与其他开发人员共享的任何提交执行此操作。

藏匿

将来,为了避免这个问题,可以考虑使用git stash来临时存储未提交的工作。

git stash save 'some message'

这会将您当前的更改存储在您的存储列表中。 上面是 stash 命令的最明确的版本,允许使用注释来描述您要存储的内容。 您也可以简单地运行git stash而不执行其他任何操作,但不会存储任何消息。

您可以使用...

git stash list

这将向您显示所有的 stash,它们在哪些分支上完成,以及每行开头的消息和该 stash 的标识符,它看起来像这个stash@{#}其中 # 是它在stash@{#}数组中的位置.

要恢复存储(可以在任何分支上完成,无论最初创建存储在哪里),您只需运行...

git stash apply stash@{#}

同样,# 是存储数组中的位置。 如果要恢复的存储位于0位置 - 也就是说,如果它是最近的存储。 然后你可以直接运行命令而不指定存储位置,git 会假设你的意思是最后一个: git stash apply

因此,例如,如果我发现自己在错误的分支上工作 - 我可能会运行以下命令序列。

git stash
git checkout <correct_branch>
git stash apply

在您的情况下,您在分支周围移动了更多,但同样的想法仍然适用。

希望这可以帮助。

我想你正在寻找这个

git reset --soft HEAD~1

它撤消最近的提交,同时保留在该提交中所做的更改以进行暂存。

是的,您可以删除您的提交而不删除更改:

git reset @~

您正在寻找git reset HEAD^ --softgit reset HEAD^ --mixed

文档中所述,重置命令有 3 种模式:

git reset HEAD^ --soft

撤消git commit 工作树(项目文件夹)+索引(--cached)中仍然存在更改

git reset HEAD^ --mixed

撤消git commit + git add 工作树中仍然存在更改

git reset HEAD^ --hard

就像您从未对代码库进行过这些更改一样。 更改从工作树中消失了。

2020 简单方法:

git reset <commit_hash>

(您要保留的最后一次提交的提交哈希)。

如果提交被推送,您可以执行以下操作:

git push -f

您将在本地保留现在未提交的更改

就我而言,我已经推送到 repo。 哎哟!

您可以通过执行以下操作,在将更改保留在本地文件中的同时还原特定提交:

git revert -n <sha>

通过这种方式,我能够保留我需要的更改并取消已经推送的提交。

对于使用 zsh 的用户,您必须使用以下内容:

git reset --soft HEAD\\^

在这里解释: https : //github.com/robbyrussell/oh-my-zsh/issues/449

如果 URL 失效,重要的部分是:

转义命令中的 ^

你也可以使用 HEAD~ 这样你就不必每次都逃避它。

使用 git 2.9(确切地说是 2.9.2.windows.1) git reset HEAD^提示更多; 不确定这里的预期输入是什么。 请参考以下截图

在此处输入图片说明

找到其他解决方案git reset HEAD~#numberOfCommits使用它我们可以选择通过保持更改不变来选择要重置的本地提交数量。 因此,我们有机会丢弃所有本地提交以及有限数量的本地提交。

请参阅以下屏幕截图,显示git reset HEAD~1正在运行: 在此处输入图片说明

在此处输入图片说明

另一种方法来做到这一点。

在临时提交的顶部添加提交,然后执行:

git rebase -i

将两个提交合并为一个(命令将打开带有明确说明的文本文件,对其进行编辑)。

在某些情况下,我只想在第一次提交时撤消对特定文件的更改,以将它们添加到第二次提交并拥有更干净的 git 日志。

在这种情况下,我要做的是:

git checkout HEAD~1 <path_to_file_to_put_in_different_commit>
git add -u
git commit --amend --no-edit
git checkout HEAD@{1} <path_to_file_to_put_in_different_commit>
git commit -m "This is the new commit"

当然,即使在rebase -i的中间,这也能很好地工作,并且在提交拆分时带有编辑选项。

首先,您可以使用以下命令查看日志 -

git reflog

这显示了所有提交,然后找出要撤消的提交以及与之关联的 Head 编号,然后输入以下命令

git reset HEAD@{#NumberOfCommitYouWantToUndo} 

例如git reset HEAD@{3}

git reset HEAD@{#} 显示重置后所有未暂存的更改

如果您想更新提交的历史记录或想要添加新的提交并删除以前的提交,请使用此代码

  1. 此命令将打印最后一次提交 hash 例如 fa386d8eaa4bde4a4a2912ef96aad6df31f4d4cc

    git log

  2. 重置你的最后一次提交。 注意:它不会删除任何更改并保留新旧更改。 仅删除最后的提交消息

    git reset 629f9dfb47620a1794f5edf816762f8e30668498

  3. 添加所有更改的文件

    git add.

  4. 提交您的消息

    git commit -m "Your_new_commit_message_here"

  5. 强制推送,因为您之前已经推送过,并使用相同的 git 日志命令进行检查

    git push -f origin Your_Branch_Name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM