-
Notifications
You must be signed in to change notification settings - Fork 157
doc: git-pull: clarify DESCRIPTION section #1976
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 2 commits
4cc87ec
122774d
323e81f
999dfba
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,28 +15,25 @@ SYNOPSIS | |
DESCRIPTION | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, Junio C Hamano wrote (reply to this): "Julia Evans via GitGitGadget" <[email protected]> writes:
> +Integrate changes from a remote repository into the current branch.
> +
> +First, `git pull` runs `git fetch` with the same arguments
> +(excluding merge options) to fetch remote branch(es).
> +Then it decides which remote branch to integrate: if you run `git pull`
> +with no arguments this defaults to the <<UPSTREAM-BRANCHES,upstream>>
> +for the current branch.
> +Then it integrates that branch into the current branch.
> +There are 4 main options for integrating the remote branch:
> +
> +1. `git pull --ff-only` will only do "fast-forward" updates: it
> + fails if the remote branch has diverged. This is the default.
Technically, you can pretend to be the king, the center of the
world, and occasionally publish your very latest to the remote by
pushing there, and it is technically possible that the remote to
diverge from you by somehow acquiring its own commits, so the above
is not wrong per-se, but the way it is phrased is a bit awkward.
The operation fails when _you_ diverged from the remote branch.
In other words, you cloned or made yourself in-sync with the remote
earlier, the remote may or may not have progressed before your
'pull'. If you created your own commits on top of the state that
was in sync with them, you diverged from them and --ff-only is
stopped in such a case. If you haven't changed your branch since
you were in sync with them the last time, --ff-only would
fast-forward your branch to match what they have.
> +2. `git pull --rebase` runs `git rebase`
This technically does not integrate remote branch into our current
branch. Rather, the commits on our current branch are integrated
on top of their history. That may be worth noting? I dunno.
> +3. `git pull --no-rebase` runs `git merge`.
> +4. `git pull --squash` runs `git merge --squash`
> +
> +You can also set the configuration options `pull.rebase`, `pull.squash`,
> +or `pull.ff` with your preferred behaviour.
This part has two orthogonal things, each of which has its own
default, which may be a bit confusing. (1) which branch we get from
the remote integrates with the current branch. The default is to
use the upstream of our current branch. (2) how the integration
between the remote thing and our current branch is done. The
default is only to accept fast-forward updates.
Perhaps it may help clarify the flow if we said upfront that we
describe two orthgonal things? E.g.,
First it fetches. Then it decides two things: what to integrage
with the current branch, and how to do the integration. By
default, the upstream branch of the current branch is what gets
integrated, and by default "pull --ff-only" (described below) is
how the integration is done.
or something? I dunno.
|
||
----------- | ||
|
||
Incorporates changes from a remote repository into the current branch. | ||
If the current branch is behind the remote, then by default it will | ||
fast-forward the current branch to match the remote. If the current | ||
branch and the remote have diverged, the user needs to specify how to | ||
reconcile the divergent branches with `--rebase` or `--no-rebase` (or | ||
the corresponding configuration option in `pull.rebase`). | ||
|
||
More precisely, `git pull` runs `git fetch` with the given parameters | ||
and then depending on configuration options or command line flags, | ||
will call either `git rebase` or `git merge` to reconcile diverging | ||
branches. | ||
|
||
<repository> should be the name of a remote repository as | ||
passed to linkgit:git-fetch[1]. <refspec> can name an | ||
arbitrary remote ref (for example, the name of a tag) or even | ||
a collection of refs with corresponding remote-tracking branches | ||
(e.g., refs/heads/{asterisk}:refs/remotes/origin/{asterisk}), | ||
but usually it is the name of a branch in the remote repository. | ||
|
||
Default values for <repository> and <branch> are read from the | ||
"remote" and "merge" configuration for the current branch | ||
as set by linkgit:git-branch[1] `--track`. | ||
Integrate changes from a remote repository into the current branch. | ||
|
||
First, `git pull` runs `git fetch` with the same arguments | ||
(excluding merge options) to fetch remote branch(es). | ||
Then it decides which remote branch to integrate: if you run `git pull` | ||
with no arguments this defaults to the <<UPSTREAM-BRANCHES,upstream>> | ||
for the current branch. | ||
Then it integrates that branch into the current branch. | ||
|
||
There are 4 main options for integrating the remote branch: | ||
|
||
1. `git pull --ff-only` will only do "fast-forward" updates: it | ||
fails if the remote branch has diverged. This is the default. | ||
2. `git pull --rebase` runs `git rebase` | ||
3. `git pull --no-rebase` runs `git merge`. | ||
4. `git pull --squash` runs `git merge --squash` | ||
|
||
You can also set the configuration options `pull.rebase`, `pull.squash`, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, "Julia Evans" wrote (reply to this): On Tue, Sep 23, 2025, at 3:45 PM, Julia Evans via GitGitGadget wrote:
> From: Julia Evans <[email protected]>
>
> From user feedback:
>
> - One user is confused about why `git reset --merge`
> (why not just `git reset`?). Handle this by mentioning
> `git merge --abort` and `git reset --abort` instead, which have a
> more obvious meaning.
> - 2 users want to know what "In older versions of Git" means exactly
> (in versions older than 1.7.0). Handle this by removing the warning
> since it was added 15 years ago (in 3f8fc184c0e2c)
>
> Signed-off-by: Julia Evans <[email protected]>
> ---
> Documentation/git-pull.adoc | 12 +++---------
> 1 file changed, 3 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/git-pull.adoc b/Documentation/git-pull.adoc
> index 91903b0a94..eec05ab6c7 100644
> --- a/Documentation/git-pull.adoc
> +++ b/Documentation/git-pull.adoc
> @@ -30,15 +30,9 @@ branch. There are 4 main options for integrating the
> remote branch:
> You can also set the configuration options `pull.rebase`,
> `pull.squash`,
> or `pull.ff` with your preferred behaviour.
>
> -In Git 1.7.0 or later, to cancel a conflicting merge, use
> -`git reset --merge`. *Warning*: In older versions of Git, running 'git pull'
> -with uncommitted changes is discouraged: while possible, it leaves you
> -in a state that may be hard to back out of in the case of a conflict.
> -
> -If any of the remote changes overlap with local uncommitted changes,
> -the merge will be automatically canceled and the work tree untouched.
> -It is generally best to get any local changes in working order before
> -pulling or stash them away with linkgit:git-stash[1].
After sending this I thought to read the `git merge` man page, which has
this warning:
> WARNING: Running `git merge` with non-trivial uncommitted changes is
discouraged: while possible, it may leave you in a state that is hard to
back out of in the case of a conflict.
I think I was probably too hasty in removing the warning entirely, since I
mainly use `git pull --rebase` and I hadn't fully thought through how
`git merge` has a different approach to uncommitted changes than
`git rebase`.
I think a warning similar to that one would make sense, since any warning
that applies to `git merge` should also apply to `git pull`.
> +If there's a merge conflict during the merge or rebase that you don't
> +want to handle, you can safely abort it with `git merge --abort` or `git
> +--rebase abort`.
Also I noticed a typo in `git --rebase abort` :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, "D. Ben Knoble" wrote (reply to this): On Tue, Sep 23, 2025 at 3:48 PM Julia Evans via GitGitGadget
<[email protected]> wrote:
>
> From: Julia Evans <[email protected]>
>
> From user feedback:
>
> - One user is confused about why `git reset --merge`
> (why not just `git reset`?). Handle this by mentioning
> `git merge --abort` and `git reset --abort` instead, which have a
> more obvious meaning.
"git reset --merge" _can_ be helpful when merging, but won't fully
abort a rebase. Great.
> --- a/Documentation/git-pull.adoc
> +++ b/Documentation/git-pull.adoc
> @@ -30,15 +30,9 @@ branch. There are 4 main options for integrating the remote branch:
> You can also set the configuration options `pull.rebase`, `pull.squash`,
> or `pull.ff` with your preferred behaviour.
>
> -In Git 1.7.0 or later, to cancel a conflicting merge, use
> -`git reset --merge`. *Warning*: In older versions of Git, running 'git pull'
> -with uncommitted changes is discouraged: while possible, it leaves you
> -in a state that may be hard to back out of in the case of a conflict.
> -
> -If any of the remote changes overlap with local uncommitted changes,
> -the merge will be automatically canceled and the work tree untouched.
> -It is generally best to get any local changes in working order before
> -pulling or stash them away with linkgit:git-stash[1].
> +If there's a merge conflict during the merge or rebase that you don't
> +want to handle, you can safely abort it with `git merge --abort` or `git
> +--rebase abort`.
This information is also mentioned in the advice given by conflicts
(and git status), so while I originally wondered if we need to say "to
know which to use, run…", I now think we can trust users to know
whether they asked for a merge or rebase and read the advice/git
status output when they don't.
Hah, just kidding. Nobody* reads that output. But I still don't think
it's worth muddying here, because the same folks are unlikely to see
the help here, right? Or maybe we say "Information in `git status`
will summarize these options for you." ?
[*] Obviously untrue, but you all know what I mean
--
D. Ben Knoble There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On the Git mailing list, "Julia Evans" wrote (reply to this): On Wed, Sep 24, 2025, at 4:29 PM, D. Ben Knoble wrote:
> On Tue, Sep 23, 2025 at 3:48 PM Julia Evans via GitGitGadget
> <[email protected]> wrote:
>>
>> From: Julia Evans <[email protected]>
>>
>> From user feedback:
>>
>> - One user is confused about why `git reset --merge`
>> (why not just `git reset`?). Handle this by mentioning
>> `git merge --abort` and `git reset --abort` instead, which have a
>> more obvious meaning.
>
> "git reset --merge" _can_ be helpful when merging, but won't fully
> abort a rebase. Great.
>
>> --- a/Documentation/git-pull.adoc
>> +++ b/Documentation/git-pull.adoc
>> @@ -30,15 +30,9 @@ branch. There are 4 main options for integrating the remote branch:
>> You can also set the configuration options `pull.rebase`, `pull.squash`,
>> or `pull.ff` with your preferred behaviour.
>>
>> -In Git 1.7.0 or later, to cancel a conflicting merge, use
>> -`git reset --merge`. *Warning*: In older versions of Git, running 'git pull'
>> -with uncommitted changes is discouraged: while possible, it leaves you
>> -in a state that may be hard to back out of in the case of a conflict.
>> -
>> -If any of the remote changes overlap with local uncommitted changes,
>> -the merge will be automatically canceled and the work tree untouched.
>> -It is generally best to get any local changes in working order before
>> -pulling or stash them away with linkgit:git-stash[1].
>> +If there's a merge conflict during the merge or rebase that you don't
>> +want to handle, you can safely abort it with `git merge --abort` or `git
>> +--rebase abort`.
>
> This information is also mentioned in the advice given by conflicts
> (and git status), so while I originally wondered if we need to say "to
> know which to use, run…", I now think we can trust users to know
> whether they asked for a merge or rebase and read the advice/git
> status output when they don't.
>
> Hah, just kidding. Nobody* reads that output. But I still don't think
> it's worth muddying here, because the same folks are unlikely to see
> the help here, right? Or maybe we say "Information in `git status`
> will summarize these options for you." ?
I think it's a nice way to reiterate that `git pull` is running a merge or
rebase under the hood, but if folks feel strongly that this isn't relevant
I'd be happy to remove the `git merge --abort` / `git rebase --abort` note. |
||
or `pull.ff` with your preferred behaviour. | ||
|
||
Assume the following history exists and the current branch is | ||
"`master`": | ||
|
@@ -77,6 +74,26 @@ pulling or stash them away with linkgit:git-stash[1]. | |
OPTIONS | ||
------- | ||
|
||
<repository>:: | ||
The "remote" repository to pull from. This can be either | ||
a URL (see the section <<URLS,GIT URLS>> below) or the name | ||
of a remote (see the section <<REMOTES,REMOTES>> below). | ||
+ | ||
Defaults to the configured upstream for the current branch, or `origin`. | ||
See <<UPSTREAM-BRANCHES,UPSTREAM BRANCHES>> below for more on how to | ||
configure upstreams. | ||
|
||
<refspec>:: | ||
Which branch or other reference(s) to fetch and integrate into the | ||
current branch, for example `main` in `git pull origin main`. | ||
Defaults to the configured upstream for the current branch. | ||
+ | ||
This can be a branch, tag, or other collection of reference(s). | ||
See <<fetch-refspec,<refspec>>> below under "Options related to fetching" | ||
for the full syntax, and <<DEFAULT-BEHAVIOUR,DEFAULT BEHAVIOUR>> below | ||
for how `git pull` uses this argument to determine which remote branch | ||
to integrate. | ||
|
||
-q:: | ||
--quiet:: | ||
This is passed to both underlying git-fetch to squelch reporting of | ||
|
@@ -145,6 +162,7 @@ include::urls-remotes.adoc[] | |
|
||
include::merge-strategies.adoc[] | ||
|
||
[[DEFAULT-BEHAVIOUR]] | ||
DEFAULT BEHAVIOUR | ||
----------------- | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, "D. Ben Knoble" wrote (reply to this):
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, "Julia Evans" wrote (reply to this):
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, Chris Torek wrote (reply to this):
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the Git mailing list, "Julia Evans" wrote (reply to this):