diff --git a/git_beginner/conf.py b/git_beginner/conf.py index 00b11f968bb569283ad21bb1777f37bcf45b70b1..5794dfb14607a2dd9cc291ad8acd287d97e26372 100644 --- a/git_beginner/conf.py +++ b/git_beginner/conf.py @@ -41,8 +41,8 @@ source_encoding = 'utf-8' master_doc = 'index' # General information about the project. -project = u'git4beginners' -copyright = u'2013-2014, Holger Dinkel' +project = u'git basics' +copyright = u'2013-2015, Holger Dinkel' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -82,9 +82,9 @@ exclude_patterns = ['_build'] #show_authors = False # The name of the Pygments (syntax highlighting) style to use. -#pygments_style = 'sphinx' +pygments_style = 'sphinx' #pygments_style = 'colorful' -pygments_style = 'lsi.lsiClassStyle' +#pygments_style = 'lsi.lsiClassStyle' # The default language to highlight source code in. The default is 'python'. The value should be a valid Pygments lexer name, see Showing code examples for more details. highlight_language = 'console' @@ -110,7 +110,7 @@ html_theme = 'nature' # The name for this set of Sphinx documents. If None, it defaults to # "<project> v<release> documentation". -html_title = "git4beginners" +html_title = "git basics" # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None @@ -194,7 +194,7 @@ latex_elements = { # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'gitintro.tex', u'GIT For Beginners', + ('index', 'gitintro.tex', u'GIT Basics', u'Holger Dinkel', 'manual'), ] @@ -224,7 +224,7 @@ latex_show_urls = False # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'gitintro', u'GIT For Beginners', + ('index', 'gitintro', u'GIT Basics', [u'Holger Dinkel'], 1) ] @@ -238,8 +238,8 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'gitintro', u'GIT For Beginners', - u'Holger Dinkel', 'gitintro', 'GIT For Beginners', + ('index', 'gitintro', u'GIT Basics', + u'Holger Dinkel', 'gitintro', 'GIT Basics', 'Miscellaneous'), ] diff --git a/git_beginner/introduction.rst b/git_beginner/introduction.rst index 54cac25891b879bbcb39a5337099ed4d566e0e5e..8b6f766027561c76c6e777869f9b9384ded8199d 100644 --- a/git_beginner/introduction.rst +++ b/git_beginner/introduction.rst @@ -1,6 +1,4 @@ - - The Benefits of Version Control ******************************* @@ -71,10 +69,10 @@ repository A repository is the history of all your project's commits. -git Settings +git settings ============ -setting your identity +Setting your identity --------------------- Before we start, we should set the user name and e-mail address. @@ -87,7 +85,7 @@ and it's also incredibly useful when looking at the history and commit log: :: Other useful settings include your favorite editor as well as difftool: :: - git config --global core.editor vim + git config --global core.editor nano git config --global merge.tool meld @@ -113,56 +111,88 @@ You can use the `git config --list` command to list all your settings: :: A Typical git Workflow ********************** -.. figure:: _static/repo_single.png - :scale: 50 % +.. figure:: _static/git-local.png + :scale: 85 % - Files are `added` from the `working directory`, which always holds the - current version of your files, to the `staging area`. `Staged` files will be stored into the repository in the next `commit`. - The repository itself contains all previous versions of all files ever committed. + Files are `added` from the `workspace`, which always holds the current + version of your files, to the `staging area`. `Staged` files will be stored + into the local repository in the next `commit`. The repository itself + contains all previous versions of all files ever committed. + (image courtesy of 'research bazaar' https://raw.githubusercontent.com/resbaz/lessons/master/git/git-local.png) -.. figure:: _static/repo_distributed.png +.. figure:: _static/git-remote.png - Distributed Workflow using a centralized repository. Here, three local copies of one central repository allow you, - Jon and Matt to work on the same files and sync files between each other using the central server. + Distributed workflow using a centralized repository. Here, you use `push` + and `pull` to synchronize your local repository with a remote repository. + (image courtesy of 'research bazaar' https://raw.githubusercontent.com/resbaz/lessons/master/git/git-remote.png) Creating a git Repository ========================= -Turning an existing directory into a git repository is as simple as changing into that directory and :index:`invoking <init>` `git init`. -Here we first create an empty directory called `new_repository` and create a repository in there: :: +Turning an existing directory into a local git repository is as simple as changing +into that directory and invoking `git init`. However, here we +want to create one repository which we can use from multiple other folders to +sync to/from, therefore in this case, we need to initialize it as a `bare` +repository. + +.. note:: Normally you do not need the `--bare`, but it's essential for this + exercise... + +So, here we first create an empty directory in our homedirectory called `repos` +(this is meant to hold and serve all our repositories), and create a repository +in there called `mythesis`: :: - mkdir new_repository - cd new_repository - git init + mkdir ~/repos + cd ~/repos + mkdir mythesis + cd mythesis + git init --bare -.. note:: As a result, there should be a directory called `.git` in this directory... +.. note:: As a result, you should have the directory `~/repos/mythesis` and there + should be a directory called `.git` in this directory... Cloning a git Repository ======================== -Instead of creating a new directory, we can :index:`clone` a repository. That `origin` repository can reside in a different folder on our computer, on a -remote machine, or on a dedicated git server: -Local directory: :: +Next, we can `clone` this repository into the `~/Documents/mythesis` folder.:: - git clone ../other_directory + cd ~/Documents -Remote directory: :: + git clone ~/repos/mythesis - git clone ssh://user@server/project.git + Initialized empty Git repository in /localhome/training/Desktop/mythesis/.git/ + warning: You appear to have cloned an empty repository. -Remote git server: :: + cd mythesis - git clone git@server:user/project - git clone git@git.embl.de:dinkel/linuxcommandline +By `cloning`, we not only get the exact copy as the remote side, but we +automatically tell git where we had got the data from, which allows us later to +sync our changes back... +.. note:: You can clone from either a different folder on our computer, a remote machine (via ssh), or a dedicated git server:: + + Local directory: :: + + git clone ~/repos/mythesis + + Remote directory: :: + + git clone ssh://remote_user@remote_server/mythesis.git + + Remote git server: :: + + git clone git@server:user/project + + Checking the Status =================== -If you don't know in which state the current repository is in, it's always a good idea to check: :: +If you don't know in which state the current repository is in, it's always a +good idea to check: :: git status @@ -172,13 +202,18 @@ If you don't know in which state the current repository is in, it's always a goo # nothing to commit (create/copy files and use "git add" to track) +Here, everything is clear, not much going on (no news is good news). + +.. note:: In fact, it's good practice, to use `git status` as often as + possible! + Adding files ============= First, we'll create a new file: :: - echo "First entry in first file!" > file1.txt + echo "My first line towards a great paper!" > paper.txt git status @@ -189,12 +224,14 @@ First, we'll create a new file: :: # Untracked files: # (use "git add <file>..." to include in what will be committed) # - # file1.txt + # paper.txt nothing added to commit but untracked files present (use "git add" to track) -Now we'll add this file to the so called `staging area`: :: +Here, git tells us that there is a file, however it's `untracked`, meaning git +does not know/care about it. We need to tell git first that it should keep track +of it. So we'll add this file to the so called `staging area`: :: - git add file1.txt + git add paper.txt git status @@ -205,10 +242,11 @@ Now we'll add this file to the so called `staging area`: :: # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # - # new file: file1.txt + # new file: paper.txt # -This tells us that the `file1.txt` has been added and can be committed to the repository. +This tells us that the `paper.txt` has been added and can be committed to the +repository. Committing changes @@ -246,10 +284,21 @@ Name & Email-address of the committer, Date & Time of the commit as well as the message describing the changes you made +Exercise +-------- + +Repeat the add/commit procedures you just learned. Add more files, use an editor +to add more content to the `paper.txt` file, commit your changes providing a +meaningful commit message. + + Pushing changes =============== -If we had cloned this repository from a remote location, we probably want our changes to be propagated to that repository as well. +In order to exchange/synchronize your changes with a remote repository, you use `git push`/`git pull`: + +.. figure:: _static/git-remote.png + To push all committed changes, simply type: :: git push @@ -257,7 +306,31 @@ To push all committed changes, simply type: :: .. note:: git "knows" from which location you had cloned this repository and will try to push to exactly that location (using the protocol you used to clone: ssh, git, etc)... -.. warning:: If you get a warning message, you probably 'just' need to pull others changes before you are allowed to push your own... +.. warning:: If you get a warning message, read it carefully! The most common + error you get when trying to push are changes on the remote end which you first + need to merge into your local repository before you are allowed to push your own... + + +Creating a second clone +----------------------- + +In order to simulate contrubting to our repository from another computer, we will again +checkout the repository, but this time in a different folder named `mythesis-work`:: + + cd ~/Documents + + git clone ~/repos/mythesis mythesis-work + + cd ~/Documents/mythesis-work + +This repository should contain all the changes you've pushed so far. +Now we want to improve our `paper.txt` document. Use an editor to add more lines +to this file:: + + echo "This line was contributed from work..." >> paper.txt + +Again, `add`, `commit`, and `push` your changes. + Pulling changes =============== @@ -270,8 +343,76 @@ In a centralized workflow you actually **must** pull changes that other people h .. warning:: Ideally, changes from others don't conflict with yours, but whenever someone else has edited the same lines in the same files as you, you will receive an error message about a **merge conflict**. You will need to resolve this conflict manually, then add each resolved file (`git add`) and commit. -.. echo "And another entry in a second file." > file2.txt -.. git add file2.txt + +So we go back to the directory `~/Documents/mythesis` and (after checking the +status) try to get the changes we've done in the `mythesis-work` directory:: + + cd ~/Documents/mythesis + + git status + + git pull + +.. TODO: add output of git pull here + + + +Solving conflicts +================= + +When working collaboratively on a project, it is unavoidable that the same +file gets changed by different contributors. This causes a conflict and needs to +be dealt with. + +.. hint:: It helps minimizing conflicts if you push/pull often! + +To solve a merge conflict, you can either: + +- manually merge the two files (see below) +- discard the remote file: `git checkout --ours conflicted_file.txt` +- discard the local file: `git checkout --theirs conflicted_file.txt` + + +Manually merging a conflict +--------------------------- + +To create a conflict, we change the same line in the file `paper.txt` in both +directories (`mythesis` and `mythesis-work`) without pulling each others changes +in between. +Once we pull, git will tell us that a conflict has occurred.:: + + Automatic merge failed; fix conflicts and then commit the result. + +When git encounters conflicts in files, it adds special markers `<<<<<<<`, +`=======`, `>>>>>>>` into this file wrapping both conflicting changes. It is up +to you to decide which of these changes to keep.:: + + ... + content of the file + ... + <<<<<<< HEAD:paper.txt + your home changes + ======= + your changes introduced at work + >>>>>>> 000000000000000000000000000000000000:paper.txt + ... + rest of the file + ... + +Make sure to delete the lines that where introduced by git (otherwise you won't +be able to commit changes. If you only wanted to keep your changes than you +would delete everything except your changes:: + + ... + content of the file + ... + your home changes + ... + rest of the file + ... + +Now, you need to add this file again to the staging area and commit to finish +this conflicting merge. Use `git status` to see the status of the repository. Undo local changes @@ -284,24 +425,33 @@ If you want to undo all changes in a local file, you simply checkout the latest .. warning:: You will loose all changes you made since the last commit! +If you want to checkout a specific version (revision) of a file, you need to +specify the hash or name of the revision:: + git checkout revision_name <filename> -Using centralized workflow -========================== - -When you want to use one central repository, to which everybody can push/pull, -you should initialize this repo like so: `git init --bare`. -Basically what this does is create a repository which all the files from the `.git` directory in the working directory. -This also means that you should never add/edit/delete files in this directory. Rather clone this directory in another folder/computer, -edit files there and commit/push (see below)... -github -****** -http://www.github.com +.. Using centralized workflow +.. ========================== +.. +.. When you want to use one central repository, to which everybody can push/pull, +.. you should initialize this repo as *bare* like so: `git init --bare`. Basically +.. what this does is create a repository which all the files from the `.git` +.. directory in the working directory. This also means that you should never +.. add/edit/delete files in this directory. Rather clone this directory in another +.. folder/computer, edit files there and commit/push (see below)... +.. -To clone a repository:: - git clone username@github.com:username/repository +.. github +.. ****** +.. +.. Github +.. http://www.github.com +.. +.. To clone a repository:: +.. +.. git clone username@github.com:username/repository