Skip to content

Commit

Permalink
push: switch default from "matching" to "simple"
Browse files Browse the repository at this point in the history
We promised to change the behaviour of lazy "git push [there]" that
does not say what to push on the command line from "matching" to
"simple" in Git 2.0.

This finally flips that bit.

Helped-by: Matthieu Moy <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
gitster committed Jun 18, 2013
1 parent ac47a22 commit b2ed944
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 48 deletions.
14 changes: 4 additions & 10 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,17 +142,11 @@ advice.*::
--
pushNonFastForward::
Set this variable to 'false' if you want to disable
'pushNonFFCurrent', 'pushNonFFDefault', and
'pushNonFFCurrent', and
'pushNonFFMatching' simultaneously.
pushNonFFCurrent::
Advice shown when linkgit:git-push[1] fails due to a
non-fast-forward update to the current branch.
pushNonFFDefault::
Advice to set 'push.default' to 'upstream' or 'current'
when you ran linkgit:git-push[1] and pushed 'matching
refs' by default (i.e. you did not provide an explicit
refspec, and no 'push.default' configuration was set)
and it resulted in a non-fast-forward error.
pushNonFFMatching::
Advice shown when you ran linkgit:git-push[1] and pushed
'matching refs' explicitly (i.e. you used ':', or
Expand Down Expand Up @@ -1750,15 +1744,15 @@ push.default::
since locally stalled branches will attempt a non-fast forward push
if other users updated the branch.
+
This is currently the default, but Git 2.0 will change the default
to `simple`.
This used to be the default, and stale web sites may still say so,
but Git 2.0 has changed the default to `simple`.
* `upstream` - push the current branch to its upstream branch.
With this, `git push` will update the same remote ref as the one which
is merged by `git pull`, making `push` and `pull` symmetrical.
See "branch.<name>.merge" for how to configure the upstream branch.
* `simple` - like `upstream`, but refuses to push if the upstream
branch's name is different from the local one. This is the safest
option and is well-suited for beginners. It will become the default
option and is well-suited for beginners. It has become the default
in Git 2.0.
* `current` - push the current branch to a branch of the same name.
--
Expand Down
25 changes: 14 additions & 11 deletions Documentation/git-push.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,14 @@ OPTIONS[[OPTIONS]]
The format of a <refspec> parameter is an optional plus
`+`, followed by the source ref <src>, followed
by a colon `:`, followed by the destination ref <dst>.
It is used to specify with what <src> object the <dst> ref
in the remote repository is to be updated. If not specified,
It is used to specify what <src> object the <dst> ref
in the remote repository is to be updated to. If no
<refspec> is specified on the command line, and if no
<refspec> is configured for the <repository>,
the behavior of the command is controlled by the `push.default`
configuration variable.
configuration variable, and if it is unset, the `simple`
behaviour is used (see lingit:git-config[1] and look
for `push.default`).
+
The <src> is often the name of the branch you would want to push, but
it can be any arbitrary "SHA-1 expression", such as `master~4` or
Expand All @@ -65,14 +69,11 @@ the remote repository.
The special refspec `:` (or `+:` to allow non-fast-forward updates)
directs git to push "matching" branches: for every branch that exists on
the local side, the remote side is updated if a branch of the same name
already exists on the remote side. This is the default operation mode
if no explicit refspec is found (that is neither on the command line
nor in any Push line of the corresponding remotes file---see below) and
no `push.default` configuration variable is set.
already exists on the remote side.

--all::
Instead of naming each ref to push, specifies that all
refs under `refs/heads/` be pushed.
Push all branches (i.e. refs under `refs/heads/`); cannot be
used with other <refspec>.

--prune::
Remove remote branches that don't have a local counterpart. For example
Expand Down Expand Up @@ -357,8 +358,10 @@ Examples
configured for the current branch).

