Making a GIT Repository

You've installed git, and you want to create a repository. You can do this in an empty directory, but probably you already have a project you think should be under version control. cd into the project directory, and type git init. This isn't dangerous: it makes the folder a git repo ... with no committed files, and without changing any of the contents of the folder. Mechanically, all it does is add a .git/ folder to the project folder (there's a bunch of stuff in there, but it's best to ignore the man behind the curtain).

Before you go any further, let's do one basic bit of configuration. By default on Linux systems, the git editor is nano - and I'm not having that. So let's change that: git config --global core-editor "vim" will change git's default editor to something better.

Now start adding files to the repo. You don't have to add all of them: use git add <filename> <foldername> <...> to "stage" stuff. To "stage a file" (or everything in a folder) means that you consider it ready to be added to the repository: you haven't actually put it into the repo yet. Then git commit -a will get you into the git editor, which will show you what you're committing (and what you're not committing) and ask you to add a commit message. If you modify the file and save it, a commit will be made - but you can cancel the commit by exiting the editor without saving anything.

git status is always your friend. Use it. Frequently. This will tell you what's changed and what's staged. And commit early and often: making lots of commits is NOT a problem, and may save you later.

Git is an incredibly complex source code management system - it was designed for thousands of developers to work on the Linux kernel, including multiple simultaneous branches. Honestly, I'm only scratching the surface of what it can do. If you're new to it, work with this first: work on your project and commit frequently. Get to branching and servers when you need it, no rush.

But ... I need a server, so that's the next step in this little tutorial. This is actually pretty easy, although what's happening may not be terribly clear. I have the server set up, so I'm not covering that here - just how to get a new project onto an existing server. Go to the parent directory of your git-controlled project, and type git clone --bare projectX projectX.git . This will create a new folder called projectX.git/, a "bare" copy of the repo meant for a server (not for you to work in: things are stored differently). Next, run scp -r projectX.git And you're done. After that, on any other machine, git clone new_folder ("new_folder" is optional, by default it will create "projectX" - notice without the ".git"). I would recommend removing the local copy: rm -rf projectX.git ("-f" is needed as many of the items in .git/ are read-only). The repo you just cloned from doesn't know you've added an upstream, so you have to tell it: cd into the repo and run git remote add origin . And in projectX/ you can now type git push origin master.

I highly recommend Pro Git v2: it's detailed, well structured, and readable and is about as good as technical documentation comes ... plus it's free and online. If you need a server, read Git on the Server.


2017-05-06: I've found myself using this entry a lot to create repos. So I'm going to add this in a stripped form, but with a bit more detail ... (and excessively colourful HTML).

~$ cd interestingproject
interestingproject$ ls
README.txt      morecode/
interestingproject$ git init
Initialized empty Git repository in /home/giles/interestingproject/.git/
interestingproject$ git status
On branch master

Initial commit

Untracked files:
  (use "git add ..." to include in what will be committed)


nothing added to commit but untracked files present (use "git add" to track)
interestingproject$ git add README.txt morecode/**
interestingproject$ git status
On branch master

Initial commit

Changes to be committed:
    (use "git rm --cached ..." to unstage)

        new file:   KeyboardMessagePullup/KeyboardMessagePullup.ino
        new file:   KeyboardMessagePullupWithBlink/KeyboardMessagePullupWithBlink.ino
        new file:   README.txt
        new file:   StretchBlink/StretchBlink.ino
        new file:   UglyBlink/UglyBlink.ino
        new file:   libraries/readme.txt

interestingproject$ git commit
[master (root-commit) 977a07f] Initial commit of Interesting Project(TM).
 6 files changed, 229 insertions(+)
 create mode 100644 README.txt
 create mode 100644
 create mode 100644 morecode/README.txt
 create mode 100644 morecode/
interestingproject(master)$ cd ..
~$ git clone --bare interestingproject interestingproject.git
Cloning into bare repository 'interestingproject.git'...
~$ scp -r interestingproject.git
config                                                                    100%  137    16.1KB/s   00:00
exclude                                                                   100%  240    10.8KB/s   00:00
pre-push.sample                                                           100% 1348   105.3KB/s   00:00
pre-rebase.sample                                                         100% 4951   268.3KB/s   00:00
update.sample                                                             100% 3610   330.2KB/s   00:00
pre-applypatch.sample                                                     100%  424    43.8KB/s   00:00
commit-msg.sample                                                         100%  896    69.3KB/s   00:00
post-update.sample                                                        100%  189    17.5KB/s   00:00
prepare-commit-msg.sample                                                 100% 1239    70.6KB/s   00:00
applypatch-msg.sample                                                     100%  478    46.9KB/s   00:00
pre-commit.sample                                                         100% 1642   153.0KB/s   00:00
d5024a125e81002454258282b0a80ce18e3bf8                                    100%   58     6.5KB/s   00:00
ebcc21c9e9c1bad4c769968569b85f383f3064                                    100%  359    33.1KB/s   00:00
2011668008a8d81c181c90048ad7a0d2edad92                                    100%   79     7.9KB/s   00:00
dd11653f8f363e663119a01795de31a8f7ff90                                    100%   70     7.0KB/s   00:00
64bcbdb209f092b6a5c21f5165fa7d079ae7d1                                    100% 1068   106.5KB/s   00:00
201cebb4de048a019f0f6a267875fe33d28622                                    100%   61     5.3KB/s   00:00
f2cdb97709d840239de8ff6737d1367b85d40f                                    100%  464    54.3KB/s   00:00
7a07fb1a41c00cbdbd6155ed4ae7a2c0a9052d                                    100%  144    16.0KB/s   00:00
7bcf6e8c58be9f4208b976af1666746984f33e                                    100%   55     4.7KB/s   00:00
ce674fe0cc3be65c6d8872a3b109caaad73f07                                    100%   92    10.2KB/s   00:00
b83e825e795820ff65e1798619bb9e0792b843                                    100%  951    61.8KB/s   00:00
cdf5bc81ae6c3866e28d988fefe002148a0dd2                                    100%  229    27.2KB/s   00:00
HEAD                                                                      100%   23     2.6KB/s   00:00
packed-refs                                                               100%   98    11.1KB/s   00:00
description                                                               100%   73     8.5KB/s   00:00
~$ rm -rf interestingproject.git/
~$ cd interestingproject/
interestingproject(master)$ git remote add origin   # TYPO!!!
interestingproject(master)$ git pull
ssh: Could not resolve hostname Name or service not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
interestingproject(master)$ git remote -v
origin (fetch)
origin (push)
interestingproject(master)$ git remote add origin
fatal: remote origin already exists.
interestingproject(master)$ git remote set-url origin
interestingproject(master)$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

interestingproject(master)$ git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date