我无法理解如何使用 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。