checkout和cherry-pick有什么区别?

时间:2018-02-05 09:56:26

标签: git git-cherry-pick git-fetch

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

  1. git checkout FETCH_HEAD
  2. git cherry-pick FETCH_HEAD
  3. 我不确定两种情况都发生了什么。我已经尝试了第一个版本,它在我看来,通过这种方式,我从远程存储库获取了更改到我的本地存储库,但我的本地更改似乎丢失了(我在代码中没有看到它们)。但是,第二个选项似乎可以满足我的需求(我在代码中看到了我的更改和远程存储库中的更改)。

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

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

    1. "工作目录反映了X"
    2. " X取Y"

3 个答案:

答案 0 :(得分:3)

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

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

  

切换分支或恢复工作树文件

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

  

应用某些现有提交引入的更改

另一方面,

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,在您挑选之前显示分支的状态(但它不会改变历史记录

答案 1 :(得分:1)

看看你会从一开始就得到所有的变化,而Cherry会选择你的具体变化。

答案 2 :(得分:1)

cherry-pick允许您从其他分支的顶部(或从其他分支的历史记录)中提取一个提交,并将其应用于您当前的分支。

checkout - 在您的情况下,它完全用远程存储库中的分支替换您的分支。 的 UPD 即可。实际上你以前的分支仍然存在于你的本地git存储中,但在结账后你当前的分支,你工作目录中的所有文件将被你所结账的那个分支替换。