我无法理解如何使用 git-rebase
,我考虑以下示例。
让我们开始一个存储库 ~/tmp/repo
:
$ git init
然后添加一个文件 foo
$ echo "hello world" > foo
然后添加并提交:
$ git add foo
$ git commit -m "Added foo"
接下来,我启动了一个远程存储库。在 ~/tmp/bare.git
我跑了
$ git init --bare
为了链接 repo
至 bare.git
我跑了
$ git remote add origin ../bare.git/
$ git push --set-upstream origin master
接下来,让分支,添加文件并为新分支设置上游 b1
:
$ git checkout -b b1
$ echo "bar" > foo2
$ git add foo2
$ git commit -m "add foo2 in b1"
$ git push --set-upstream origin b1
现在是时候切换回来了 master
并改变那里的东西:
$ echo "change foo" > foo
$ git commit -a -m "changed foo in master"
$ git push
在这一点上 master
文件 foo
包含 改变了foo , 而在 b1
它还是 你好,世界 。最后,我想要同步 b1
随着进步 master
。
$ git checkout b1
$ git fetch origin
$ git rebase origin/master
在此刻 git st
收益:
# On branch b1
# Your branch and 'origin/b1' have diverged,
# and have 2 and 1 different commit each, respectively.
# (use "git pull" to merge the remote branch into yours)
#
nothing to commit, working directory clean
此时的内容 foo
在分公司 b1
是 改变foo 同样。那么这个警告意味着什么呢?我希望我能做到 git push
,git建议做 git pull
... 根据 这个答案 ,这或多或少都是这样,并且在他的评论中@FrerichRaabe明确地说我不需要做拉。这里发生了什么?危险是什么,应该如何进行?如何保持历史一致?上述案例与以下引文之间的相互作用是什么:
不要将已推送到公共存储库的提交重新绑定。
取自 亲git书 。
我猜它有点相关,如果不是,我很想知道为什么。上述场景与我描述的过程之间有什么关系 在这篇文章中 。
origin/master
和 master
更新,我应该改变 origin/b1
上 origin/master
,然后呢 git pull
什么时候 b1
签出将rebase拉到本地存储库?
git pull
并且你永远不会改变远程分支(例如 origin/master
)其他任何事情。
origin/b1
和 b1
不一样。这是相当明显的,但是解决它的正确方法是什么?或修复它意味着弄乱历史,如@heavyd所解释的那样?
git st
给出那个输出是因为git知道你的本地b1
分支正在跟踪origin/b1
,这就是你想要改变的东西。你跑了git rebase origin/master
但是,所以你重新定位(“重播”)你的b1
提交在上面origin/master
。