How To: Share with world
related commands:
fetch pull push remote
Now you know basics about git, it’s time to share your work with your team and/or the world.
Note:
This post will only talk about local / remote without branches. This subject will be discuss in a future post.
Showing remotes
If you have cloned your repository with git clone, you have one remote repository configured. In all cases, to see configured remotes, run:
$ git remote
origin
With -v option, the command will add urls that Git use for read (fetch) and write (push) to that remote:
$ git remote -v
origin http://remote/repository/url (fetch)
origin http://remote/repository/url (push)
Adding remote repository
git clone implicitly add the origin remote for you. If you want to add another remote explicitly, use the remote add command:
$ git remote add <shortname> <url>
$ git remote -v
origin http://remote/repository/url (fetch)
origin http://remote/repository/url (push)
<shortname> <url> (fetch)
<shortname> <url> (push)
Now, for all other remote commands, you will be able to use <shortname> instead of <url>.
Inspecting remote
It’s possible to see some informations about a particular remote. Over origin, the command will answer:
$ git remote show origin
* remote origin
Fetch URL: <url>
Push URL: <url>
HEAD branch: master
Remote branches:
master tracked
<branch> tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Downloading world work
To get datas from your remote repository you can run:
$ git fetch <remote_name>
This command will download all remote datas you don’t have locally, but without merging them in your local branches.
Now you can merge or rebase/merge remotes datas into local.
There is a way to do it in one command:
$ git pull --rebase=preserve
Some explainations? Ok: pull command without options will do a fetch then a merge, and the --rebase=preserve will ensure you to keep a clean history in complicated merge case.
By default, git pull will do:
$ git fetch
$ git merge origin/master
If the remote branch hasn’t move between 2 pull, there will be no problems. But if it move, the merge will do a true merge with a merge commit and keep the remote branch in history and it’s not that we want. It’s here that the --rebase option will save us.
With the --rebase=preserve option, Git make a rebase before the merge, but will preserve your local branching merge.
There is a configuration variable you can set:
$ git config --global pull.rebase preserve
With this configuration, a simple git pull will do git pull --rebase=preserve.
You can found more informations about git pull --rebase here.
Publishing your work
To send your local work to the remote repository, the command to use is realy simple:
$ git push <remote_name> master
But sometimes, when you’re not up to date locally with remote branch, the push will fail:
$ git push origin master
To /tmp/remote
! [rejected] master -> origin/master (fetch first)
error: failed to push some refs to '/tmp/remote'
hint: Updates were rejected because the remote contains work
hint: that you do not have locally. This is usually caused by
hint: another repository pushing to the same ref. You may want
hint: to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help'
hint: for details.
Do not use the tip unless you set the pull.rebase preserve configuration. If not, use git pull --rebase=preserve.
Then you can do the push again.
Remember that tags are not pushed automatically. To publish them, use:
$ git push --tags origin master
Renaming / Removing remotes
Like for adding, it’s pretty obvious:
$ git remote rename <old-remote-name> <new-remote-name>
$ git remote remove <remote-name>
Reminder
fetch
Download datas from <remote>
$ git fetch <remote>
Download datas from all remotes
$ git fetch --all
pull
Download and merge datas from remote
$ git pull
Download and securely merge datas from remote
$ git pull --rebase=preventor with config:
$ git config --global pull.rebase prevent $ git pull
push
Send local datas to remote
$ git push <remote> master
Send tags to remote
$ git push --tags <remote> master
remote
Check configured remote repositories
$ git remote
Check configured remote repositories with urls
$ git remote -v
Show informations about remote
$ git remote show <remote-name>
Add new remote repository
$ git remote add <shortname> <url>
Locally rename remote repository
$ git remote rename <old> <new>
Locally remove a remote repository
$ git remote remove <remote-name>