带分叉遥控器的Git rebase

带分叉遥控器的Git rebase,git,rebase,Git,Rebase,有一个主要的吉特回购;主回购协议;主分支-我的遥控器。 我把它分给了我的个人资料:主回购;主分支-起源 在分叉后向远程添加了提交。 在分叉后添加了对源代码的提交。所以现在这是一个承诺在前面,一个承诺在后面 目标:将我的遥控器重新设置为原点。以这样一种方式,origin应该先从我的远程设备提交,然后再从origin提交。我知道这将创建新的提交(SHA) 我正在从我的个人资料中克隆。 git克隆url2-起源 将远程回购添加为另一远程回购。 git remote添加我的远程gitreporemote

有一个主要的吉特回购;主回购协议;主分支-我的遥控器。
我把它分给了我的个人资料:主回购;主分支-起源

在分叉后向远程添加了提交。
在分叉后添加了对源代码的提交。所以现在这是一个承诺在前面,一个承诺在后面

目标:将我的遥控器重新设置为原点。以这样一种方式,origin应该先从我的远程设备提交,然后再从origin提交。我知道这将创建新的提交(SHA)

我正在从我的个人资料中克隆。
git克隆url2
-起源

将远程回购添加为另一远程回购。
git remote添加我的远程gitreporemote

我在我的本地主分支上,该分支正在跟踪原点。
正在尝试重新设置基址。
git fetch--all

git重新设置我的遥控器/主机的基址

有冲突。
手动解决。
然后
git添加有冲突的文件

继续使用rebase
git rebase——继续

git推送原点磁头:主磁头

获取错误。为什么在推前解决冲突时会出现此错误

 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'gitRepoToOrigin'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details
正如评论中暗示的(但未说明),您将需要某种强制推送。原因并没有那么复杂,但它有助于我们找出原因,而不是谈论它。用一种有趣的方式说,这里的问题是,您有三个不同的存储库,都名为Bruce,一个新的提交名为Bruce,还有一个新提交名为Bruce的重写。你现在需要告诉布鲁斯忘记布鲁斯,因为布鲁斯有了一个新的布鲁斯,布鲁斯需要和布鲁斯配对

(上面有点夸张,但也请参见句子。)

而不是将所有人和所有事情都称为“Bruce”,或者尝试给出每个提交的确切哈希ID,这会导致类似(尽管不同)的问题,因为人类不擅长哈希ID,将每个提交转换为“Bruce”-像他们头脑中的bleep一样,让我们将每个存储库绘制为一系列提交,提交由单个大写字母指定。我们首先从您称之为“主回购”的内容开始,然后在使用
git remote add
时称之为
my remote

my-remote:

...--F--G--H   <-- master
然后,您将GitHub fork克隆到您自己的计算机上(我们称之为“笔记本电脑”,即使它是台式机或台式机,只是为了给它一个令人难忘但独特的名称)。这复制了提交文件,但副本必须与原件相同;任何提交的任何部分在完成并将其分支名称复制到远程跟踪名称后都无法更改,因此您有:

laptop:

...--F--G--H   <-- origin/master
最后,在你的笔记本电脑上,你的Git运行
Git checkout master
从commit
H
填充一个工作树(和Git的索引,尽管我们在这里不介绍),使
master
成为当前分支,commit
H
成为当前提交,在
laptop

laptop:

...--F--G--H   <-- master (HEAD), origin/master
事情会随着时间的推移而改变 不过,接下来,您在笔记本电脑上做出了新的承诺。我们将这个commit称为
I
,它是
H
之后的下一个字母。因此,在笔记本电脑上,我们现在有:

laptop:

...--F--G--H   <-- origin/master
            \
             I   <-- master (HEAD)
请注意名为
origin
的存储库尚未发生任何更改

此时,您在笔记本电脑上运行
git push
。不必太担心您在这里传递给
git push
(如果有的话)的具体参数,它最终会将您的笔记本电脑拥有的、而
origin
没有的一个提交发送到
origin
。因此,现在,在
origin
上,您有:

origin:

...--F--G--H
            \
             I   <-- master
laptop:

...--F--G--H
            \
             I   <-- master (HEAD), origin/master
我们在这里绘制的图中不需要所有这些小纠结,但我是有意使用它们的。请注意,无论是
origin
还是
laptop
都不知道提交
K
!类似地,
my remote
从未听说过commit
I

乐趣(?)开始了 在这一点上,你开始做一些有趣的事情:

将远程回购添加为另一个远程回购。 git remote添加我的远程GitRepoRemote

您的
笔记本电脑
Git现在知道另一个Git存在,名为
my remote
。它还没有连接到它


大多数人都误用了
——所有的
,但在这里您已经正确地使用了它(恭喜!@matt用
git push origin HEAD:master
更新了问题,问题是在推之前解决冲突时为什么会出错?您正在重新设置本地分支的基址。您不能在更改历史记录时只推。可以拉,也可以强制推。要知道,强制推可能会给branchRepos的其他用户带来问题在我提到的条件下(在目标部分之前)。我如何将提交从我的远程服务器应用到源服务器?在源服务器中,我首先需要远程服务器的提交,然后是源服务器的提交。
laptop:

...--F--G--H   <-- origin/master
            \
             I   <-- master (HEAD)
my-remote:
             K   <-- master
            /
...--F--G--H
origin:

...--F--G--H
            \
             I   <-- master
laptop:

...--F--G--H
            \
             I   <-- master (HEAD), origin/master
git fetch --all