当我在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
答案 0 :(得分:3)
关于推动所有分支,你是对的,这是因为push.default=matching
。来自push.default
的文档:
匹配 - 推送两端具有相同名称的所有分支......
这可能会令人惊讶,这就是为什么默认值会更改为simple
。
关于master
返回,当您使用--force
时会发生什么......您必须非常小心。
问题是您执行了git pull
,相当于git fetch
和git merge
。 fetch
已同步所有origin/*
分支,merge
将myBranch
提升为origin/myBranch
。但事实上,master
未更新为origin/master
(因为它在进行合并时不是当前分支)。因此,当您强制推送时,您回滚origin/master
!
故事的士气是:
使用
--force
时,永远不要相信默认值!
这对许多命令都有效,而不仅仅是git
。