Git

Git is a mechanism of sharing/keeping/tracking/updating/merging code/files/projects. It has a different feel than more traditional "Master/client" ways of thinking - and can cause some initial problems in understanding just how to approach Version Control/Project file management.

It's beauty is in the manner you can quickly fork a project for you own needs and then feedback the new project to it's parent. Which rather embodies the whole Open-Source philisophy.

GIT

Git task Notes Git commands Tell Git who you are Configure the author name and email address to be used with your commits.

Note that Git strips some characters (for example trailing periods) from user.name.

git config --global user.name "Sam Smith" git config --global user.email sam@example.com

Confusing Terms

Two branches:

'''master''' is a local branch '''origin/master''' is a remote branch (which is a local copy of the branch named "master" on the remote named "origin")

One remote:

origin is a remote

Create a new local repository

git init

Check out a repository

Create a working copy of a local repository:
git clone /path/to/repository

For a remote server, use

git clone username@host:/path/to/repository

Add files

Add one or more files to staging (index):
git add <filename> git add * Commit

Commit changes to head (but not yet to the remote repository)

git commit -m "Commit message"
Commit any files you've added with git add, and also commit any files you've changed since then:
git commit -a Push

Send changes to the master branch of your remote repository

git push origin master

Status List the files you've changed and those you still need to add or commit

git status

Connect to a remote repository

If you haven't connected your local repository to a remote server, add the server to be able to push to it:

git remote add origin <server>

List all currently configured remote repositories

git remote -v

Branches

Create a new branch and switch to it

git checkout -b <branchname>

Switch from one branch to another

git checkout <branchname>

List all the branches in your repo

and also tell you what branch you're currently in:

git branch

Delete the feature branch

git branch -d <branchname>

Push the branch to your remote repository, so others can use it

git push origin <branchname>

Push all branches to your remote repository

git push --all origin

Delete a branch on your remote repository

git push origin :<branchname>

Update from the remote repository

Fetch and merge changes on the remote server to your working directory:
git pull

To merge a different branch into your active branch

git merge <branchname>

View all the merge conflicts

View the conflicts against the base file:

Preview changes, before merging:

git diff git diff --base <filename> git diff <sourcebranch> <targetbranch>

After you have manually resolved any conflicts, you mark the changed file

git add <filename> Tags

You can use tagging to mark a significant changeset, such as a release

git tag 1.0.0 <commitID>
CommitId is the leading characters of the changeset ID, up to 10, but must be unique. Get the ID using:
git log

Push all tags to remote repository

git push --tags origin

Undo local changes

If you mess up, you can replace the changes in your working tree with the last content in head:

Changes already added to the index, as well as new files, will be kept.

git checkout -- <filename>

Instead, to drop all your local changes and commits, fetch the latest history from the server and point your local master branch at it, do this:

git fetch origin git reset --hard origin/master

Create Remote Repo

TO create a remote Repo....

#ssh git@example.com #mkdir my_project.git #cd my_project.git #git init --bare #git update-server-info # If planning to serve via HTTP #exit

Server has non standard ssh port

git remote add origin ssh://user@host:1234/srv/git/example

Send from Local to Remote Repo

You go to your development machine - NOT the remove server.

cd my_project
git init
git add *
git commit -m "My initial commit message"
git remote add origin git@example.com:my_project.git
git push -u origin master

Check This worked

cd ~
mkdir junk
cd junk
git clone git@example.com:my_project.git

And you should have a copy of the Git Project

Git Bash Tweeks

Put these in ~.bashrc

function git-branch-name {
git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3
}
function git-branch-prompt {
local branch=`git-branch-name`
if [ $branch ]; then printf " [%s]" $branch; fi
}
PS1="\u@\h \[\033[0;36m\]\W\[\033[0m\]\[\033[0;32m\]\$(git-branch-prompt)\[\033[0m\] \$ "

2 Clients 1 Central repository

Assuming you have 2 developers working on a project. They Both '''git clone''' - modify a different file - and then 1 (Tim say) of them (it matters not which one) does 'git add main.py' and then 'git commit -a'.

At this point NOTHING will be updated as the changes are on the LOCAL repository.

To Update the "Central" Repository - you do this.

Developed Tim
git status
Checks to see what is happening. It should say
On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits)
So Developer Tim does
git push

This has updated the "Central" copy.

Developed Hamad - now want to see whats changed.
git status

NO Changes. Why ? Because this is looking at his local Git.

Hamad knows Tim Updated something. So he does
git fetch
Something like
remote: Counting objects: 7, done. remote: Compressing objects: 100% (4/4), done. remote: Total 4 (delta 3), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. From /media/tim/Git 483dcd7..5f4d9e8 master -> origin/master
Then Hamad does a
git status On branch master Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded. (use "git pull" to update your local branch)
To fix this he does
git pull

And gets the new code And sees