以下是我的情景:我在GitHub上有一个原始回购的分叉回购(说 F )(比如 O )。
我的本地版本的Forked回购是 L 。
当我正在使用 L 时,我在本地提交了1个尚未推送到 F 的提交,以及我正在处理的问题的一些未跟踪更改。
发生这种情况时,原始仓库 O 会更新。现在,我必须将 F 和 L 与 O 同步。
我按照here给出的步骤,即更精确:
# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
执行此操作后,我在GitHub上看不到 F 的任何更改。 O 中有4个分支,但按照上述步骤后,我在 F 中看不到任何新分支。
然后我想也许我需要将更改推送到 F ,所以我做了git push origin master
。我的提交照常在 F 中显示,但我在 F 中看不到任何新的分支。因此, F 可能未与 O 同步。
那么我错过了什么,我该怎么做?
答案 0 :(得分:1)
在 F 中只能看到您推送到回购的分支。由于您只推送了主分支,因此仅在 F 中显示该分支。
如果要查看 F 中 O 的所有分支,则必须签出每个分支,然后将其推送到F.
名为 develop 的分支的示例:
git checkout develop
git push origin develop
对于您希望在 F 中看到的 O 的所有分支执行此操作。
如果您在本地运行git branch -a
,它将显示所有本地和远程分支。您会注意到来自 O 的分支仅以remotes/upstream/develop
的形式显示,并且没有本地分支。您之前运行的git fetch
命令已拉入所有远程分支,但尚未为它们创建本地分支。
上述命令首先从上游分支创建一个本地分支,然后将它们推送到您自己的远程。
还有一件事:如果你没有将分支推到遥控器上,只能使用rebase
。重新进行多次重新定位并推入其中将更改分支的历史记录,并且您必须强制推送您的更改。只要您是唯一使用您的回购协议的人,这不是问题,但当其他人已经撤消您的更改时会出现问题。在此之后重新进行并强制推送您的更改将导致其他人使用您的存储库出现问题。
在这种情况下,您可以合并而不是重新定位。我用这个别名用上游远程更新我的fork:
alias gmu='git fetch origin -v; git fetch upstream -v; git merge upstream/master'