"git fetch && git checkout" 和 "git checkout" 有什么区别?

27

我们应该总是像这样做:

git fetch && git checkout

或者仅仅,

git checkout

?

例如,在Bitbucket中从分支进行检出时,他们提供以下命令:

enter image description here

git fetch && git checkout develop

但如果只用

git checkout

命令不就可以达到相同的效果吗?为什么还需要这个呢?

6个回答

18

在这里介入一下,因为我每天都要为多个项目和多个分支使用Bitbucket,所以我会给你我的建议。

如果你从Bitbucket上checkout(即创建一个分支),那么你应该可以使用他们提供的命令,就像你在示例中复制的那样。 但是,由于初始checkout之后很可能会切换分支、创建分支,你的本地库将失去同步,我建议您使用以下终端命令:

  1. git checkout develop或者你需要的任何分支
  2. git fetch && git pull 即获取所有分支和最新更改,以及从你当前的分支中拉取所有更改。

是的,这看起来像是重复的工作,但是从Bitbucket的工作经验来看,这是确保你拥有你正在操作的分支的最新内容的最安全、最合理的方式。

话虽如此,你应该总是创建分支,而不是直接推送到你的developmaster分支。

假设你在develop分支上,并且你已经通过切换分支、获取和拉取最新内容完成了上述操作,然后你可以使用标准的git checkout -b my-feature-branch从主分支上创建一个分支。

以下是我们公司的做法示例:

  1. git checkout develop
  2. git fetch && git pull
  3. git checkout -b feature/JIRA_ISSUE_NUMBER-update-layout-for-this-page
  4. 现在,您已经检出了develop分支,拉取了所有最新的更改和远程分支,并从该develop分支创建了一个特性分支。
    希望这可以帮助您。

git pull已经包含了fetch操作 - undefined

10

git fetch 命令会拉取在 Bitbucket(本例中)上创建的远程分支的引用。

git checkout 命令将当前目录切换到特定的分支或特定的提交(根据参数而定)。

这里发生了什么?当您在 bitbucket 上创建一个分支时,他们会提供给您该命令,因为: 1- 该分支是在远程存储库上创建的。您的本地存储库副本尚未拥有该新分支。这就是 git fetch 命令的用途。 2- Bitbucket 假定,由于您刚刚创建了该新分支,您将立即在其上工作,并且需要告诉您的本地存储库。这就是 git checkout 命令的用途。

这不是实现它的唯一方法。例如,您可以通过使用以下方式避免使用 git fetch 命令:

git checkout -b {new_branch_name} && git pull origin {new_branch_name}

这可能不是最实用的方法,但可能会让您对这些命令的工作原理有更好的了解。


6
问题在于缺少一个步骤,你需要三个步骤才能正确地切换工作分支。如果你只按照帖子中描述的两个步骤进行操作,那么就会遇到一些问题。
为了简单易懂地解释,如果你想在本地工作于名为“devA”的分支上,则需要三个步骤:
步骤1:`git fetch --all`,尽管你可以技术上只获取这一个分支。但养成习惯总是获取所有内容是个好主意。此命令让Git查找在线存储库的状态,通常应在任何操作之前执行。很多人会运行自动化脚本,每分钟轮询在线存储库状态。
例如,如果你直接跳过第一步,转而执行第二步,那么很可能会返回错误信息,告诉你该分支实际上不存在。或者切换到已过时的版本,并误报告你与在线存储库同步,导致你认为不需要执行第三步。
步骤2:`git checkout devA`,这只是将你的Git切换到该分支上,非常简单。
步骤3:`git pull`,这实际上是将当前工作的分支(参见步骤2)更新至在线存储库。如果不这样做,下次提交更改时就会意外破坏一些东西。但是,如果这是你在当前机器上首次检出分支,则不需要使用此命令。
基于以上内容,回到原始问题:
`git fetch && git checkout` = 首先找出存储库的状态,然后切换到一个分支。
`git checkout` = 不费心地查找存储库的状态,尝试切换到一个分支。这可能会告诉你该分支不存在。或者在误报告你与存储库同步时,切换到已过时的分支版本。

5
具体针对您的问题,当您从bitbucket分支进行检出时,他们提供以下命令:git fetch && git checkout develop。这是因为develop分支在云端或远程创建,除非您从远程获取更新,否则它将不会在本地机器上可用。
因此,要切换或检出到develop分支,您首先需要获取所有远程更新以了解develop分支的存在。一旦您执行了获取操作,您的本地存储库将知道在远程创建了新分支;当您检出develop分支时,它将设置一个新的本地分支来跟踪其远程对应项。

3

git fetch 会从远程位置拉取所有更改。

git checkout 可以切换到不同的分支(或恢复文件到之前的状态,这取决于你的使用方式)。

使用 fetch 和 checkout 来切换分支并拉取所有更新的文件。只使用 checkout 来切换分支,但仍然继续在本地版本上工作。


1

git fetch 命令会从远程更新 origin/<branch_name>。而 git checkout 命令可以用于切换分支。两者没有任何关联,除非你试图切换到一个在远程新创建的分支,而它的本地版本不存在于你的系统中。

然而,当你执行 git pull 命令(或 git fetchgit rebase 命令),然后使用 git checkout -b <another_branch> 创建一个新分支时,你确保你的新分支是基于最新稳定代码版本的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接