我有这个分支,我曾经工作了一段时间,然后交给其他人完成。现在分支已经完成。
我检查了分支并拉了下来。它说我通过一些提交领先于/ origin / branchname。想象我可能有一些未提交的提交,我检查了另一个分支并用git branch -D branchname
删除了有问题的分支
然后我检查回到分支并拉了,它仍然说我在那些提交中领先。我不记得之前发生过这种情况,所以我不认为这是正常的git行为。
任何使得该分支完全被推送到远程的方式,而不是关心未提交的提交?
答案 0 :(得分: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 ...
此时git说你是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 pull 将其抛弃。然后像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
步骤分开,尽管为方便起见肯定会说些什么,只要它有效。:-))
答案 1 :(得分:0)
回答您的具体问题
任何使得该分支完全被推送到远程的方式,而不是关心未提交的提交?
你可以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
,您现在应该可以使用branchname
或origin/branchname
,gitk
或git log --all --graph --decorate
来比较git log origin/branchname...branchname
和{{1}}任何其他方式。这应该让你开始弄清楚究竟出了什么问题。