为什么Git会告诉我这个本地未提交的提交?

时间:2017-03-21 09:23:05

标签: git bitbucket commit

我有一种奇怪的行为,我不明白可能是什么原因。

基本上:

  1. 我在NetBeans中进行本地开发
  2. 然后推送到Bitbucket
  3. 最后,从生产服务器拉
  4. 所以,我从不做生产服务器的提交,我只是拉到那里。

    所以在我完成最后一次拉动之后:

    -bash-4.2$ git pull origin master
    

    然后我检查了状态并给了我这个:

    -bash-4.2$ git status
    # On branch master
    # Your branch is ahead of 'origin/master' by 2 commits.
    #   (use "git push" to publish your local commits)
    

    然后我去看看那些提交的内容:

    -bash-4.2$ git cherry -v
    + 2456db712fafab4b845a128711820ca107475e1f Remove comment added by josepluis to yiic horde loader
    + 8b9edf42c0d5177cd77f061160e27580098b745c Fix small bug when ordering pictures that was executing the update on wrong table
    

    如果我查看Bitbucket,我发现那些不是来自生产服务器的本地提交,但它们是我在计算机上执行的提交并推送到Bitbucket。

    Bitbucket master branch

    那么为什么来自生产服务器的Git会考虑那些提交,本地未提交的提交?

1 个答案:

答案 0 :(得分:0)

尝试检查origin/master的reflog,并检查两次拉动之间是否有重写历史记录:

$ git reflog origin/master
ffac48d09 refs/remotes/origin/master@{0}: fetch: fast-forward
d7dffce1c refs/remotes/origin/master@{1}: fetch: fast-forward
e05806da9 refs/remotes/origin/master@{2}: fetch: fast-forward
aeddbfdfa refs/remotes/origin/master@{3}: fetch: fast-forward
...

$ git log --oneline --graph ffac48d09 d7dffce1c e05806da9
# and check if the sequence of commits is linear, or if it "forked" at some point

避免被重写(以及git pull的自动合并或重组)的两种方法:

  1. 停止使用git pull,运行git fetch,检查origin/master进化的方式,并根据您的需要:
    • git merge origin/master / git rebase origin/master:执行与git pull相同的操作,但在被告知历史记录发生变化后
    • git reset --hard origin/master:不要尝试合并,只需使用此特定提交
  2. 告诉git pull只能继续快进:git pull --ff-only