git pull--重新设置基址会导致意外的图形

git pull--重新设置基址会导致意外的图形,git,git-rebase,Git,Git Rebase,我在一家分行工作,foo。我没有未老化的更改,没有工作更改,完全干净的状态,根据我的框,其中HEAD==foo=origin/foo $ git status # On branch foo # Untracked files: # (use "git add <file>..." to include in what will be committed) # # some_irrelevant_file_here $ git log --pretty=... * 4565

我在一家分行工作,
foo
。我没有未老化的更改,没有工作更改,完全干净的状态,根据我的框,其中
HEAD
==
foo
=
origin/foo

$ git status
# On branch foo
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   some_irrelevant_file_here

$ git log --pretty=...
* 456520c 2015-02-13 (HEAD, origin/foo, foo) Commit A
* 23bfcd1 2015-02-11 Commit B
* b0bdd18 2015-02-12 Commit C
此时,我的图表如下所示:

$ git log --pretty=...
* 43dad88 2015-02-13 (HEAD, foo) Commit D
* 40039f9 2015-02-13 Commit E
* 456520c 2015-02-13 (origin/foo) Commit A
* 23bfcd1 2015-02-11 Commit B
* b0bdd18 2015-02-12 Commit C

为什么我的本地
foo
看起来比
origin/foo
早?无论是
D
还是
E
都不是我的提交,我只是从
origin
-我希望此时仍然有
HEAD
=
foo
=
origin/foo
,因为这不是推送到repo的正常行为。为什么您可以在源代码之前进行本地提交?他们将永远处于领先地位

为什么我的本地foo看起来比origin/foo领先

预计
foo
remote/foo
之前,因为。您在
remote/foo
之上重新设置了
foo
,因此
foo
应该位于
remote/foo
之前

HEAD==foo==origin/foo根据我的框

$ git status
# On branch foo
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   some_irrelevant_file_here

$ git log --pretty=...
* 456520c 2015-02-13 (HEAD, origin/foo, foo) Commit A
* 23bfcd1 2015-02-11 Commit B
* b0bdd18 2015-02-12 Commit C
因此,提交的顺序也与预期的一样。以下是分支在重新基址或合并之前的样子,
a
是远程的实际状态,
C
是远程的陈旧表示

D <------C (HEAD, foo, remote/foo) <------B <------A (remote/foo)
为什么我的本地foo看起来比origin/foo领先


这是我一直无法回答的问题。在重新基址之后,我会再次期望
HEAD
=
foo
=
remote/foo
,但事实并非如此。为什么在将
foo
重基到
remote/foo
后,后者似乎落后了?

拉-重基之前,您拥有的是:

x--x--x (foo, HEAD, origin/foo)
       \
        y--y (actual origin/foo)
当您
pull--rebase
时,您要求在
origin/foo
之上重播本地提交:
foo
origin/foo
(在
FETCH\u HEAD
中获取)重置/签出,并且由于您的提交“
x
”已经是新更新的
FETCH\u HEAD
的一部分,因此
foo
只是快速转发:

x--x--x--y--y (foo, HEAD, FETCH_HEAD)
      |
 (origin/foo)
origin/foo
没有改变这一事实是一个典型的问题(例如,在中可以找到,它与旧的
git内核一起出现
1.7.9.5)

一个简单的
git fetch
应该足以更新
origin/foo
,而不仅仅是
fetch\u HEAD

较新的git(1.8.4+)将更新
FETCH\u HEAD
origin/foo
,使额外的
git FETCH
变得多余


注意:对于Git2.12(2017年第一季度),这个案例(pull--rebase)将是一个简单的快进合并

见(2016年6月29日)作者。 (于2016年12月19日被合并)

pull
:快进“
pull--rebase=true
” “
git-pull--rebase
”在获取 承诺充当新基地,即使新基地是 当前头的后代,即我们没有做任何工作

在这种情况下,我们可以快速前进到新的基地,而不必担心 调用重新基础过程


“根据我的盒子”。你的盒子可能已经过时了。如果您先运行
git fetch origin foo
,会发生什么?@jurgemaister pull--rebase隐式执行一个fetch。@CodyStott我们查看的是提交历史记录,而不是差异预览-我们已经通过了该阶段。有一个
git-pull--rebase-origin-foo
,因此有效地有一个
git-fetch-origin-foo
和一个
git-rebase-origin/foo
。提取已经发生了。@RobertBain我知道git pull的作用。然而,我的评论是基于这样一个事实,即最初的问题提到,在他提到做
git pull
之前,他“知道”他的本地用户甚至与远程用户保持一致。想想他说的话吧。我心里想的不是他说的话。我想他是说他做了一个
git-pull--rebase-origin-foo
,这与
git-fetch-origin-foo
git-rebase-origin/foo
是一样的。我很乐意在讨论中进一步讨论这个问题,或者把它留给其他人来表达他们的想法。是的,这是我所期望的,也是我的问题。@Barry当我们需要他时,Linus在哪里?这似乎太奇怪了,我倾向于认为出了什么问题,不知何故,本地回购协议被破坏了。我毫不怀疑,这个问题的目的是为了澄清任何可能的误解,但鉴于任何合理的答案,我很想将HEAD~1区分为一个文件、补丁、推送,并希望它不会再次发生。@RobertBain不,它只是一个旧git(1.8.4之前):看。@VonC,这是一个多么微妙的问题,捕捉得好。我能假设你以前遇到过同样的问题吗?
x--x--x--y--y (foo, HEAD, FETCH_HEAD)
      |
 (origin/foo)