`git push origin`::
Without additional configuration, works like
`git push origin :`.
Without additional configuration, pushes the current branch to
the configured upstream (`remote.origin.merge` configuration
variable) if it has the same name as the current branch, and
errors out without pushing otherwise.
+
The default behavior of this command when no <refspec> is given can be
configured by setting the `push` option of the remote, or the `push.default`
Expand Down
2 changes: 0 additions & 2 deletions advice.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

int advice_push_nonfastforward = 1;
int advice_push_non_ff_current = 1;
int advice_push_non_ff_default = 1;
int advice_push_non_ff_matching = 1;
int advice_status_hints = 1;
int advice_commit_before_merge = 1;
Expand All @@ -16,7 +15,6 @@ static struct {
} advice_config[] = {
{ "pushnonfastforward", &advice_push_nonfastforward },
{ "pushnonffcurrent", &advice_push_non_ff_current },
{ "pushnonffdefault", &advice_push_non_ff_default },
{ "pushnonffmatching", &advice_push_non_ff_matching },
{ "statushints", &advice_status_hints },
{ "commitbeforemerge", &advice_commit_before_merge },
Expand Down
1 change: 0 additions & 1 deletion advice.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

extern int advice_push_nonfastforward;
extern int advice_push_non_ff_current;
extern int advice_push_non_ff_default;
extern int advice_push_non_ff_matching;
extern int advice_status_hints;
extern int advice_commit_before_merge;
Expand Down
31 changes: 7 additions & 24 deletions builtin/push.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ static int progress = -1;
static const char **refspec;
static int refspec_nr;
static int refspec_alloc;
static int default_matching_used;

static void add_refspec(const char *ref)
{
Expand Down Expand Up @@ -148,9 +147,9 @@ static void setup_push_upstream(struct remote *remote, int simple)
}

static char warn_unspecified_push_default_msg[] =
N_("push.default is unset; its implicit value is changing in\n"
N_("push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
"and maintain the current behavior after the default changes, use:\n"
"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
Expand All @@ -175,14 +174,14 @@ static void setup_default_push_refspecs(struct remote *remote)
{
switch (push_default) {
default:
case PUSH_DEFAULT_UNSPECIFIED:
default_matching_used = 1;
warn_unspecified_push_default_configuration();
/* fallthru */
case PUSH_DEFAULT_MATCHING:
add_refspec(":");
break;

case PUSH_DEFAULT_UNSPECIFIED:
warn_unspecified_push_default_configuration();
/* fallthru */

case PUSH_DEFAULT_SIMPLE:
setup_push_upstream(remote, 1);
break;
Expand All @@ -208,12 +207,6 @@ static const char message_advice_pull_before_push[] =
"before pushing again.\n"
"See the 'Note about fast-forwards' in 'git push --help' for details.");

static const char message_advice_use_upstream[] =
N_("Updates were rejected because a pushed branch tip is behind its remote\n"
"counterpart. If you did not intend to push that branch, you may want to\n"
"specify branches to push or set the 'push.default' configuration variable\n"
"to 'simple', 'current' or 'upstream' to push only the current branch.");

static const char message_advice_checkout_pull_push[] =
N_("Updates were rejected because a pushed branch tip is behind its remote\n"
"counterpart. Check out this branch and merge the remote changes\n"
Expand All @@ -227,13 +220,6 @@ static void advise_pull_before_push(void)
advise(_(message_advice_pull_before_push));
}

static void advise_use_upstream(void)
{
if (!advice_push_non_ff_default || !advice_push_nonfastforward)
return;
advise(_(message_advice_use_upstream));
}

static void advise_checkout_pull_push(void)
{
if (!advice_push_non_ff_matching || !advice_push_nonfastforward)
Expand Down Expand Up @@ -272,10 +258,7 @@ static int push_with_options(struct transport *transport, int flags)
advise_pull_before_push();
break;
case NON_FF_OTHER:
if (default_matching_used)
advise_use_upstream();
else
advise_checkout_pull_push();
advise_checkout_pull_push();
break;
}

Expand Down

0 comments on commit b2ed944

Please sign in to comment.