我最终得到了一个我不知道如何处理的状态的git存储库,我需要一些帮助来理解a)发生了什么,存储库处于这种状态的方式和原因,以及b)我应该如何反应它.基本上,当从遥控器拉出时,即使我重置所有更改并重试,我也会在遥控器前面结束.
这就是我所做的:
我已经分叉了一个git存储库,克隆了上游版本(我没有写访问权限),然后将我自己的fork添加到远程列表中,这样就git remote -v
显示了以下内容:
$ git remote -v mine git@github.com:tlycken/julia.git (fetch) mine git@github.com:tlycken/julia.git (push) origin git://github.com/JuliaLang/julia.git (fetch) origin git://github.com/JuliaLang/julia.git (push)
我现在想确保我的本地版本是最新的上游仓库中的所有内容,所以我运行
$ git pull origin master From git://github.com/JuliaLang/julia * branch master -> FETCH_HEAD Already up-to-date. tlycken$ git status # On branch master # Your branch is ahead of 'origin/master' by 4 commits. # (use "git push" to publish your local commits) # nothing to commit, working directory clean
这让我很困惑.为什么我的分支领先于原点大师?我没有改变任何事情.
为了看看我是否可以对它做点什么,我跑了git lg
(git log --graph
带有一些漂亮的印记的别名).输出的顶部如下所示:
* 6912a42 - (HEAD, mine/master, master) Merge pull request #3052 from daviddelaat/linalgnumber (2013-05-10 11:23:09 -0700)|\ | * 8116d51 - Use Number instead of Integer in some linalg operations (2013-05-10 19:12:45 +0200) * | 6cc1532 - Update .travis.yml configuration in the manual. (2013-05-10 21:41:59 +0530) * | fa1e3fe - Update logdet. Close #3070. (2013-05-10 19:35:37 +0530) * | a182f7f - (origin/master, origin/HEAD, mine/contrib-base) Merge branch 'master' of github.com:JuliaLang/julia (2013-05-10 03:10:38 -0400)
显然,HEAD处于不同的位置.为了确保在开始分支之前我在本地存储库中获得正确的代码,我确实git reset --hard origin/HEAD
删除了我前面的任何内容,然后git pull origin master
确保我是最新的(即没有重置太远或者某些东西):
$ git pull origin master From git://github.com/JuliaLang/julia * branch master -> FETCH_HEAD Updating a182f7f..6912a42 Fast-forward base/linalg/dense.jl | 2 +- base/linalg/factorization.jl | 44 ++++++++++++++++++++++---------------------- doc/manual/packages.rst | 3 +-- 3 files changed, 24 insertions(+), 25 deletions(-) $ git status # On branch master # Your branch is ahead of 'origin/master' by 4 commits. # (use "git push" to publish your local commits) # nothing to commit, working directory clean
我回到了我开始的地方.
这里发生了什么?我该怎么做才能进入我的本地主人从上游获得最新更新的状态?
git pull
不会更新您的跟踪引用(origin/
...),以跟踪各种遥控器HEAD
的位置.
运行git fetch origin
,它将更新所有origin/
...跟踪参考,git status
将不再认为你是领先的.
git pull
相当于:
git fetch
git merge FETCH_HEAD
因为它只显式地指定了一个要获取的分支,并将其提取到特殊的本地引用中FETCH_HEAD
,所以它不会在本地更新任何其他内容 - 只会更新FETCH_HEAD
您要引入的分支.
git fetch
相反,运行将更新与该远程存储库关联的所有引用.