Junio C Hamano wrote:
> I do no think the remainder (snipped) belongs to the log message.
Oh, it was never intended to be a proper commit message. I'll write a
proper one when I send it in with the implementation.
> - To understand "if central, works as upstream, otherwise works as
> current", the readers need to know if their workflow is 'central'
> or not, so we need to say how that is decided upfront (probably
> immediately before "Possible values are:" in the introductory
> paragraph for push.default;
Good idea.
> - For each of these choices, what it means is more important to the
> readers than how the implementation achieves that semantics
> (e.g. "current uses refs/heads/foo:refs/heads/foo when you are on
> foo branch"). I think the ideal is a description of the meaning
> that is clear enough not to require any implementation detail.
I'd definitely like to include the push refspec, to educate users on
how to achieve a one-off matching-push even when push.default is set
to current, for example.
> As this is an attempt to _define_ the semantics of what should
> happen in triangular workflow, I think it would be healthy to wait
> for a week or so in order for others (not just two of us) can see if
> we have defined a sane semantics we would want to go forward with.
Agreed.
> I am reasonably sure 'current' would be the best default for
> triangular (and that is why I suggested 'simple' to fall back to
> it), but I do not think others had a chance to see what design our
> discussion settled, think if that makes sense, and think of a better
> alternative.
You didn't realize one thing, because my wording was terrible:
`simple` is just a "safe" version of `current` :)
* `simple` - behaves exactly like `current`, with one safety feature:
in central workflows, it errors out if branch.$branch.merge is set and
is not equal to $branch (to make sure that the `push` and `pull`
aren't asymmetrical).
In other words, it's `current` with the safety feature of `upstream`.
There's no point in erroring out if no upstream is set, or mentioning
its relationship with `upstream`.
>> +* `nothing` - error out unless a refspec is explicitly given.
>
> I do not think 'error out' is the primary effect of this mode.
> Wouldn't "do not push anything" be much better?
"Do not push anything" is misleading because it implies an exit status
of zero; what is really does is "error out", no?
>> +* `current` - push the refspec "$HEAD". HEAD is resolved early to a
>> + branch name (referred to as $HEAD). In other words, push the
>> + current branch to update a branch with the same name on the pushing
>> + side.
>
> As already pointed out, dropping everything before and including "In
> other words, " would be better.
I'd like to put it in the end, like Matthieu suggested.
> Also "push the current branch" is
> talking about the branch on the pushing side (you, the one who is
> running "git push"), and the side that is getting updated is at the
> receiving end, not "pushing side".
"receiving end" is better, yes.
> I think listing 'simple' at the end would be easier to read. The
> above already swaps the order to make sure current and upstream are
> described before it, which is good.
As I pointed out, `simple` is just a composition of `current` and
`upstream`. That's why it comes after them. Also, I thought
`nothing`, `current`, `upstream` were fundamental: which is why they
come first.
> But I do not see a reason to move 'matching' which was next to
> 'nothing' here.
It's probably a personal bias, but I don't like matching at all :P
>> +* `matching` - push the refspec ":". In other words, push all
>> + branches having the same name in both ends, even if it means
>> + non-fast-forward updates. This is for those who prepare all the
>> + branches into a publishable shape and then push them out with a
>> + single command. Dangerous, and inappropriate unless you are the
>> + only person updating your push destination.
>
> It was already pointed out that unnecessary negativity needs to be
> fixed, but more importantly the above "Dangerous" is not even
> correct.
Okay, I'll explain my bias:
I have _never_ lost data with git: the reflog is my close companion.
There is one recent instance where I *lost* data, and I was very
unhappy about it. I work on multiple machines, and not all local
branches are always synced with the upstream branches: when I switch
to a local branch to work on the topic, I notice my prompt and get it
to '=' before starting work. In this one instance, I was developing
@{push} and toying around with various push.default settings. I'd
forgotten that I'd set push.default to matching and issued my usual
push to update my branch. This resulted in a huge number of my
branches getting rewound, and I could do nothing about it!
We've mentioned that pull --rebase is _dangerous_ (with the underline
for effect) in our documentation, when it's trivial to recover from
it: git reset --hard @{1}. Yet, when I mention matching being
dangerous, I'm accused of being unnecessarily negative :\
In my opinion, `matching` is a bad and unpredictable setting, and
deserves last place on the list. `nothing` deserves first place,
because it is the most predictable and least surprising. Do not
mistake my stance for "matching is not useful"; ofcourse it is useful,
and I sometimes use it myself using ":" explicitly.
>> -+
>> -The `simple`, `current` and `upstream` modes are for those who want to
>> -push out a single branch after finishing work, even when the other
>> -branches are not yet ready to be pushed out. If you are working with
>> -other people to push into the same shared repository, you would want
>> -to use one of these.
>
> And I do not see a reason to drop this part, especially the first
> sentence.
I thought we should make it clear in the `matching` section; after
all, it's just `matching` versus everything else.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html