我有这个分支,我工作了一下,然后交给其他人完成。现在分支完成了。删除分支后未分级提交
我检查了分支并拉出。它说我通过几次提交就领先于/ origin/branchname。形象我可能有一些unpushed提交,我检查出另一个分支,并删除违规分支与git branch -D branchname
然后我再次检查到分支并拉,仍然表示,我在这些提交前面。我不记得之前发生过这种情况,所以我不认为这是正常的git行为。
任何获得该分支的方法都是推向远程的,而不是关心未完成的提交?
我有这个分支,我工作了一下,然后交给其他人完成。现在分支完成了。删除分支后未分级提交
我检查了分支并拉出。它说我通过几次提交就领先于/ origin/branchname。形象我可能有一些unpushed提交,我检查出另一个分支,并删除违规分支与git branch -D branchname
然后我再次检查到分支并拉,仍然表示,我在这些提交前面。我不记得之前发生过这种情况,所以我不认为这是正常的git行为。
任何获得该分支的方法都是推向远程的,而不是关心未完成的提交?
我打赌这是原因:
$ git checkout -b work
# work work work
$ git push origin work:work # hand off to someone else
# pause for a day or whatever
# come back, find that someone else finished the work
$ git pull origin work
... the usual git pull messages ...
此时混帐说你ahead 3
,说了(其他人做3个提交)。所以你这样做:
$ git checkout master
Switched to branch 'master'
$ git branch -D work
$ git checkout work
Branch work set up to track remote branch work from origin.
Switched to a new branch 'work'
$ git pull origin work
这里是事情继续出错的地方。命令:git pull origin work
实际上确实发送到远程origin
并提取新的提交。这些新的提交进入您的存储库,并合并到本地分支work
...但在当前(前1.9)版本的git下,origin/work
未更新,即使原始的work
标签更新。
换句话说,你的本地Git是获取有关origin/work
新的信息,但混帐拉扔了更新当地分支后离开。然后像git status
这样的东西告诉你,你的“3先行”,因为你的git记录在你的仓库中的origin/work
都是陈旧的。
当(在某些其他分支上)删除本地work
分支,然后git checkout work
时,它会根据您仍然过时的想法(origin
在哪里)重新创建本地分支。随后git pull origin work
再次提交任何新的提交,并将它们再次合并到本地work
分支中,但再次无法更新origin/work
。
这是固定在git 1.9/2.0,但现在,你只需要使用git fetch origin
来更新origin/...
分支名称。避免git pull
,你避免这个特殊的陷阱。 (或者,升级到更新的git一旦出去了。)
(我喜欢反正分离出git fetch
和git merge
步骤,虽然有绝对的东西为方便起见,可说的,如果只是它的工作。:-))
这正是问题所在。这些是我采取的步骤:'git checkout someotherbranch','git branch -D branchname','git fetch origin branchname:branchname','git checkout branchname'在这一点上,我做了另一个'git fetch origin branchname:branchname',尽管它似乎没有做任何事情。随后的'git pull origin branchname'似乎与远程存储的内容同步。感谢您的好解释! –
为了回答您的具体问题
获得该路待到底发生了推到远程,不关心unpushed提交的任何方式?
你可以git pull --force
。从文档:
-f, --force
When git fetch is used with <rbranch>:<lbranch> refspec, it refuses
to update the local branch <lbranch> unless the remote branch
<rbranch> it fetches is a descendant of <lbranch>. This option
overrides that check.
您可能必须完全指定分支,例如git pull --force origin branchname:branchname
,假设是origin
的远程。
话虽如此,找出是什么原因导致这个问题可能是一个好主意。
如果git fetch origin branchname
,你现在应该可以使用gitk
,或git log --all --graph --decorate
,git log origin/branchname...branchname
,或任意数量的其他方式来比较branchname
和origin/branchname
。这应该让你开始找出真正错误的路径。
你是什么意思,你“然后检查回到分支,并拉”?在'git branch -D branchname'之后,分支不应该存在。 – Chris
我不确定这里发生了什么事情。我做'git branch-D branchname',它说它被删除了。然后我可以检查分支做'git checkout branchname'当我做'git分支'它也没有列出。 –
'git branch -D'之后,如果你做了'git branch -a',分支会显示出来吗? – Chris