2014-01-23 102 views
0

我有这个分支,我工作了一下,然后交给其他人完成。现在分支完成了。删除分支后未分级提交

我检查了分支并拉出。它说我通过几次提交就领先于/ origin/branchname。形象我可能有一些unpushed提交,我检查出另一个分支,并删除违规分支与git branch -D branchname

然后我再次检查到分支并拉,仍然表示,我在这些提交前面。我不记得之前发生过这种情况,所以我不认为这是正常的git行为。

任何获得该分支的方法都是推向远程的,而不是关心未完成的提交?

+0

你是什么意思,你“然后检查回到分支,并拉”?在'git branch -D branchname'之后,分支不应该存在。 – Chris

+0

我不确定这里发生了什么事情。我做'git branch-D branchname',它说它被删除了。然后我可以检查分支做'git checkout branchname'当我做'git分支'它也没有列出。 –

+0

'git branch -D'之后,如果你做了'git branch -a',分支会显示出来吗? – Chris

回答

2

我打赌这是原因:

$ 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 fetchgit merge步骤,虽然有绝对的东西为方便起见,可说的,如果只是它的工作。:-))

+0

这正是问题所在。这些是我采取的步骤:'git checkout someotherbranch','git branch -D branchname','git fetch origin branchname:branchname','git checkout branchname'在这一点上,我做了另一个'git fetch origin branchname:branchname',尽管它似乎没有做任何事情。随后的'git pull origin branchname'似乎与远程存储的内容同步。感谢您的好解释! –

0

为了回答您的具体问题

获得该路待到底发生了推到远程,不关心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 --decorategit log origin/branchname...branchname,或任意数量的其他方式来比较branchnameorigin/branchname。这应该让你开始找出真正错误的路径。

相关问题