git pull、git fetch和#x2B;合并和git重基

git pull、git fetch和#x2B;合并和git重基,git,git-merge,git-rebase,git-pull,Git,Git Merge,Git Rebase,Git Pull,我混淆了git pull,git fetch+git merge和git rebase。 它们似乎都执行相同的功能,那么它们之间的区别是什么,特别是在提交日志方面 如果远程分支和本地分支都有更改,那么在这三种情况下,谁的提交将首先出现。使用一些googlegit pull=git fetch,然后是git merge。谷歌搜索git pull时的第一次点击 在默认模式下,git pull是git fetch的缩写,后跟git merge fetch\u HEAD git-rebase完全不同,与

我混淆了
git pull
git fetch
+
git merge
git rebase
。 它们似乎都执行相同的功能,那么它们之间的区别是什么,特别是在提交日志方面


如果远程分支和本地分支都有更改,那么在这三种情况下,谁的提交将首先出现。

使用一些google
git pull
=
git fetch
,然后是
git merge
。谷歌搜索git pull时的第一次点击

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

git-rebase
完全不同,与远程设备无关。同样,谷歌可以解决你的问题,但一个简短的图形解释,当站在分支a上,在分支B上重新定基时(这与站在a上不同,B合并到it中):

git文档中的c1-c2-c3

git pull
将远程存储库中的更改合并到当前分支中。在其默认模式下,
git pull
git fetch
的缩写,后跟
git merge fetch\u HEAD

rebase
在另一个基本提示上重新应用提交

因此,您可以在
FETCH
ed之后执行
git-rebase-FETCH\u-HEAD

所以如果你有

(*) <-- HEAD
 |
(*) <-- commit B
 \   (*) <-- origin/master
  \  /
   (*) <-- commit A

(*)正如您在问题中所暗示的,其中最令人困惑的部分是了解与远程回购相比,本地回购对您的影响,部分还包括对使用远程回购的其他所有人的影响

首先,正如其他答案所指出的,
git pull
git fetch
+
git merge
完全相同。这两个命令都是从本地repo的角度,从远程到本地repo的拉/取+合并。这是从您在远程服务器上本地签出的同一分支到该本地分支发生的。我将首先讨论这些,然后挤压和重定基

Git Pull/Git Fetch+Git Merge 假设您已在本地签出
master
,然后将从远程获取
master
(除非您在这些命令上使用更高级的语法或标记)。让我们将远程分支称为
origin/master

origin/master
获取意味着您希望从
origin/master
获取新提交,并更新
origin/master
的本地跟踪参考,以匹配
master
实际位于远程的位置。如果
master
在本地和远程之间存在分歧,则会有提交从主分支分支分支出来,直到它们到达
origin/master
引用的当前位置。您最近未推送的提交将位于可能不同的本地
master
分支上

然后,当合并发生时,您基本上是在请求将
origin/master
合并到本地
master
分支中。如果执行正常的合并命令,将导致对本地
分支的新提交,该分支将
原点/master
的所有最近更改拉入本地
分支。如果存在冲突,您将在提交之前首先解决冲突。但是,如果您没有在本地提交任何内容,则合并只需快进到新的
源代码/主代码
位置,而无需执行任何其他操作(您的
主代码
只需向前跳转以匹配
源代码/主代码

此时,如果您在其他人将任何内容推送到远程之前推送,则新的合并提交将被推送,包括单独的提交(它们看起来像一个单独的未命名分支)和原始远程提交,以及最后的新合并提交

挤压呢? 您确实询问过这个问题,但是如果您使用--squash合并,那么它将添加合并提交,但删除其他本地提交,这样历史记录中就没有额外的未命名分支。有些人喜欢这样,因为它“更干净”,而其他人则喜欢查看所有的历史记录(即,代码出现分歧,以及合并提交中的具体内容)

重新定基 当您重新设置基础时,您基本上是获取所有本地提交,并将它们重放到远程主分支上,这样它们就不会显示为单独的分支。这保持了当地历史的完整性,而没有显示出代码分散,这又一次,一些人喜欢并认为它更“干净”。这与历史是否重要无关,等等

如果有人在我抓到你后犯了罪呢? 如果在你抓取后有其他忍者犯了罪(好吧,只是犯了…),那么你的推送将失败。您可以使用
--force
,但是您会完全覆盖他们的提交,因此这通常是不受欢迎的,因为它会给其他人带来各种各样的问题。在这种情况下,如果每个人都同意先进行提交,那么您需要再次进行该过程(如果没有冲突,那么这是快速而简单的),但一般来说,团队需要对这类事情制定一个策略,并且通常使用请求和审查以更有序的方式管理推送,一旦球队变得足够强大

另一种思考方式 通过将本地主分支视为远程分支的一个独立分支,可以很容易地理解所发生的事情——从Git的角度来看,基本上就是这样


事实上,在我看来,在您准备将某些内容合并到远程分支之前,您在自己单独的分支中工作总是更好。Git使拥有一个单独的分支变得如此简单、快速和轻松,这就是我所做的。

“谁的提交将首先出现”——听起来像是一个实验!那似乎是一份工作
c1-c4-c5-c2-c3<-A
       ^
       B
(*) <-- HEAD
 |
(*) <-- commit B
 \   (*) <-- origin/master
  \  /
   (*) <-- commit A