';吉特拉力';和';git fetch';?

';吉特拉力';和';git fetch';?,git,version-control,git-pull,git-fetch,Git,Version Control,Git Pull,Git Fetch,git-pull和git-fetch之间有什么区别?最简单的说法是,git-pull先执行git-fetch,然后执行git-merge 您可以随时执行git fetch以更新refs/remotes/下的远程跟踪分支。此操作不会更改refs/heads下您自己的任何本地分支,并且无需更改您的工作副本即可安全执行。我甚至听说有人在后台定期在cron作业中运行git fetch(尽管我不建议这样做) 一个git pull(git pull)是您将要做的事情,它使本地分支更新其远程版本,同时也更新您

git-pull
git-fetch
之间有什么区别?

最简单的说法是,
git-pull
先执行
git-fetch
,然后执行
git-merge

您可以随时执行git fetch以更新
refs/remotes/
下的远程跟踪分支。此操作不会更改
refs/heads
下您自己的任何本地分支,并且无需更改您的工作副本即可安全执行。我甚至听说有人在后台定期在cron作业中运行
git fetch
(尽管我不建议这样做)

一个git pull(git pull)是您将要做的事情,它使本地分支更新其远程版本,同时也更新您的其他远程跟踪分支

从Git文档中获取:

在默认模式下,
git-pull
git-fetch
的缩写,后跟
git-merge-fetch\u-HEAD

git pull-从另一个存储库或本地分支获取并与之合并 提要 git pull… 描述 使用给定的参数运行git fetch,并调用git merge来合并 检索到当前分支中的头。使用--rebase,调用git-rebase 而不是git合并。 请注意,您可以使用。(当前目录)作为要拉取的 从本地存储库-这在合并本地分支时非常有用 进入当前分支。 还要注意,用于git pull本身和底层git合并的选项 必须在git fetch的选项之前给出。
如果您希望合并历史记录,您可以提取,如果您只是“想要代码”,您可以提取,因为有人在这里标记了一些文章。

git fetch的一个用例是,以下内容将告诉您自上次提取以来远程分支中的任何更改。。。因此,您可以在执行实际拉取之前进行检查,这可能会更改当前分支和工作副本中的文件

git fetch
git diff ...origin

请参阅:关于diff命令中的双点和三点语法,您可以从远程存储库获取,请参阅差异,然后进行拉取或合并

这是一个名为
origin
的远程存储库和一个名为
master
的分支跟踪远程分支
origin/master
的示例:

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master

简单明了的答案是,
git pull
是简单的
git fetch
,然后是
git merge

非常重要的是要注意,
git pull
自动合并,无论您喜欢与否。当然,这可能会导致合并冲突。假设您的遥控器是
origin
,而您的分支是
master
。如果在拉取之前
git diff origin/master
,您应该对潜在的合并冲突有所了解,并可以相应地准备本地分支

除了拉和推之外,还包括
git-rebase
,比如我从链接文章中转述的这个:

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch
如果您发现自己处于这种情况,您可能会尝试
git-pull--rebase
。除非你真的,真的知道你在做什么,否则我建议你不要这样做。此警告来自
git pull
版本
2.3.5
man
页面:

这是一种潜在的危险操作模式。它重写了 历史,当你发表这段历史时,这不是好兆头 已经。除非已阅读git rebase(1),否则不要使用此选项 小心地

  • 使用
    pull
    时,Git会尝试自动合并它是上下文敏感的,因此Git会将任何拉入的提交合并到您当前正在处理的分支中
    pull
    自动合并提交,而不让您先查看它们。如果你不小心管理你的分支机构,你可能会经常遇到冲突

  • 当您
    fetch
    时,Git从目标分支收集当前分支中不存在的任何提交,并将其存储在本地存储库中。但是,它不会将它们与当前分支合并。如果您需要使存储库保持最新,但正在处理更新文件时可能会出现问题,则这一点特别有用。要将提交集成到当前分支中,必须在之后使用
    merge


我花了一点时间才明白区别是什么,但这只是一个简单的解释<本地主机中的code>master是一个分支

克隆存储库时,将整个存储库提取到本地主机。这意味着此时您有一个指向
HEAD
的原点/主指针,主指针指向同一
HEAD

当您开始工作并进行提交时,您将主指针前进到
+您的提交。但原始/主指针仍指向克隆时的位置

因此,区别在于:

  • 如果执行
    git fetch
    操作,它只会获取远程存储库()中的所有更改,并将源/主指针移动到
    。同时,您当地的分支主管将继续指出它所在的位置
  • 如果您执行
    git pull
    ,它基本上会执行fetch(如前面所述)并将任何新更改合并到您的主分支,并将指针移动到
    HEAD

我也一直在努力解决这个问题。事实上,我是通过谷歌搜索找到了完全相同的问题。阅读所有这些答案最终在我的脑海中画出了一幅图画,我决定试着把它写下来,看看2个存储库和1个沙盒的状态以及随着时间的推移执行的操作,同时观察它们的版本。这就是我想到的。如果我在任何地方搞砸了,请纠正我

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch
---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - fetch               -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     -                     -
- @ R01             -     - @ R01+              -     - @R01+               -
---------------------     -----------------------     -----------------------
---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - pull                -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     - merged with R02     -
- @ R01             -     - @ R01+              -     - @R02+               -
---------------------     -----------------------     -----------------------
git pull == git fetch + git merge
 git fetch 
 git diff master origin/master 
 git pull
                                         LOCAL SYSTEM
                  . =====================================================    
================= . =================  ===================  =============
REMOTE REPOSITORY . REMOTE REPOSITORY  LOCAL REPOSITORY     WORKING COPY
(ORIGIN)          . (CACHED)           
for example,      . mirror of the      
a github repo.    . remote repo
Can also be       .
multiple repo's   .
                  .
                  .
FETCH  *------------------>*
Your local cache of the remote is updated with the origin (or multiple
external sources, that is git's distributed nature)
                  .
PULL   *-------------------------------------------------------->*
changes are merged directly into your local copy. when conflicts occur, 
you are asked for decisions.
                  .
COMMIT            .                             *<---------------*
When coming from, for example, subversion, you might think that a commit
will update the origin. In git, a commit is only done to your local repo.
                  .
PUSH   *<---------------------------------------*
Synchronizes your changes back into the origin.
git pull  
git pull origin master
git fetch origin master
git rebase origin/master
git fetch origin master
git checkout master
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
Already on 'master'
Your branch is up to date with 'origin/master'.
git fetch origin feature/123
git checkout feature/123
git checkout -b feature/123 origin/feature/123