git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Added a few examples to git-pull man page.
@ 2005-11-05  2:36 Jon Loeliger
  2005-11-05  9:27 ` Junio C Hamano
  0 siblings, 1 reply; 3+ messages in thread
From: Jon Loeliger @ 2005-11-05  2:36 UTC (permalink / raw)
  To: git

Added a few examples to git-pull man page.
Clarified and added notes for pull/push refspecs.
Converted to back-ticks for literal text examples.

Signed-off-by: Jon Loeliger <jdl@freescale.com>
---

Hmmm.  Are back-ticks the standard for literal text examples?




 Documentation/git-pull.txt         |   55 ++++++++++++++++++++++++++--
 Documentation/pull-fetch-param.txt |   72 +++++++++++++++++++++++++-----------
 2 files changed, 101 insertions(+), 26 deletions(-)

applies-to: a469bc3e7efcb96db78bbffcdabcbea01bead34d
ca90ebc23d3e6fb73bc7da3e3d893adab8456722
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index cef4c0a..8f37d53 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -19,7 +19,7 @@ When only one ref is downloaded, runs 'g
 into the local HEAD.  Otherwise uses 'git octopus' to merge them
 into the local HEAD.
 
-Note that you can use '.' (current directory) as the
+Note that you can use `.` (current directory) as the
 <repository> to pull from the local repository -- this is useful
 when merging local branches into the current branch.
 
@@ -29,8 +29,57 @@ include::pull-fetch-param.txt[]
 
 -a, \--append::
 	Append ref names and object names of fetched refs to the
-	existing contents of $GIT_DIR/FETCH_HEAD.  Without this
-	option old data in $GIT_DIR/FETCH_HEAD will be overwritten.
+	existing contents of `$GIT_DIR/FETCH_HEAD`.  Without this
+	option old data in `$GIT_DIR/FETCH_HEAD` will be overwritten.
+
+Examples
+--------
+Command line pull of multiple branches from one repository::
++
+------------------------------------------------
+$ cat .git/remotes/origin
+URL: rsync://rsync.kernel.org/pub/scm/git/git.git
+Pull: master:origin
+
+$ git checkout master
+$ git fetch origin master:origin +pu:pu maint:maint
+$ git pull . origin
+------------------------------------------------
++
+Here, a typical `$GIT_DIR/remotes/origin` file from a
+`git-clone` operation is used in combination with
+command line options to `git-fetch` to first update
+multiple branches of the local repository and then
+to merge the remote `origin` branch into the local
+`master` branch.  The local `pu` branch is updated
+even if it does not result in a fast forward update.
+Here, the pull can obtain its objects from the local
+repository using `.`, as the previous `git-fetch` is
+known to have already obtained and made available
+all the necessary objects.
+
+
+Pull of multiple branches from one repository using `$GIT_DIR/remotes` file::
++
+------------------------------------------------
+$ cat .git/remotes/origin
+URL: rsync://rsync.kernel.org/pub/scm/git/git.git
+Pull: master:origin
+Pull: +pu:pu
+Pull: maint:maint
+
+$ git checkout master
+$ git pull origin
+------------------------------------------------
++
+Here, a typical `$GIT_DIR/remotes/origin` file from a
+`git-clone` operation has been hand-modified to include
+the branch-mapping of additional remote and local
+heads directly.  A single `git-pull` operation while
+in the `master` branch will fetch multiple heads and
+merge the remote `origin` head into the current,
+local `master` branch.
+
 
 Author
 ------
diff --git a/Documentation/pull-fetch-param.txt b/Documentation/pull-fetch-param.txt
index e8db9d7..2a71318 100644
--- a/Documentation/pull-fetch-param.txt
+++ b/Documentation/pull-fetch-param.txt
@@ -1,7 +1,8 @@
 <repository>::
-	The "remote" repository to pull from.  One of the
-	following notations can be used to name the repository
-	to pull from:
+	The "remote" repository that is the source of a fetch
+	or pull operation, or the destination of a push operation.
+	One of the following notations can be used
+	to name the remote repository:
 +
 ===============================================================
 - Rsync URL:		rsync://remote.machine/path/to/repo.git/
@@ -12,7 +13,7 @@
 ===============================================================
 +
 In addition to the above, as a short-hand, the name of a
-file in $GIT_DIR/remotes directory can be given; the
+file in `$GIT_DIR/remotes` directory can be given; the
 named file should be in the following format:
 +
 	URL: one of the above URL format
@@ -21,57 +22,82 @@ named file should be in the following fo
 +
 When such a short-hand is specified in place of
 <repository> without <refspec> parameters on the command
-line, <refspec>... specified on Push lines or Pull lines
-are used for "git push" and "git fetch/pull",
-respectively.
+line, <refspec>... specified on `Push:` lines or `Pull:`
+lines are used for `git-push` and `git-fetch`/`git-pull`,
+respectively.  Multiple `Push:` and and `Pull:` lines may
+be specified for additional branch mappings.
 +
-The name of a file in $GIT_DIR/branches directory can be
+The name of a file in `$GIT_DIR/branches` directory can be
 specified as an older notation short-hand; the named
 file should contain a single line, a URL in one of the
-above formats, optionally followed by a hash '#' and the
+above formats, optionally followed by a hash `#` and the
 name of remote head (URL fragment notation).
