checkout 和 cherry-pick 有什么区别?

What is the difference between checkout and cherry-pick?

我已从远程存储库中获取特定的错误修复。现在我有两个选择:

  1. git checkout FETCH_HEAD
  2. git cherry-pick FETCH_HEAD

而且我不确定这两种情况下发生了什么。我已经尝试了第一个版本,在我看来,通过这种方式我将更改从远程存储库获取到我的本地存储库,但我的本地更改似乎丢失了(我没有在代码中看到它们)。然而,第二个选项似乎可以满足我的需要(我在代码中看到了我的更改和来自远程存储库的更改)。

虽然看起来我得到了我需要的东西,但我仍然想更好地了解这两种情况下发生的情况。

我看过 this 个问题和答案,但我不明白答案,因为我不知道以下短语的意思:

  1. "working directory reflects X"
  2. "X fetches Y"

你是对的 - 在第一个命令中你只是切换到远程更改,而在最后一个你在当前分支上应用了远程更改。

除了用于不同的任务外,最显着的区别是git-cherry-pick更改分支的历史,而git checkout仅用于跳转到特定时间点(a特定提交)在分支的历史中,而不改变它。

Switch branches or restore working tree files

git-checkout 用于遍历您的分支历史记录,将 HEAD 变量指向特定的提交。它也用于在分支之间切换

Apply the changes introduced by some existing commits

git-cherrypick 另一方面用于将来自另一个分支的单个提交置于分支历史记录之上。

例如,假设您有以下分支:

master:
-------
commit1 1ae4d13257425e6a0d67f35fa13e9d76c4e6987b
Date:   Thu Feb 1 15:59:15 2018 +0200


commit2 cbc7776d5542f59e1e6c7c8a22add729b
Date:   Thu Feb 1 15:44:41 2018 +0200

branch:
-------
commit1 c591438ff5abbcebcbf9c06f47de7aa840
Date:   Thu Feb 1 15:45:24 2018 +0200

您可以使用以下方式切换到 branch 分支:

git checkout branch

branch 开始,您可以执行以下操作:

git cherry-pick 1ae4d132

在分支 commit1 的基础上从大师播放 commit1,使其成为:

branch:
-------
commit1 1ae4d13257425e6a0d67f35fa13e9d76c4e6987b
Date:   Thu Feb 1 15:59:15 2018 +0200

commit1 c591438ff5abbcebcbf9c06f47de7aa840
Date:   Thu Feb 1 15:45:24 2018 +0200

您可以使用遍历您的历史并使用 checkout 查看它的单个状态:

 git checkout c591438ff5

这将指向 HEAD 提交 c591438ff5,向您显示分支在您挑选之前的状态(但它不会更改历史记录)

签出你会从一开始就得到所有的变化,而樱桃选择你只会得到特定的变化。

cherry-pick 允许您从其他分支的顶部(或其他分支的历史记录)获取一次提交并将其应用到当前分支之上。

checkout - 在你的例子中,它完全用远程存储库中的分支替换了你的分支。 UPD。实际上,您之前的分支仍将存在于您的本地 git 存储中,但在检出当前分支后,工作目录中的所有文件将被您检出的那个分支替换。