跳过提交并在 Git

Skip a commit and in Git

在我的项目中,其中一个提交引入了一个我找不到的错误。我想忽略其中的所有内容并从其他提交继续。

Commit1:工作正常。

Commit2:不起作用。引入了一个错误。

Commit3:由于提交 2 上的错误而无法工作。

我的问题是如何在不更改提交 2 的情况下检出提交 3?

如果这是未推送的历史记录,您可以使用 git rebase --onto commit1 commit2 commit3 从历史记录中删除 commit2。如果这已经是已发布的历史记录,您应该使用 git revert commit2 恢复 commit2 的更改。或者,如果您只想在本地临时拥有它,您可以签出 commit3 然后执行 git revert commit2 -n 这也会撤消更改但不会创建提交。

与 Git 中的大多数操作一样,您可以使用多种方法来完成:

  • 还原错误的提交

    git revert <commit2>
    
  • 如果这个错误的提交没有被推送到远程服务器(否则你最好恢复并立即推送以修复它!=),并且你想将你的工作保留在某个地方并稍后修复它,您还可以创建一个新的本地分支,挑选正确的提交并继续您的工作

    git checkout -b "myNewBranch" <commit1>
    git cherry-pick <commit3> 
    
  • 如果你有不止一个 commit 到 cherry-pick,rebase 更方便

    ###create your branch but do not check it out yet.
    git branch "myNewBranch" <commit1> 
    git rebase <commit2> --onto "myNewBranch"
    

    这将获取从 commit2(已排除)开始的所有提交,并将它们一一应用到您的新分支上。

如果您不习惯使用 git 命令行并使用 gui,您可以使用 gitk 轻松完成。这将适用于简单的操作,例如还原和 cherrypicks。

最后一个建议,当从 Git 开始时: 你可能会做错事并弄乱你的工作区,你总是可以回到以前的情况,一旦它在提交中被版本化,使用:

git reflog
//locate your commit and copy the sha key
git reset --hard mykey

知道了这些,玩命令的时候就不要犹豫了,只要不push就安全了;)

您可以使用 interactive rebase 从提交历史 中删除 commit2。详细步骤如下(假设 3 次提交在 master 分支上):

git checkout master
git rebase -i HEAD~3

然后会有互动展示window。输入 i 并将那里的提交更改为:

pick <commit1 sha-1> commit1 message
drop <commit2 sha-1> commit2 message
pick <commit3 sha-1> commit3 message

然后输入Esc键并输入:wq.

现在commit2被移除,你会发现commit3的变化是基于commit1.