-$GIT_DIR/branches/<remote> file that stores a <url>
+`$GIT_DIR/branches/<remote>` file that stores a <url>
 without the fragment is equivalent to have this in the
-corresponding file in the $GIT_DIR/remotes/ directory
+corresponding file in the `$GIT_DIR/remotes/` directory.
 +
 	URL: <url>
 	Pull: refs/heads/master:<remote>
 +
-while having <url>#<head> is equivalent to
+while having `<url>#<head>` is equivalent to
 +
 	URL: <url>
 	Pull: refs/heads/<head>:<remote>
 
 <refspec>::
 	The canonical format of a <refspec> parameter is
-	'+?<src>:<dst>'; that is, an optional plus '+', followed
-	by the source ref, followed by a colon ':', followed by
+	`+?<src>:<dst>`; that is, an optional plus `+`, followed
+	by the source ref, followed by a colon `:`, followed by
 	the destination ref.
 +
-When used in "git push", the <src> side can be an
+When used in `git-push`, the <src> side can be an
 arbitrary "SHA1 expression" that can be used as an
-argument to "git-cat-file -t".  E.g. "master~4" (push
+argument to `git-cat-file -t`.  E.g. `master~4` (push
 four parents before the current master head).
 +
-For "git push", the local ref that matches <src> is used
+For `git-push`, the local ref that matches <src> is used
 to fast forward the remote ref that matches <dst>.  If
-the optional plus '+' is used, the remote ref is updated
+the optional plus `+` is used, the remote ref is updated
 even if it does not result in a fast forward update.
 +
-For "git fetch/pull", the remote ref that matches <src>
+For `git-fetch` and `git-pull`, the remote ref that matches <src>
 is fetched, and if <dst> is not empty string, the local
 ref that matches it is fast forwarded using <src>.
-Again, if the optional plus '+' is used, the local ref
+Again, if the optional plus `+` is used, the local ref
 is updated even if it does not result in a fast forward
 update.
 +
+[NOTE]
+If the remote branch from which you want to pull is
+modified in non-linear ways such as being rewound and
+rebased frequently, then a pull will attempt a merge with
+an older version of itself, likely conflict, and fail.
+It is under these conditions that you would want to use
+the `+` sign to indicate non-fast-forward updates will
+be needed.  There is currently no easy way to determine
+or declare that a branch will be made available in a
+repository with this behavior; the pulling user simply
+must know this is the expected usage pattern for a branch.
++
+[NOTE]
+You never do your own development on branches that appear
+on the right hand side of a <refspec> colon on `Pull:` lines;
+they are to be updated by `git-fetch`.  The corollary is that
+a local branch should be introduced and named on a <refspec>
+right-hand-side if you intend to do development derived from
+that branch.
+This leads to the common `Pull: master:origin` mapping of a
+remote `master` branch to a local `origin` branch, which
+is then merged to a local development branch, again typically
+named `master`.
++
 Some short-cut notations are also supported.
 +
-* For backward compatibility, "tag" is almost ignored;
+* For backward compatibility, `tag` is almost ignored;
   it just makes the following parameter <tag> to mean a
-  refspec "refs/tags/<tag>:refs/tags/<tag>".
+  refspec `refs/tags/<tag>:refs/tags/<tag>`.
 * A parameter <ref> without a colon is equivalent to
-  <ref>: when pulling/fetching, and <ref>:<ref> when
+  <ref>: when pulling/fetching, and <ref>`:`<ref> when
   pushing.  That is, do not store it locally if
   fetching, and update the same name if pushing.
 
---
0.99.9.GIT

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] Added a few examples to git-pull man page.
  2005-11-05  2:36 [PATCH] Added a few examples to git-pull man page Jon Loeliger
@ 2005-11-05  9:27 ` Junio C Hamano
  2005-11-05 19:37   ` Josef Weidendorfer
  0 siblings, 1 reply; 3+ messages in thread
From: Junio C Hamano @ 2005-11-05  9:27 UTC (permalink / raw)
  To: Jon Loeliger; +Cc: git

