Difference between revisions of "Git howto"
Line 1: | Line 1: | ||
− | + | This is a guide to Working with freeplane's git repository. | |
− | + | The first part covers the commands you need the most, while the second part | |
− | + | ("Knowledge Base") adds some commands for special situations such as when | |
+ | undoing commits or reverting files (currently there is some redundancy between the | ||
+ | two which we will remove soon). | ||
You can (and probably want to) use eclipse for most operations. I try to | You can (and probably want to) use eclipse for most operations. I try to | ||
explain this in each section, but it is a good idea to read the | explain this in each section, but it is a good idea to read the | ||
− | [http://wiki.eclipse.org/EGit/User_Guide EGit documentation]. | + | [http://wiki.eclipse.org/EGit/User_Guide EGit documentation]. Some operations, |
+ | such as creating remote branches should be applied with the command line only | ||
+ | (in order to make sure that tracking branches are setup correctly). | ||
'''NOTE''': Some instructions cover only the temporary freeplane repository | '''NOTE''': Some instructions cover only the temporary freeplane repository | ||
Line 13: | Line 17: | ||
by Linus Torvalds on git. | by Linus Torvalds on git. | ||
− | === Installation / Configuration | + | = Quickstart Guide = |
+ | |||
+ | This section is meant to be as brief as possible while still explaining the | ||
+ | necessary commands a bit so that you understand what you are doing. | ||
+ | |||
+ | == Installation / Configuration == | ||
Install git as [http://git-scm.com/book/en/Getting-Started-Installing-Git described here]. | Install git as [http://git-scm.com/book/en/Getting-Started-Installing-Git described here]. | ||
Line 24: | Line 33: | ||
$ git config --global user.email "<email address>" | $ git config --global user.email "<email address>" | ||
− | + | == Initial checkout ("clone") == | |
Create directory for git repositories: | Create directory for git repositories: | ||
$ cd $HOME | $ cd $HOME | ||
Line 48: | Line 57: | ||
the ant-build in ''freeplane_framework''. | the ant-build in ''freeplane_framework''. | ||
− | + | == Working with branches == | |
Freeplane follows the general git convention to have prefixes separated from the name | Freeplane follows the general git convention to have prefixes separated from the name | ||
by a '/', i.e. 'docear/trunk'. The main branch ("trunk") is termed ''master'' in git. | by a '/', i.e. 'docear/trunk'. The main branch ("trunk") is termed ''master'' in git. | ||
Line 55: | Line 64: | ||
Here are the basic steps for working with branches: | Here are the basic steps for working with branches: | ||
− | + | === Step 1: checkout parent branch === | |
Find and checkout original source branch (the branch you want to base | Find and checkout original source branch (the branch you want to base | ||
your work on, '''usually master''') to the local work space: | your work on, '''usually master''') to the local work space: | ||
Line 66: | Line 75: | ||
** ''Team->Switch To->New branch...'', select ''Source ref = refs/remotes/origin/<branchname>'' | ** ''Team->Switch To->New branch...'', select ''Source ref = refs/remotes/origin/<branchname>'' | ||
− | + | === Step 2: create your local branch === | |
Create + check outo your own ''local'' branch based on the original branch: | Create + check outo your own ''local'' branch based on the original branch: | ||
Since branches are really really cheap in git, it makes sense to create a branch | Since branches are really really cheap in git, it makes sense to create a branch | ||
Line 75: | Line 84: | ||
(should be ''refs/heads/master'' if the parent branch is master). | (should be ''refs/heads/master'' if the parent branch is master). | ||
− | + | === Step 3: Work locally with your branch === | |
Please read [http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository chapter 2.2 of the official git book] | Please read [http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository chapter 2.2 of the official git book] | ||
in order to get started with working with git locally. You should understand how to stage and commit changes. | in order to get started with working with git locally. You should understand how to stage and commit changes. | ||
Line 88: | Line 97: | ||
* create more commits, this is all done locally! | * create more commits, this is all done locally! | ||
− | + | === Step 4: Push your changes to the repository === | |
Setup git so that only the current "upstream" branch gets pulled/pushed | Setup git so that only the current "upstream" branch gets pulled/pushed | ||
(instead of pushing ''all'' branches that have an upstream tracking branch | (instead of pushing ''all'' branches that have an upstream tracking branch | ||
Line 105: | Line 114: | ||
branch to its (configured) remote branch on origin. | branch to its (configured) remote branch on origin. | ||
− | + | === Step 5: Development cycles === | |
Follow the cycle: | Follow the cycle: | ||
$ git checkout <devbranch> | $ git checkout <devbranch> | ||
Line 128: | Line 137: | ||
$ git push [--dry-run] | $ git push [--dry-run] | ||
− | + | === Step 6: Merge your development into master === | |
# When you are done with your branch, and you have completed a code review of | # When you are done with your branch, and you have completed a code review of | ||
your dev branch, merge it into master (!) (or let a more experienced user do this). | your dev branch, merge it into master (!) (or let a more experienced user do this). | ||
Line 136: | Line 145: | ||
$ git push origin master | $ git push origin master | ||
− | == Knowledge Base | + | == Overview of the steps = |
+ | [[File:Git-steps.png]] | ||
+ | |||
+ | # The remote repository is cloned from origin (sourceforge). You now have a complete local copy of the repository | ||
+ | including all branches and the complete history. | ||
+ | # A new ''local'' branch ''user/newdev'' is created and checked out. | ||
+ | # This branch is created on the remote side too (pushed, with ''-u'' to setup the tracking | ||
+ | correctly). | ||
+ | # After some development on that branch, you want to integrate this with changes in | ||
+ | ''master''. This is done by pulling from the remote master branch on origin. | ||
+ | # After having checked the merge (pull = fetch + merge), you push the integrated ''user/newdev1'' branch to | ||
+ | its remote counterpart. | ||
+ | # You are done with development on ''user/newdev1''. In order to merge your changes into ''master'', | ||
+ | you switch to the master branch (''git checkout master'') and update it (''git pull''). | ||
+ | # The local ''user/newdev'' branch is merged into the local ''master'' branch. | ||
+ | # The result of the merge is pushed to the ''remote'' ''master'' branch. | ||
+ | |||
+ | = Knowledge Base = | ||
This section contains useful information for working with git, including stuff | This section contains useful information for working with git, including stuff | ||
like checking that tracking branches are set up correctly, details about working | like checking that tracking branches are set up correctly, details about working | ||
with branches, undoing commits/reverting files, and a bit more. | with branches, undoing commits/reverting files, and a bit more. | ||
− | + | == Installation == | |
[http://git-scm.com/book/en/Getting-Started-Installing-Git This chapter of the git book] | [http://git-scm.com/book/en/Getting-Started-Installing-Git This chapter of the git book] | ||
has some info about installing git from source or binary form on Linux/Mac OS | has some info about installing git from source or binary form on Linux/Mac OS | ||
Line 151: | Line 177: | ||
$ git config --global user.email "fnatter@gmx.net" | $ git config --global user.email "fnatter@gmx.net" | ||
− | + | == Checkout == | |
Checking out is termed <tt>cloning</tt> in git speak: | Checking out is termed <tt>cloning</tt> in git speak: | ||
Line 182: | Line 208: | ||
This page also describes how to import a repository into eclipse. | This page also describes how to import a repository into eclipse. | ||
− | + | == Basic workflow with one branch == | |
Please read [http://git-scm.com/book/en/Git-Basics the chapter on git basics] | Please read [http://git-scm.com/book/en/Git-Basics the chapter on git basics] | ||
in order to get started with git. You should understand how to stage and commit changes. | in order to get started with git. You should understand how to stage and commit changes. | ||
Line 207: | Line 233: | ||
after you pulled!) | after you pulled!) | ||
− | + | == Using Tags == | |
Show all tags: | Show all tags: | ||
$ git tag | $ git tag | ||
Line 233: | Line 259: | ||
TODO: sign tags? | TODO: sign tags? | ||
− | + | == Working with branches == | |
Branches are very central to git. Do not hesitate to create feature, team | Branches are very central to git. Do not hesitate to create feature, team | ||
Line 248: | Line 274: | ||
(you can equivalently set this to ''upstream'' in recent git versions). | (you can equivalently set this to ''upstream'' in recent git versions). | ||
− | + | === Switch to another branch === | |
$ git checkout <branchname> | $ git checkout <branchname> | ||
(Team->Switch To->... in Eclipse) | (Team->Switch To->... in Eclipse) | ||
− | + | === How to create a new branch === | |
New (feature) branches should be named <code><user>/<feature></code> | New (feature) branches should be named <code><user>/<feature></code> | ||
Line 290: | Line 316: | ||
$ git push -u origin <newbranch> | $ git push -u origin <newbranch> | ||
− | + | === Rename a ''local'' branch === | |
$ git branch -m <old-branch-name> <new-branch-name> | $ git branch -m <old-branch-name> <new-branch-name> | ||
TODO: how to rename the remote tracking branch => difficult!! | TODO: how to rename the remote tracking branch => difficult!! | ||
− | + | === How to merge local branches === | |
$ git checkout <destination_branch> | $ git checkout <destination_branch> | ||
$ git merge <source_branch> | $ git merge <source_branch> | ||
− | |||
− | |||
If you want to abort a merge (revert the working directory to the state | If you want to abort a merge (revert the working directory to the state | ||
Line 316: | Line 340: | ||
has been added/modified/deleted via the command line. | has been added/modified/deleted via the command line. | ||
− | + | ==== Fast-Forward Merges (merge-nodes) ==== | |
Often the creation of a merge commit (merge node) is not necessary, | Often the creation of a merge commit (merge node) is not necessary, | ||
and <code>git merge</code> uses a ''fast-forward'' merge, omitting | and <code>git merge</code> uses a ''fast-forward'' merge, omitting | ||
Line 355: | Line 379: | ||
make the commit graph less readable. | make the commit graph less readable. | ||
− | + | ==== Merge master->dev-branch ==== | |
$ git checkout <devbranch> | $ git checkout <devbranch> | ||
$ git merge master | $ git merge master | ||
− | + | ==== Merge dev-branch->master ==== | |
$ git checkout master | $ git checkout master | ||
$ git merge <devbranch> | $ git merge <devbranch> | ||
− | + | === How to remove a branch === | |
# remove branch locally | # remove branch locally | ||
Line 401: | Line 425: | ||
in that other checkout. TODO: but it still exists there as a local branch! | in that other checkout. TODO: but it still exists there as a local branch! | ||
− | + | === Check whether your branches are set up correctly === | |
Make sure your branches are set up correctly for push/pull: | Make sure your branches are set up correctly for push/pull: | ||
Line 419: | Line 443: | ||
master pushes to master (up to date) | master pushes to master (up to date) | ||
− | + | === Importing a remote branch === | |
Using command line git: | Using command line git: | ||
$ git pull # fetches the remote (tracking) branch | $ git pull # fetches the remote (tracking) branch | ||
Line 428: | Line 452: | ||
* ''Team->Switch To->New branch...'', select ''Source ref = refs/remotes/origin/<name>'' | * ''Team->Switch To->New branch...'', select ''Source ref = refs/remotes/origin/<name>'' | ||
− | + | == General workflow == | |
Create a dev branch (see section on creating branches above). | Create a dev branch (see section on creating branches above). | ||
− | + | === Work on your feature branch === | |
# switch to feature branch | # switch to feature branch | ||
$ git checkout <feature> | $ git checkout <feature> | ||
Line 456: | Line 480: | ||
$ git push [--dry-run] | $ git push [--dry-run] | ||
− | + | === Merging === | |
Merge master -> <devbranch> (see section on merging above) every | Merge master -> <devbranch> (see section on merging above) every | ||
once-in-a-while. | once-in-a-while. | ||
Line 463: | Line 487: | ||
master (see section on merging above). | master (see section on merging above). | ||
− | + | == Miscellaneous == | |
− | + | === Revert (reset) files === | |
git checkout <filename> | git checkout <filename> | ||
Line 471: | Line 495: | ||
git reset --hard | git reset --hard | ||
− | + | === Undoing/editing commits === | |
TODO: how to remove/edit a commit locally using rebase. | TODO: how to remove/edit a commit locally using rebase. | ||
− | + | === Undoing a commit that is already pushed === | |
Use <code>git revert <commit-hash></code>, like this: | Use <code>git revert <commit-hash></code>, like this: | ||
$ git revert b1e9b4c9755b091f95aaa3035aca04dcb02ec1fd | $ git revert b1e9b4c9755b091f95aaa3035aca04dcb02ec1fd |
Revision as of 11:39, 1 September 2012
This is a guide to Working with freeplane's git repository. The first part covers the commands you need the most, while the second part ("Knowledge Base") adds some commands for special situations such as when undoing commits or reverting files (currently there is some redundancy between the two which we will remove soon).
You can (and probably want to) use eclipse for most operations. I try to explain this in each section, but it is a good idea to read the EGit documentation. Some operations, such as creating remote branches should be applied with the command line only (in order to make sure that tracking branches are setup correctly).
NOTE: Some instructions cover only the temporary freeplane repository on github, it will need to be adapted to the sourceforge hosting service.
There is a fun Google Tech Talk by Linus Torvalds on git.
Contents
- 1 Quickstart Guide
- 2 = Overview of the steps
- 3 Knowledge Base
- 3.1 Installation
- 3.2 Checkout
- 3.3 Basic workflow with one branch
- 3.4 Using Tags
- 3.5 Working with branches
- 3.6 General workflow
- 3.7 Miscellaneous
Quickstart Guide
This section is meant to be as brief as possible while still explaining the necessary commands a bit so that you understand what you are doing.
Installation / Configuration
Install git as described here. You probably want to use the latest Eclipse (use Eclipse for RCP and RAP Developers) with EGit (Eclipse-git) plugin (integrated by default).
The author details (which will be recorded for each changeset) can be set globally:
$ git config --global user.name "<Firstname> <Lastname>" $ git config --global user.email "<email address>"
Initial checkout ("clone")
Create directory for git repositories:
$ cd $HOME $ mkdir git $ cd git
Create a local copy of the (whole!) git repository by cloning (git-speak for "checking out"): $ git clone https://github.com/fnatter/freeplane-git.git freeplane
This will create a local copy of all history and all branches. Therefore it is possible to develop and make commits offline and only connect for the purpose of getting changes from other devs ("pull") or sending your commits to a remote branch ("push").
In Eclipse/EGit you have to select the clone option in the Git Repositories View on a repository with the above URL, then enter credentials, choose all branches (!), then accept the defaults or choose a different location (for the local copy of the repo) check import all existing projects after clone finishes and be patient (should take <10 minutes). Afterwards, delete the freeplane_mac project unless you're on Mac, and close the freeplane_ant project. Finally, run the ant-build in freeplane_framework.
Working with branches
Freeplane follows the general git convention to have prefixes separated from the name by a '/', i.e. 'docear/trunk'. The main branch ("trunk") is termed master in git. However, for the docear main branch, we use 'docear/trunk'.
Here are the basic steps for working with branches:
Step 1: checkout parent branch
Find and checkout original source branch (the branch you want to base your work on, usually master) to the local work space:
- Using command line git:
# fetches the remote (tracking) branch (may not be necessary) $ git pull $ git checkout <branchname>
- Using Eclipse/EGit:
- Team->Pull fetches the remote (tracking) branch (may not be necessary)
- Team->Switch To->New branch..., select Source ref = refs/remotes/origin/<branchname>
Step 2: create your local branch
Create + check outo your own local branch based on the original branch: Since branches are really really cheap in git, it makes sense to create a branch for most development tasks (especially if you want a review before you integrate into master!). The following command creates a new local branch <devbranch>:
$ git checkout -b <devbranch>
In EGit you can do Team->Switch To->New Branch..., then make sure you use the right Source ref (should be refs/heads/master if the parent branch is master).
Step 3: Work locally with your branch
Please read chapter 2.2 of the official git book in order to get started with working with git locally. You should understand how to stage and commit changes. Here are some basic steps:
- modify files...
- add the modifications to the index:
$ git add foo.java # (Team->Add to index in eclipse)
- create a commit from the changes in the index:
$ git commit [-m message] # (Team->Commit in eclipse)
(if you omit -m then you will be prompted for a commit message)
- create more commits, this is all done locally!
Step 4: Push your changes to the repository
Setup git so that only the current "upstream" branch gets pulled/pushed (instead of pushing all branches that have an upstream tracking branch which can be confusing!):
$ git config push.default tracking
Note: this option is ignored by current EGit. On EGit you get the same behavior by selecting Team->Push To Upstream.
Publish ("push") your branch (including the commits you made) so that others can see (and review!) it. Currently it's best to do this on the command line, because -u sets up the tracking branches properly:
$ git push -u origin <devbranch>
(When pushing from eclipse you have to configure the remote tracking branch manually!). In any case (tracking branch configured automatically or manually), Team->Push to Upstream will push the current branch to its (configured) remote branch on origin.
Step 5: Development cycles
Follow the cycle:
$ git checkout <devbranch>
- pull other people's changes on your devbranch:
$ git pull # you might have to resolve conflicts: (might want to use 'git mergetool' # or Eclipse/EGit) # git will place <<<<<<<<<< and >>>>>>>>>> comments to show the locations of the conflict(s) for each conflict x: 1. resolve conflict in x, remove markers 2. git add x # mark x as resolved
- you can use:
$ git reset --hard
to undo the merge but this will throw away all committed changes(!)
- commit the conflict resolution(s):
$ git commit [-m message]
- create local commits
# in short: git add file; git add file2; git commit
- merge from master
$ git pull origin master
- push the result of the merge with master (always run git push with --dry-run first!)
$ git push [--dry-run]
Step 6: Merge your development into master
- When you are done with your branch, and you have completed a code review of
your dev branch, merge it into master (!) (or let a more experienced user do this).
$ git checkout master $ git pull $ git merge <devbranch> $ git push origin master
= Overview of the steps
- The remote repository is cloned from origin (sourceforge). You now have a complete local copy of the repository
including all branches and the complete history.
- A new local branch user/newdev is created and checked out.
- This branch is created on the remote side too (pushed, with -u to setup the tracking
correctly).
- After some development on that branch, you want to integrate this with changes in
master. This is done by pulling from the remote master branch on origin.
- After having checked the merge (pull = fetch + merge), you push the integrated user/newdev1 branch to
its remote counterpart.
- You are done with development on user/newdev1. In order to merge your changes into master,
you switch to the master branch (git checkout master) and update it (git pull).
- The local user/newdev branch is merged into the local master branch.
- The result of the merge is pushed to the remote master branch.
Knowledge Base
This section contains useful information for working with git, including stuff like checking that tracking branches are set up correctly, details about working with branches, undoing commits/reverting files, and a bit more.
Installation
This chapter of the git book has some info about installing git from source or binary form on Linux/Mac OS X/Windows.
The author details (which will be recorded for each changeset) can be set globally:
$ git config --global user.name "Felix Natter" $ git config --global user.email "fnatter@gmx.net"
Checkout
Checking out is termed cloning in git speak:
$ cd ~ $ mkdir git $ cd git $ git clone https://github.com/fnatter/freeplane-git.git freeplane
If you want/have read-only access, use this as the last command:
$ git clone git://github.com/fnatter/freeplane-git.git freeplane
However, this will only configure the master branch (named trunk in other VCS's such as svn) locally:
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/docear_trunk remotes/origin/master
In order to check out a branch (which is simply a reference to a commit) that currently only exists remotely (the remotes/origin/* references are called remote tracking branches), simply switch to that branch:
$ git checkout docear_trunk
This can be done more easily using Eclipse. This page also describes how to import a repository into eclipse.
Basic workflow with one branch
Please read the chapter on git basics in order to get started with git. You should understand how to stage and commit changes.
In the following there is a simplified list of steps for working with git. Please read the following sections!
- clone repo (see above)
- switch to the desired branch (see next section for more about branches!)
$ git checkout <branch> # Eclipse: Team->Switch to
- make sure you have the latest version of the branch (pull = fetch + merge)
$ git pull
(resolve and commit any merge conflicts)
- modify files...
- add the modifications to the index:
$ git add foo.java # (Team->Add to index in eclipse)
- create a commit from the changes in the index:
$ git commit [-m message]
(if you omit -m then you will be prompted for a commit message)
- create more commits, this is all done locally!
- push changesets (commits) to sourceforge:
$ git push
(you might have to pull before the push if someone has pushed to the branch after you pulled!)
Using Tags
Show all tags:
$ git tag
Search for a tag:
$ git tag -l "release-1.1*"
Show information about a tag:
$ git show release-1.1.2
Define a tag locally:
$ git tag -a <tagname> # (an editor opens for you to add a description)
Tags are not automatically transferred when doing a git push
,
you have to push individually:
$ git push origin <tagname>
or push all tags:
$ git push --tags origin
You might need a
$ git pull --tags
to get all tags. See git-fetch(1) for situations when you will need this (rarely).
TODO: sign tags?
Working with branches
Branches are very central to git. Do not hesitate to create feature, team and (of course) maintenance branches.
You probably want set push.default to tracking or upstream which makes sure that only the current branch is pushed to its upstream branch (and NOT all configured branches): Note: this option is ignored by current EGit. On EGit you get the same behavior by selecting Team->Push To Upstream.
$ git config push.default tracking
(you can equivalently set this to upstream in recent git versions).
Switch to another branch
$ git checkout <branchname>
(Team->Switch To->... in Eclipse)
How to create a new branch
New (feature) branches should be named <user>/<feature>
or (if several devs work on a feature): <feature>
.
# commit everything that should go into the new branch $ git status $ git add <file> [...] $ git commit -m "my changes"
# create new branch locally $ git checkout -b <newbranch> # check commit log to see that above commit is in there $ git log # new branch must be visible and selected: $ git branch -a
# (make sure that the name of the new branch is correct! it is diffcult/impossible # to rename published branches!) # create branch remotely, use -u to automatically configure upstream location $ git push -u origin <newbranch> # this should output something like this: Branch <newbranch> set up to track remote branch <newbranch> from origin. # (Note: -u is important if you want to use git pull/push without specifying a remote/refspec)
# remote branch of <newbranch> must be visible: $ git branch -a
So the short story is:
$ git checkout -b <newbranch> $ git push -u origin <newbranch>
Rename a local branch
$ git branch -m <old-branch-name> <new-branch-name>
TODO: how to rename the remote tracking branch => difficult!!
How to merge local branches
$ git checkout <destination_branch> $ git merge <source_branch>
If you want to abort a merge (revert the working directory to the state before the merge command), do this:
$ git reset --hard
(WARNING: this will remove all uncommitted changes!!)
In eclipse, this can be achieved by:
- Team->Switch To and choose <destination_branch>
- Team->Merge... and choose <source_branch>
In Eclipse, you may have to refresh all projects (F5) if a branch has been added/modified/deleted via the command line.
Fast-Forward Merges (merge-nodes)
Often the creation of a merge commit (merge node) is not necessary,
and git merge
uses a fast-forward merge, omitting
the merge node:
$ git merge foo Updating 9e9a63a..732b657 Fast-forward testfoo.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 testfoo.txt
results in:
* 732b657 commit in branch foo * [...]
Using the option --no-ff
you can force git to create a merge
node even if isn't absolutely necessary (non-fast-forward merge):
$ git merge --no-ff foo2 Merge made by the 'recursive' strategy. testfoo2.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 testfoo2.txt
which will result in:
* 3890bc8 (HEAD, master) Merge branch 'foo2' |\ | * 6bc24c5 (foo2) commit on foo2 |/ * * [...]
This is useful when merging feature branches because it clearly shows the integration of a new feature. On the other hand, many merge nodes make the commit graph less readable.
Merge master->dev-branch
$ git checkout <devbranch> $ git merge master
Merge dev-branch->master
$ git checkout master $ git merge <devbranch>
How to remove a branch
# remove branch locally # (use -D instead if you want to delete a branch that is not fully merged into HEAD!) $ git branch -d <branchname>
You can do this with EGit using Team->Advanced->Delete Branch....
If you accidentally deleted a (local) branch, you can recover it by
starting a new branch from the location that git branch -d <branchname>
echoed (or by searching for the last commit on that branch in git reflog
):
$ git branch -D foo Deleted branch foo (was 732b657). $ git branch foo 732b657
(remember that branches are simply pointers to commits)
Warning: this only works if the delete was quite recent as orphaned commits will be deleted after some time!
Delete a remote branch(!):
$ git push origin --delete <branchname>
Now the local and the remote tracking branch should be gone:
$ git branch -a docear_trunk * master remotes/origin/docear_trunk remotes/origin/master
NOTE: The stale branch will still exist in other checkouts, until you do a:
$ git remote prune origin
in that other checkout. TODO: but it still exists there as a local branch!
Check whether your branches are set up correctly
Make sure your branches are set up correctly for push/pull:
$ git remote show origin * remote origin Fetch URL: https://github.com/fnatter/freeplane-git.git Push URL: https://github.com/fnatter/freeplane-git.git HEAD branch: master Remote branches: docear_trunk tracked master tracked Local branches configured for 'git pull': docear_trunk merges with remote docear_trunk master merges with remote master Local refs configured for 'git push': docear_trunk pushes to docear_trunk (up to date) master pushes to master (up to date)
Importing a remote branch
Using command line git:
$ git pull # fetches the remote (tracking) branch $ git checkout <branchname>
Using Eclipse/EGit:
- Team->Pull fetches the remote (tracking) branch
- Team->Switch To->New branch..., select Source ref = refs/remotes/origin/<name>
General workflow
Create a dev branch (see section on creating branches above).
Work on your feature branch
# switch to feature branch $ git checkout <feature>
# fetch and merge changes (in case another dev works on this) $ git pull
# you might have to resolve conflicts: (might want to use 'git mergetool' # or Eclipse/EGit) for each conflict x: 1. resolve conflict in x, remove markers 2. git add x # mark as resolved # commit the conflict resolution(s) $ git commit
$ git add ... $ git commit [...]
# This will push commits to the remote branch that is tracked # make sure that push.default=tracking|upstream (see above), # otherwise other branches will be pushed as well! $ git push [--dry-run]
Merging
Merge master -> <devbranch> (see section on merging above) every once-in-a-while.
After a final code review (on your dev branch), merge <devbranch> -> master (see section on merging above).
Miscellaneous
Revert (reset) files
git checkout <filename>
Revert all files in working copy (!):
git reset --hard
Undoing/editing commits
TODO: how to remove/edit a commit locally using rebase.
Undoing a commit that is already pushed
Use git revert <commit-hash>
, like this:
$ git revert b1e9b4c9755b091f95aaa3035aca04dcb02ec1fd
This will generate an inverse commit, it will not remove the original commit:
* 171881e (HEAD, master) Revert "a simple commit" * b1e9b4c a simple commit