git:怪异的推力行为

时间:2014-04-15 07:28:19

标签: git

当我在Pull Request之前的某个时刻开发分支时:

$> git checkout myBranch
$> git pull
$> git rebase origin/master
# fix conflicts and --continue
$> git push --force 
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Counting objects: 21, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1.59 KiB | 0 bytes/s, done.
Total 11 (delta 8), reused 0 (delta 0)
To git@github.com:bar/foo.git
+ 64f1387...ed6f9be myBranch -> myBranch (forced update)
+ ccaadf5...42e0c8d master -> master (forced update)

这里的问题是最后一行,强制推动掌握。这不应该发生,我只想强迫推进myBranch。但事实并非如此,推动掌握的力量会导致主分支现在错过了最后几次提交。我认为这很奇怪,因为我刚做了pull。有人可以向我解释刚刚发生了什么吗? 我认为治愈就是

$> git config --global push.default simple

和/或

$> git push --force origin/myBranch

1 个答案:

答案 0 :(得分:3)

关于推动所有分支,你是对的,这是因为push.default=matching。来自push.default的文档:

  

匹配 - 推送两端具有相同名称的所有分支......

这可能会令人惊讶,这就是为什么默认值会更改为simple

关于master返回,当您使用--force时会发生什么......您必须非常小心。

问题是您执行了git pull,相当于git fetchgit mergefetch已同步所有origin/*分支,mergemyBranch提升为origin/myBranch。但事实上,master 更新为origin/master(因为它在进行合并时不是当前分支)。因此,当您强制推送时,您回滚origin/master

故事的士气是:

  

使用--force时,永远不要相信默认值!

这对许多命令都有效,而不仅仅是git