-
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 all commits
419d2f7
c60dc9d
a7a41fd
bf611db
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,68 +15,53 @@ SYNOPSIS | |
DESCRIPTION | ||
----------- | ||
|
||
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`. | ||
|
||
Assume the following history exists and the current branch is | ||
"`master`": | ||
Integrate changes from a remote repository into the current branch. | ||
|
||
------------ | ||
A---B---C master on origin | ||
/ | ||
D---E---F---G master | ||
^ | ||
origin/master in your repository | ||
------------ | ||
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. | ||
|
||
Then "`git pull`" will fetch and replay the changes from the remote | ||
`master` branch since it diverged from the local `master` (i.e., `E`) | ||
until its current commit (`C`) on top of `master` and record the | ||
result in a new commit along with the names of the two parent commits | ||
and a log message from the user describing the changes. | ||
|
||
------------ | ||
A---B---C origin/master | ||
/ \ | ||
D---E---F---G---H master | ||
------------ | ||
There are 4 main options for integrating the remote branch: | ||
|
||
See linkgit:git-merge[1] for details, including how conflicts | ||
are presented and handled. | ||
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` | ||
|
||
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. | ||
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. | ||
|
||
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`. | ||
|
||
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 +130,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):