git:对“的基本误解”;“非快进”;错误

git:对“的基本误解”;“非快进”;错误,git,Git,当我独自工作时,不理解git的基本知识是可以的,但是现在我和另一个人一起工作,我们每个人都提交拉请求,让另一个人合并它们,这开始成为一个问题 工作流:我在我的“作者”分支中写作。当准备好进行审阅时,我提交一个pull请求,我的编辑器将其合并到master中。当她对我有评论时,她提交了编辑分支的请求,我将它们合并到master中 今天,我得到了一个完全令人愤怒的循环错误,我不明白我被要求做什么 thomas@trigger嫀作者↑● › : ~/pm/wip [1] %git推送 到https:/

当我独自工作时,不理解git的基本知识是可以的,但是现在我和另一个人一起工作,我们每个人都提交拉请求,让另一个人合并它们,这开始成为一个问题

工作流:我在我的“作者”分支中写作。当准备好进行审阅时,我提交一个pull请求,我的编辑器将其合并到master中。当她对我有评论时,她提交了编辑分支的请求,我将它们合并到master中

今天,我得到了一个完全令人愤怒的循环错误,我不明白我被要求做什么

thomas@trigger嫀作者↑● › : ~/pm/wip
[1] %git推送
到https://github.com/mathpunk/punk-mathematics-text.git
! [拒绝]编辑器->编辑器(非快进)
! [已拒绝]作者->作者(非快进)
错误:无法将某些引用推送到'https://github.com/mathpunk/punk-mathematics-text.git'
为防止丢失历史记录,拒绝了非快进更新
在再次按下之前,合并远程更改(例如“git pull”)。见
有关详细信息,请参阅“git推送--帮助”的“关于快进的说明”部分。

因此,我尝试git pull并得到以下结果:

thomas@trigger ‹ author ↑● › : ~/pm/wip
[130] % git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.author.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:
    [branch "author"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.
thomas@trigger嫀作者↑● › : ~/pm/wip
[130]%吉特拉力
你让我拉,但没告诉我你是哪根树枝
是否要与合并,以及中的“branch.author.merge”
您的配置文件也没有告诉我。请
指定要在命令行和命令行上使用的分支
再试一次(例如“git pull”)。
有关详细信息,请参见git pull(1)。
如果经常与同一分支合并,则可能需要
在配置文件中使用类似以下内容:
[分支机构“作者”]
远程=
合并=
[远程“”]
url=
获取=
有关详细信息,请参见git配置(1)。

stackoverflow上经常出现与此问题相关的问题,但显然我对git的基本概念理解不够,无法理解它们。另外,也许我们的工作流程是疯狂的:我们都不是开发人员。接下来我可以尝试什么?

这是我认为git文档非常糟糕的领域之一。所有内容都指向git-pull,但是git-pull只是构建在几个基础项之上的一种方便方法,而基础项对于理解这一点至关重要。Git让关键的理解部分“泄漏”,同时试图假装它们是无关的

顺便说一下,以下是实际的基本要素:

  • 当你和别人分享东西时,会涉及到多个独立的存储库(repo)。至少有“你的”和“他们的”,而且经常有第三个(例如,在github上)是你们用来完成共享的。在本例中,模型是这个第三方github处理所有复杂的身份验证内容(https、ssh等等),因此您不必这样做

  • 要从其他回购中获取资料,可以使用
    git fetch

  • 要将内容交付给其他回购协议,可以使用
    gitpush

换句话说,
push
的反面实际上不是
pull
,而是
fetch

参考规范 为了使这两个操作(推送和获取)工作,git使用了它所称的“refspecs”。请记住,在推送和获取时,涉及两个存储库

refspec通常看起来就像一个分支名称。但是,最简单的REFSECE“真实”版本实际上是由冒号分隔的两个分支名称:

master:master
Editor:Editor
author:author
在两份回购协议中,左边和右边分别命名了分支机构。对于
推式
,左侧的名称是回购中的分支机构,右侧的名称是回购中的分支机构。对于
提取
,左侧的名称是回购中的分支,右侧的名称是回购中的分支

在这里,模型又变得有点奇怪,而且是非对称的。Git相信(可以说相信任何事情),当你去拿东西时,你和他们可能都在做工作;但是当你推的时候,只有你在做任何工作。(这有很好的理由,我将不深入讨论,因为这已经很长了。:-)

为了实现此全部功能,
fetch
提供了分支重命名。与其将“他们的”分支(
master
author
,等等)直接获取到“你的”分支,这将使访问自上次获取以来所做的工作变得非常困难,你将“他们的”东西获取到git称之为“远程分支”的地方


获取和“远程分支” “远程分支”实际上是本地事物,尽管名称为“远程分支”。就这一点而言,“遥控器”也是如此。“远程”是一个名称,如
origin
github
,您可以在本地配置。与此“远程”关联的是URL,例如
https://github.com/mathpunk/punk-mathematics-text.git
。还有一个
fetch
行。现在不要担心
fetch
行的机制(一旦创建了它,它通常就可以正常工作);只需知道这就是git在获取时知道要使用什么“远程分支名称”的方式

在某种程度上,您确实需要担心遥控器的实际名称。通常的默认名称是
origin
,但在执行
git remote add
命令时选择该名称。远程服务器的名称成为“远程分支”名称的一部分。具体来说,远程名称在分支名称前面加前缀

因此,假设您将
git fetch origin
从github带来东西,“远程分支名称”将是
origin/master
origin/Editor
origin/author

如果您
git fetch github
从github带来东西,那么“远程分支名称”将改为
github/master
        C - F
      /       \
A - B           G   <-- master
      \       /
        D - E
git checkout -b sidebranch master~1
git checkout master
git merge sidebranch
A - B   <-- master
        C   <-- master
      /
A - B
A - B
      \
        D - E   <-- master
        C   <-- master
      /
A - B
      \
        D - E   <-- github/master
        C - F   <-- master
      /
A - B
      \
        D - E   <-- github/master
        C - F
      /       \
A - B           G   <-- master
      \       /
        D - E   <-- github/master
      ..............<-- br
     .
    .   C - F
    v /       \
A - B           G   <-- master
      \       /
        D - E
git checkout br
git merge --ff-only master
$ git config branch.author.remote github
$ git config branch.author.merge author