X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;ds=sidebyside;f=pep-git.txt;h=2d9b20c588cfe628fb11c09a7b2e6edb4ca1702b;hb=a97db2d494d3981d34507f5d04e7b3cc15bdb682;hp=9f7eeea29faf08bcbecd3a224efe9b220606409e;hpb=c9f9df30816f59374506156638bff43794b6dc40;p=git-wiki.git diff --git a/pep-git.txt b/pep-git.txt index 9f7eeea..2d9b20c 100644 --- a/pep-git.txt +++ b/pep-git.txt @@ -159,6 +159,123 @@ git clones remote repository ``http://git.python.org/python.git`` to directory ``python``, creates remote branches and checks out branch ``v1`` into the working directory. +Updating local and remote branches +---------------------------------- + +There is a major difference between + +:: + + $ git fetch REMOTE BRANCH + +and + +:: + + $ git fetch REMOTE BRANCH:BRANCH + +The first command fetches commits from the named BRANCH in the REMOTE +repository that are not in your repository and leaves the id (the +hash) of the head commit in file .git/FETCH_HEAD. But it doesn't +update any branch (doesn't move any pointer). + +The second command fetches commits from the named BRANCH in the REMOTE +repository that are not in your repository and updates both the local +branch BRANCH and its upstream remote branch. But it refuses to update +branches in case of non-fast-forward. And it refuses to update the +current branch. + +The first command is used internall by ``git pull``. + +:: + + $ git pull REMOTE BRANCH + +is equivalent to + +:: + + $ git fetch REMOTE BRANCH + $ git merge FETCH_HEAD # FETCH_HEAD is a literal here + +Certainly, BRANCH in that case should be your current branch. If you +want to merge a different branch into your current branch first update +that non-current branch and then merge:: + + $ git fetch origin v1:v1 # Update v1 + $ git pull --rebase origin v2 # Update the current branch v2 using + # rebase instead of merge + $ git merge v1 + +It is possible to configure git to make it fetch/pull a few branches +or all branches at once, so you can simply run + +:: + + $ git pull origin + +or even + +:: + + $ git pull + +Push +'''' + +Pushing is a bit simpler. There is only one command ``push``. When you +run + +:: + + $ git push origin v1 v2 + +git guesses (knowing upstream remote branches) that you really want + +:: + + $ git push origin v1:v1 v2:v2 + +Git pushes commits to the remote repo and updates remote branches. It +is possible to configure git to make it push a few branches or all +branches at once, so you can simply run + +:: + + $ git push origin + +or even + +:: + + $ git push + +Git refuses to push a branch if it's the current branch in the remote +non-bare repository: git refuses to update remote working directory. +You really should push only to bare repositories. For non-bare +repositories git prefers pull-based workflow. + +Tags +'''' + +Git automatically fetches tags that point to commits being fetched +during fetch/pull. To fetch all tags (and commits they point to) run +``git fetch --tags origin``. To fetch some specific tags fetch them +explicitly:: + + $ git fetch origin tag NAME1 tag NAME2... + +For example:: + + $ git fetch origin tag 1.4.2 tag 2.1.7 + +Git doesn't automatically pushes tags. That allows you to have private +tags (lightweight tags are also private for a repo, they cannot be +pushed). To push tag(s) list them explicitly:: + + $ git push origin tag 1.4.2 + $ git push origin v1 v2 tag 2.1.7 + Commit editing and caveats ========================== @@ -246,6 +363,10 @@ Git has a builtin strategy for what Python core developers call $ git merge -s ours v1 # null-merge v1 into v2 +ReReRe +====== + + Database maintenance ====================