Thanks for the documentation updates.  I have one
trouble about this part:

    You never do your own development on branches that appear
    on the right hand side of a <refspec> colon on `Pull:` lines;
    they are to be updated by `git-fetch`.  The corollary is that
    a local branch should be introduced and named on a <refspec>
    right-hand-side if you intend to do development derived from
    that branch.
    This leads to the common `Pull: master:origin` mapping of a
    remote `master` branch to a local `origin` branch, which
    is then merged to a local development branch, again typically
    named `master`.

I am a bit confused by the "corollary".  What happens if you
have the following:

	Pull: master:origin
        Pull: +pu:pu
        Pull: maint:maint

and you say:

	git-pull remote

when you are on your master branch is:

1. master, pu and maint from remote are copied to origin, pu,
   and maint in the local repository (you already know this);

2. the updated origin is merged into the local master (you
   alerady know this too).

If somebody intends to do development derived from say 'maint',
one way to do so would be something like this:

	git checkout -b my-maint maint
	.. work work work, commit commit commit
        .. "git-format-patch maint..my-maint" to send patches
	.. off, or send a pull request to upstream.
        git fetch remote ;# to update origin, pu, and maint.
        git pull . maint ;# merge maint changes into my-maint.

That is, my-maint branch is used for your own development, and
from time to time you fetch remote heads (using remotes/remote
shorthands, the fetch would update origin, pu and maint) to keep
track of the progress of the upstream.  And you merge upstream
'maint' into your development line 'my-maint', when you find
that the upstream have something new in 'maint'.

And because of the rule "you never do your own development on RHS
branch":

	git checkout maint
        .. work work work, commit commit commit
        git pull remote ;# oops

this is discouraged.  'git pull remote' would try to overwrite
the local 'maint' with the remote 'maint', and it would find
that the head would not fast-forward (obviously, since we did
our own work that the remote side does not know about).  But
when I read the "corollary" the first time, it appeared to me
that we are suggesting the above.

Maybe something like this (I know my wording is quite bad and I
would appreciate rephrasing it better very much) would be more
explicit and appropriate?

    If you intend to do development derived from a remote
    branch B, have a `Pull:` line to track it, like this:

        Pull: B:remote-B

    and have a separate branch my-B to do your development
    on top of it.  The latter is created by 'git branch my-B
    remote-B' (or its equivalent, 'git checkout -b my-B
    remote-B'), and that is the branch you make your own
    commits.  Run 'git fetch' to keep track of the progress
    of the remote side, and when you see the tracked remote
    branch has something new, merge it into your development
    branch with 'git pull . remote-B', while you are on my-B
    branch.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Added a few examples to git-pull man page.
  2005-11-05  9:27 ` Junio C Hamano
@ 2005-11-05 19:37   ` Josef Weidendorfer
  0 siblings, 0 replies; 3+ messages in thread
From: Josef Weidendorfer @ 2005-11-05 19:37 UTC (permalink / raw)
  To: git

On Saturday 05 November 2005 10:27, Junio C Hamano wrote:
> Maybe something like this (I know my wording is quite bad and I
> would appreciate rephrasing it better very much) would be more
> explicit and appropriate?
> 
>     If you intend to do development derived from a remote
>     branch B, have a `Pull:` line to track it, like this:
> 
>         Pull: B:remote-B
> 
>     and have a separate branch my-B to do your development
>     on top of it.  The latter is created by 'git branch my-B
>     remote-B' (or its equivalent, 'git checkout -b my-B
>     remote-B'), and that is the branch you make your own
>     commits.  Run 'git fetch' to keep track of the progress
>     of the remote side, and when you see the tracked remote
>     branch has something new, merge it into your development
>     branch with 'git pull . remote-B', while you are on my-B
>     branch.

It would be good to explicitly mention that exactly this is
already setup for you after cloning: you are prepared to do
local development based on the remote "master", with
	- remote head "B" = remote head "master"
	- local head "remote-B" = local head "origin"
	- local head "my-B" = local head "master"

Hmm. I just looked up the manual page of "git-clone", but it
does not mention this. It also should say that all remote heads
are cloned to local heads with the same name, with one exception:
remote "master" matches local "origin".

This feels really inconsistent. Junio, I think your proposal of
tracking remote "B" with local "origin/B" is a lot better. It
allows to name a local development branch for any remote "B" by
the same local name "B".

We could make heads starting with "origin/" special: Never let
"git commit" update such a head, but give out a warning instead,
that this head should not be changed locally, as it is used for
tracking a remote head. This warning could suggest to do "git branch"
before committing.
This special handling (of "origin/") should not be hardcoded, but
configurable, perhaps in .git/remotes:

	URL: remote-URL
	Prefix: origin/

Josef

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-11-05 19:08 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-05  2:36 [PATCH] Added a few examples to git-pull man page Jon Loeliger
2005-11-05  9:27 ` Junio C Hamano
2005-11-05 19:37   ` Josef Weidendorfer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).