删除分支后未分阶段提交

时间:2014-01-23 15:11:41

标签: git version-control github

我有这个分支,我曾经工作了一段时间,然后交给其他人完成。现在分支已经完成。

我检查了分支并拉了下来。它说我通过一些提交领先于/ origin / branchname。想象我可能有一些未提交的提交,我检查了另一个分支并用git branch -D branchname删除了有问题的分支

然后我检查回到分支并拉了,它仍然说我在那些提交中领先。我不记得之前发生过这种情况,所以我不认为这是正常的git行为。

任何使得该分支完全被推送到远程的方式,而不是关心未提交的提交?

2 个答案:

答案 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 fetchgit 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,您现在应该可以使用branchnameorigin/branchnamegitkgit log --all --graph --decorate来比较git log origin/branchname...branchname和{{1}}任何其他方式。这应该让你开始弄清楚究竟出了什么问题。