checkout 和 cherry-pick 有什么区别?
What is the difference between checkout and cherry-pick?
我已从远程存储库中获取特定的错误修复。现在我有两个选择:
git checkout FETCH_HEAD
git cherry-pick FETCH_HEAD
而且我不确定这两种情况下发生了什么。我已经尝试了第一个版本,在我看来,通过这种方式我将更改从远程存储库获取到我的本地存储库,但我的本地更改似乎丢失了(我没有在代码中看到它们)。然而,第二个选项似乎可以满足我的需要(我在代码中看到了我的更改和来自远程存储库的更改)。
虽然看起来我得到了我需要的东西,但我仍然想更好地了解这两种情况下发生的情况。
我看过 this 个问题和答案,但我不明白答案,因为我不知道以下短语的意思:
- "working directory reflects X"
- "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 存储中,但在检出当前分支后,工作目录中的所有文件将被您检出的那个分支替换。
我已从远程存储库中获取特定的错误修复。现在我有两个选择:
git checkout FETCH_HEAD
git cherry-pick FETCH_HEAD
而且我不确定这两种情况下发生了什么。我已经尝试了第一个版本,在我看来,通过这种方式我将更改从远程存储库获取到我的本地存储库,但我的本地更改似乎丢失了(我没有在代码中看到它们)。然而,第二个选项似乎可以满足我的需要(我在代码中看到了我的更改和来自远程存储库的更改)。
虽然看起来我得到了我需要的东西,但我仍然想更好地了解这两种情况下发生的情况。
我看过 this 个问题和答案,但我不明白答案,因为我不知道以下短语的意思:
- "working directory reflects X"
- "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 存储中,但在检出当前分支后,工作目录中的所有文件将被您检出的那个分支替换。