<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Git_-_David</id>
	<title>Git - David - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Git_-_David"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Git_-_David&amp;action=history"/>
	<updated>2026-04-05T07:25:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=Git_-_David&amp;diff=61240&amp;oldid=prev</id>
		<title>Ksolis at 07:44, 2 October 2017</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Git_-_David&amp;diff=61240&amp;oldid=prev"/>
		<updated>2017-10-02T07:44:38Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:course_code_gitusers]]&lt;br /&gt;
&amp;lt;slideshow style=&amp;quot;nobleprog&amp;quot; headingmark=&amp;quot;⌘&amp;quot; incmark=&amp;quot;…&amp;quot; scaled=&amp;quot;true&amp;quot; font=&amp;quot;Trebuchet MS&amp;quot; &amp;gt;&lt;br /&gt;
;title: Git - Introduction&lt;br /&gt;
;author: David Parkin (NobleProg Ltd)&lt;br /&gt;
&amp;lt;/slideshow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What is Git ⌘==&lt;br /&gt;
British Slang&lt;br /&gt;
*Variant of get&lt;br /&gt;
*A contemptible person, often a fool&lt;br /&gt;
*A bastard&lt;br /&gt;
[[File:Git-fool.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Short definition ⌘==&lt;br /&gt;
&lt;br /&gt;
 [[File:Git-definitions.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Why Git? ⌘==&lt;br /&gt;
Linus Torvalds has quipped about the name &amp;quot;Git&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
&amp;quot;I&amp;#039;m an egotistical bastard, and I name all my projects after myself. First Linux, now git.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Git-why1.png|264px]]  [[File:Git-why2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git History ⌘==&lt;br /&gt;
[[File:Git-history.png]]&lt;br /&gt;
*2002 - Linux Kernel develops in BitKeeper&lt;br /&gt;
*2005 Apr 6 - BitMover drops free license and Linus starts GIT project&lt;br /&gt;
*2005 Jun 16 - GIT is officially used to track Linux&lt;br /&gt;
*2007 Feb 14 - GIT 1.5.0 is released (more humane)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Getting Help ⌘==&lt;br /&gt;
&lt;br /&gt;
  git commit -h &lt;br /&gt;
  git help commit&lt;br /&gt;
  man git-commit&lt;br /&gt;
&lt;br /&gt;
* Git Community Book http://book.git-scm.com/&lt;br /&gt;
* Manual (must read) http://www.kernel.org/pub/software/scm/git/docs/user-manual.html&lt;br /&gt;
* Git – SVN Crash Course http://git.or.cz/course/svn.html&lt;br /&gt;
* Git - CVS Crash Course http://git.or.cz/course/cvs.html&lt;br /&gt;
&lt;br /&gt;
== Git Locally ⌘==&lt;br /&gt;
* Git as an extension to the file system&lt;br /&gt;
* No network required&lt;br /&gt;
* Repository deleted if &amp;#039;&amp;#039;.git&amp;#039;&amp;#039; folder is deleted&lt;br /&gt;
&lt;br /&gt;
== Initializing a repository for existing files ==&lt;br /&gt;
 git init&lt;br /&gt;
 git add .&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
== Setting Up Username ⌘==&lt;br /&gt;
 git config --global user.name &amp;quot;Bernard&amp;quot;&lt;br /&gt;
 git config --global user.email b@noblepog.com&lt;br /&gt;
&lt;br /&gt;
*we can set up config globally - per user&lt;br /&gt;
*or for everyone --system&lt;br /&gt;
&lt;br /&gt;
git config --global alias.view &amp;quot;log --oneline --decorate --graph --all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Browsing Repository ⌘==&lt;br /&gt;
 git show rev:file &lt;br /&gt;
 git show rev:directory  &lt;br /&gt;
 git show rev&lt;br /&gt;
&lt;br /&gt;
== Basic Commands ⌘==&lt;br /&gt;
 git add file   &lt;br /&gt;
 git rm file &lt;br /&gt;
 git mv file&lt;br /&gt;
&lt;br /&gt;
== Moving Files ⌘==&lt;br /&gt;
 git mv afile.txt movedfile.txt&lt;br /&gt;
 &lt;br /&gt;
 # equivalent to&lt;br /&gt;
 &lt;br /&gt;
 mv afile.txt movedfile.txt&lt;br /&gt;
 git rm afile.txt&lt;br /&gt;
 git add movedfile.txt&lt;br /&gt;
&lt;br /&gt;
== File Status⌘==&lt;br /&gt;
https://docs.google.com/drawings/pub?id=1Fp1iYscfMixvIWduFJMejQzmdDmPsvXt3QS3kQ7WSnE&amp;amp;w=800&amp;amp;h=600&amp;amp;.png&lt;br /&gt;
&lt;br /&gt;
== Committing new files and changes ⌘==&lt;br /&gt;
 # Commiting new files&lt;br /&gt;
 git add newfile.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # Changes&lt;br /&gt;
 echo new line &amp;gt;&amp;gt; afile.txt&lt;br /&gt;
 git add afile.txt&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
 or  &lt;br /&gt;
&lt;br /&gt;
 echo new line &amp;gt;&amp;gt; afile.txt&lt;br /&gt;
 git commit -a &lt;br /&gt;
 &lt;br /&gt;
[[File:Git-commit-a1.png|250px]] [[File:Git-commit-a2.png|250px]]&lt;br /&gt;
&lt;br /&gt;
== Committing Folders ⌘==&lt;br /&gt;
 mkdir afolder&lt;br /&gt;
 touch afolder/file1.txt&lt;br /&gt;
 touch afolder/file2.txt&lt;br /&gt;
 git add afolder&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
== Empty Folders ⌘==&lt;br /&gt;
 mkdir emptyfolder&lt;br /&gt;
 git add emptyfolder&lt;br /&gt;
 git commit &lt;br /&gt;
 # Nothing to commit&lt;br /&gt;
&lt;br /&gt;
 #Workaround&lt;br /&gt;
 touch emptyfolder/.gitignore&lt;br /&gt;
 git add emptyfolder/.gitignore&lt;br /&gt;
 git commit&lt;br /&gt;
 #Worked&lt;br /&gt;
&lt;br /&gt;
== Exercises ⌘==&lt;br /&gt;
&lt;br /&gt;
1. Create a file structure&lt;br /&gt;
 sudo mkdir /rcs&lt;br /&gt;
 sudo chmod 777 /rcs &lt;br /&gt;
 mkdir /rcs/repo&lt;br /&gt;
 cd /rcs/repo&lt;br /&gt;
 echo first line &amp;gt; afile.txt&lt;br /&gt;
2. Initialize repository&lt;br /&gt;
&lt;br /&gt;
3. Stage the file&lt;br /&gt;
&lt;br /&gt;
4. Check whether the file has been staged&lt;br /&gt;
&lt;br /&gt;
5. Commit the changes&lt;br /&gt;
&lt;br /&gt;
6. Check whether the files have been committed&lt;br /&gt;
&lt;br /&gt;
7. What is the SHA1 of the commit?&lt;br /&gt;
&lt;br /&gt;
== Tracking Changes ⌘==&lt;br /&gt;
 git status&lt;br /&gt;
 git diff&lt;br /&gt;
 git diff rev path&lt;br /&gt;
 git show&lt;br /&gt;
&lt;br /&gt;
== Diff ⌘==&lt;br /&gt;
&lt;br /&gt;
https://docs.google.com/drawings/pub?id=1_elrohhhWPx8aIqYYZS4D-8Y54VDp_-reloS37NW91A&amp;amp;w=800&amp;amp;h=300&amp;amp;.png&lt;br /&gt;
&lt;br /&gt;
== Diff Examples ⌘==&lt;br /&gt;
&lt;br /&gt;
 echo Commited Changes &amp;gt;&amp;gt; afile.txt &lt;br /&gt;
 git commit -a -m &amp;quot;asdf&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 echo Staged Changes &amp;gt;&amp;gt; afile.txt &lt;br /&gt;
 git add afile.txt&lt;br /&gt;
 &lt;br /&gt;
 echo Not-tracked Changes &amp;gt;&amp;gt; afile.txt &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;git diff&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;command-results&amp;quot;&amp;gt;&lt;br /&gt;
 [master c81907a] Commited changes&lt;br /&gt;
  1 file changed, 1 insertion(+)&lt;br /&gt;
 diff --git a/afile.txt b/afile.txt&lt;br /&gt;
 index fc321d0..978da6e 100644&lt;br /&gt;
 --- a/afile.txt&lt;br /&gt;
 +++ b/afile.txt&lt;br /&gt;
 @@ -1,3 +1,4 @@&lt;br /&gt;
  first line&lt;br /&gt;
  Commited Changes&lt;br /&gt;
  Staged Changes&lt;br /&gt;
 +Not-tracked Changes&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;git diff --cached&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;command-results&amp;quot;&amp;gt;&lt;br /&gt;
 diff --git a/afile.txt b/afile.txt&lt;br /&gt;
 index 37a8835..fc321d0 100644&lt;br /&gt;
 --- a/afile.txt&lt;br /&gt;
 +++ b/afile.txt&lt;br /&gt;
 @@ -1,2 +1,3 @@&lt;br /&gt;
  first line&lt;br /&gt;
  Commited Changes&lt;br /&gt;
 +Staged Changes&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;git diff HEAD&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;command-results&amp;quot;&amp;gt;&lt;br /&gt;
 diff --git a/afile.txt b/afile.txt&lt;br /&gt;
 index 37a8835..978da6e 100644&lt;br /&gt;
 --- a/afile.txt&lt;br /&gt;
 +++ b/afile.txt&lt;br /&gt;
 @@ -1,2 +1,4 @@&lt;br /&gt;
  first line&lt;br /&gt;
  Commited Changes&lt;br /&gt;
 +Staged Changes&lt;br /&gt;
 +Not-tracked Changes&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;git diff HEAD^&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;command-results&amp;quot;&amp;gt;&lt;br /&gt;
 diff --git a/afile.txt b/afile.txt&lt;br /&gt;
 index 08fe272..978da6e 100644&lt;br /&gt;
 --- a/afile.txt&lt;br /&gt;
 +++ b/afile.txt&lt;br /&gt;
 @@ -1 +1,4 @@&lt;br /&gt;
  first line&lt;br /&gt;
 +Commited Changes&lt;br /&gt;
 +Staged Changes&lt;br /&gt;
 +Not-tracked Changes&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Who fixed (spoiled) it? - git annotate ⌘==&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;git annotate afile.txt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 03be4dec        (   Bernard     2012-09-02 14:53:27 +0200       1)first line&lt;br /&gt;
 c81907a9        (   Bernard     2012-09-02 16:50:24 +0200       2)Commited Changes&lt;br /&gt;
 00000000        (Not Committed Yet      2012-09-02 17:08:44 +0200       3)Staged Changes&lt;br /&gt;
 00000000        (Not Committed Yet      2012-09-02 17:08:44 +0200       4)Not-tracked Changes&lt;br /&gt;
&lt;br /&gt;
== Undoing Changes ⌘==&lt;br /&gt;
 git checkout --        # Remove not staged changes and local copy&lt;br /&gt;
 git reset HEAD         # Remove changes from cache but leaves local copy intact&lt;br /&gt;
&lt;br /&gt;
== Amending latest commit⌘ ==&lt;br /&gt;
You can amend your latest commit (re-edit the metadata as well as update the tree)&lt;br /&gt;
 git commit –amend&lt;br /&gt;
To toss your latest commit away completely&lt;br /&gt;
&amp;lt;!-- git reset HEAD^&lt;br /&gt;
this will not change the working tree.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercise (Index) ⌘==&lt;br /&gt;
# Add the new line to afile.txt&lt;br /&gt;
# Check the difference between index and the file&lt;br /&gt;
# Add the file&lt;br /&gt;
# Check the difference between repository and the staging&lt;br /&gt;
# Revert all not committed changes to the file (the file should be the same as in the repo)&lt;br /&gt;
# Add new line to a file&lt;br /&gt;
# Commit the changes&lt;br /&gt;
&lt;br /&gt;
== Reverting with New Commit ⌘==&lt;br /&gt;
Revert the most recent commit:&lt;br /&gt;
 git revert HEAD&lt;br /&gt;
This will create a new commit which undoes the change in HEAD. &lt;br /&gt;
&lt;br /&gt;
Other example:&lt;br /&gt;
 git revert HEAD^&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exercise (git revert) ⌘==&lt;br /&gt;
# Add the line “bad changes” to afile.txt&lt;br /&gt;
# Commit your changes&lt;br /&gt;
# Use git revert to remove&lt;br /&gt;
&lt;br /&gt;
== Cleaning Untracked Files ⌘==&lt;br /&gt;
 touch untrackedfile.txt&lt;br /&gt;
 git status&lt;br /&gt;
 echo untrackedfile.txt &amp;gt; .gitignore&lt;br /&gt;
 git status&lt;br /&gt;
&lt;br /&gt;
 git clean -n&lt;br /&gt;
 git clean -f&lt;br /&gt;
&lt;br /&gt;
== .gitignore syntax ⌘==&lt;br /&gt;
Lines starting with &amp;#039;#&amp;#039; are considered comments.&lt;br /&gt;
 # Ignore any file named foo.txt.&lt;br /&gt;
 foo.txt&lt;br /&gt;
 # Ignore (generated) html files,&lt;br /&gt;
 *.html&lt;br /&gt;
 # except foo.html which is maintained by hand.&lt;br /&gt;
 !foo.html&lt;br /&gt;
 # Ignore objects and archives.&lt;br /&gt;
 *.[oa]&lt;br /&gt;
&lt;br /&gt;
http://git-scm.com/docs/gitignore&lt;br /&gt;
&lt;br /&gt;
== gitignore vs excludes ⌘==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.gitignore&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* version-controlled&lt;br /&gt;
* distributed to other repositories via clone (i.e., files that all developers will want to ignore)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;$GIT_DIR/info/exclude&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* specific to a particular repository but which do not need to be shared with other related repositories (e.g., auxiliary files that live inside the repository but are specific to one user’s workflow)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;~/.gitconfig (core.excludesfile)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* ignore in all situations (e.g., backup or temporary files generated by the user’s editor of choice)&lt;br /&gt;
&lt;br /&gt;
== Exercise ⌘==&lt;br /&gt;
* echo something &amp;gt; Thumb.db&lt;br /&gt;
* Add Thumb.db file to .gitignore&lt;br /&gt;
* Add .gitignore to the repository and commit&lt;br /&gt;
* Check whether Thumb.db is ignored in afolder&lt;br /&gt;
* Clone the repo to /rcs/repoclone&lt;br /&gt;
* Check whether the Thumb.db is ignored there&lt;br /&gt;
&lt;br /&gt;
== Browsing Repo ⌘==&lt;br /&gt;
 gitk&lt;br /&gt;
 git gui&lt;br /&gt;
 git log&lt;br /&gt;
 git show &lt;br /&gt;
 git show HEAD:afolder&lt;br /&gt;
 git show HEAD:afile&lt;br /&gt;
 git show commit (can be tag or branch)&lt;br /&gt;
  git show HEAD^&lt;br /&gt;
  git show master&lt;br /&gt;
  git show c01a0d43&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT under the bonnet ⌘==&lt;br /&gt;
* Object Database&lt;br /&gt;
* SHA1&lt;br /&gt;
* DAG (Directed Acyclical Graph)&lt;br /&gt;
* Index&lt;br /&gt;
&lt;br /&gt;
== Object Types ⌘==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;blob&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*store file data&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;tree&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*ties one or more &amp;quot;blob&amp;quot; objects into a directory structure&lt;br /&gt;
*a tree object can refer to other tree objects, thus creating a directory hierarchy&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;commit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*ties such directory hierarchies together into a directed acyclic graph (DAG) of revisions&lt;br /&gt;
*each commit contains the object name of exactly one tree (snapshot of the tree)&lt;br /&gt;
*a commit refers to &amp;quot;parent&amp;quot; commit objects that describe the history of how we arrived at that directory hierarchy&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;tag&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*symbolically identifies and can be used to sign other objects&lt;br /&gt;
*It contains&lt;br /&gt;
**object name (SHA1, e.g. 232A...)&lt;br /&gt;
**type of another object&lt;br /&gt;
**a symbolic name (e.g. version 1.0.1)&lt;br /&gt;
**optionally, a signature (PGP or GPG)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Directed Acyclic Graph (DAG) ⌘==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Git-dag.png|250px]]&lt;br /&gt;
|| &lt;br /&gt;
*Stored as a &amp;#039;&amp;#039;&amp;#039;linked list&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Uses SHA1 as references&lt;br /&gt;
*One root (object without parents)&lt;br /&gt;
*Multiple parents allowed&lt;br /&gt;
**merge (2 parents)&lt;br /&gt;
**octopus merge (3 or more)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAG and gitk&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Git-gitk.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAG and Git objects&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Git-dag-git-o.png|350px]]&lt;br /&gt;
&lt;br /&gt;
== Staging Changes ⌘==&lt;br /&gt;
[[File:Git-stag-change.PNG|500px]]&lt;br /&gt;
&lt;br /&gt;
== Getting Existing Repo ⌘==&lt;br /&gt;
 git clone  http://git.drupal.org/project/pathauto.git&lt;br /&gt;
 cd pathauto&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;git remote -v&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;command-results&amp;quot;&amp;gt;&lt;br /&gt;
 origin	http://git.drupal.org/project/pathauto.git (fetch)&lt;br /&gt;
 origin	http://git.drupal.org/project/pathauto.git (push)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;git branch -a&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;command-results&amp;quot;&amp;gt;&lt;br /&gt;
 * 7.x-1.x&lt;br /&gt;
  remotes/origin/4.6.x-1.x&lt;br /&gt;
  remotes/origin/4.7.x-1.x&lt;br /&gt;
  remotes/origin/5.x-1.x&lt;br /&gt;
  remotes/origin/5.x-2.x&lt;br /&gt;
  remotes/origin/6.x-1.x&lt;br /&gt;
  remotes/origin/6.x-2.x&lt;br /&gt;
  remotes/origin/7.x-1.x&lt;br /&gt;
  remotes/origin/HEAD -&amp;gt; origin/7.x-1.x&lt;br /&gt;
  remotes/origin/MAIN&lt;br /&gt;
  remotes/origin/master&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Getting new Changes ⌘==&lt;br /&gt;
 git pull gituser@git.nobleprog.net:/gitrepo/pathauto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Push Changes to central repo ⌘==&lt;br /&gt;
 echo Change in readme &amp;gt;&amp;gt; README.txt &lt;br /&gt;
 git commit -a&lt;br /&gt;
 git push&lt;br /&gt;
 git push gituser@git.nobleprog.net:/gitrepo/pathauto&lt;br /&gt;
&lt;br /&gt;
== Adding Remote ⌘==&lt;br /&gt;
 git remote add central  gituser@git.nobleprog.net:/gitrepo/pathauto&lt;br /&gt;
 git pull central 7.x-1.x&lt;br /&gt;
 git push central 7.x-1.x&lt;br /&gt;
&lt;br /&gt;
== Exercises ⌘==&lt;br /&gt;
#create a bare repository in rcs/main&lt;br /&gt;
# Clone bare repo in myrepo&lt;br /&gt;
# Modify a file&lt;br /&gt;
# Push your changes to main&lt;br /&gt;
&lt;br /&gt;
== Tagging ⌘==&lt;br /&gt;
* Tag is not a copy of the repo&lt;br /&gt;
* Tag doesn&amp;#039;t create a revision&lt;br /&gt;
* Tag is just an another name for a revision (apart of SHA1)&lt;br /&gt;
 git tag tagname # creates  tag from HEAD of the current branch&lt;br /&gt;
 git tag # shows all tags&lt;br /&gt;
 git tag tagname -m “message”&lt;br /&gt;
 git tag tagname 6544ce&lt;br /&gt;
 git tag -l v1&lt;br /&gt;
&lt;br /&gt;
== Lightweight vs Object Tags ⌘==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Lightweight !! Object Tags&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
 git tag v1.1.0 1b2e1d63n&lt;br /&gt;
 git push –tags (optional presentation with cloning)  &lt;br /&gt;
*“a branch that never moves”&lt;br /&gt;
*cannot include a comment &lt;br /&gt;
*cannot be signed cryptographically&lt;br /&gt;
|| &lt;br /&gt;
 git tag -a stable-1 1b2e1d63ff&lt;br /&gt;
 &lt;br /&gt;
*If one of -a, -s, or -u &amp;lt;key-id&amp;gt; options is passed  &lt;br /&gt;
*Needs to contain a message (can be empty)&lt;br /&gt;
*can tag any object (not only commit object)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exercise (Tagging) ⌘==&lt;br /&gt;
* Tag the HEAD as v1.0&lt;br /&gt;
*Add another line to a file&lt;br /&gt;
 echo second line &amp;gt;&amp;gt; afile.txt&lt;br /&gt;
*Commit changes&lt;br /&gt;
*Tag the commit as v1.1&lt;br /&gt;
*Add third line and commit&lt;br /&gt;
 echo third line &amp;gt;&amp;gt; afile&lt;br /&gt;
*Show difference (use git diff) between HEAD and the tag v1.0&lt;br /&gt;
*List all the tags&lt;br /&gt;
&lt;br /&gt;
== Branching and Merging ⌘==&lt;br /&gt;
 git branch&lt;br /&gt;
list all branches&lt;br /&gt;
 git branch &amp;lt;branch&amp;gt;&lt;br /&gt;
create a new branch named &amp;lt;branch&amp;gt;, referencing the same point in history as the current branch&lt;br /&gt;
 git branch &amp;lt;branch&amp;gt; &amp;lt;start-point&amp;gt;&lt;br /&gt;
create a new branch named &amp;lt;branch&amp;gt;, referencing &amp;lt;start-point&amp;gt; (branch, tag or commit)&lt;br /&gt;
 git branch -d &amp;lt;branch&amp;gt;&lt;br /&gt;
delete the branch &amp;lt;branch&amp;gt;; if the branch you are deleting points to a commit which is not reachable from the current branch, this command will fail with a warning.&lt;br /&gt;
 git branch -D &amp;lt;branch&amp;gt;&lt;br /&gt;
* forces to do even branch points to a commit not reachable from the current branch&lt;br /&gt;
* failed experiment branches&lt;br /&gt;
* use only for changes in your repository&lt;br /&gt;
 git checkout &amp;lt;branch&amp;gt;&lt;br /&gt;
switch to the &amp;lt;branch&amp;gt;&lt;br /&gt;
 git checkout -b &amp;lt;new&amp;gt; &amp;lt;start-point&amp;gt;&lt;br /&gt;
create a new branch &amp;lt;new&amp;gt; referencing &amp;lt;start-point&amp;gt;, and check it out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dealing with Branches and Tags ⌘==&lt;br /&gt;
&amp;lt;source lang = &amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 git clone git://git.kernel.org/pub/scm/git/git.git&lt;br /&gt;
 git branch&lt;br /&gt;
 git branch -r&lt;br /&gt;
 git tag&lt;br /&gt;
 git checkout maint&lt;br /&gt;
 git branch&lt;br /&gt;
 git checkout v1.7.4&lt;br /&gt;
 git branch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creating Branches ⌘==&lt;br /&gt;
 cp repo/ repo.bak -R; cp central/ central.bak -R&lt;br /&gt;
Create new branch and switch working copy&lt;br /&gt;
 git branch experiment&lt;br /&gt;
 git checkout experiment&lt;br /&gt;
 git checkout -b experiment&lt;br /&gt;
&lt;br /&gt;
== Merging ⌘==&lt;br /&gt;
* switch to experiment&lt;br /&gt;
* modify the afile.txt&lt;br /&gt;
 git commit -a&lt;br /&gt;
 git checkout master&lt;br /&gt;
 modify afile.txt (different part)&lt;br /&gt;
 git commit -a&lt;br /&gt;
 gitk --all&lt;br /&gt;
 git branch&lt;br /&gt;
 git merge experiment&lt;br /&gt;
 gitk --all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exercise (REmoving) ⌘==&lt;br /&gt;
# Create branch v2.x&lt;br /&gt;
# Modify a couple of files in the branch&lt;br /&gt;
# Merge the branch with master&lt;br /&gt;
# Remove the branch v2.x&lt;br /&gt;
&lt;br /&gt;
== Exercises (remote branching) ⌘==&lt;br /&gt;
* Create a branch “quickfix” from a master branch&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git checkout -b quickfix&lt;br /&gt;
* create quickfix.txt in quickfix branch and commit&lt;br /&gt;
 touch quickfix.txt&lt;br /&gt;
 git add quickfix.txt&lt;br /&gt;
 git commit -m &amp;quot;quickfix&amp;quot;&lt;br /&gt;
* switch to master&lt;br /&gt;
 git checkout master&lt;br /&gt;
* Commit 2 changes into the master branch&lt;br /&gt;
 echo 1 &amp;gt;&amp;gt; afile.txt; git commit -a -m &amp;quot;change1&amp;quot;&lt;br /&gt;
 echo 2  &amp;gt;&amp;gt; afile.txt; git commit -a -m &amp;quot;change2&amp;quot;&lt;br /&gt;
* switch back to quickfix&lt;br /&gt;
 git checkout quickfix&lt;br /&gt;
* analyse situation in &lt;br /&gt;
 git log --oneline --decorate --graph --all&lt;br /&gt;
* Push the quickfix to the production&lt;br /&gt;
 push origin quickfix&lt;br /&gt;
* On production&lt;br /&gt;
 git fetch origin quickfix&lt;br /&gt;
 git branch -a&lt;br /&gt;
 git checkout origin/quickfix -b quickfix&lt;br /&gt;
* On Devel&lt;br /&gt;
 merge quickfix into master&lt;br /&gt;
&lt;br /&gt;
revert merge&lt;br /&gt;
&lt;br /&gt;
rebase quickfix into master&lt;br /&gt;
* delete quickfix branch&lt;br /&gt;
&lt;br /&gt;
== Reverting Merges ⌘==&lt;br /&gt;
Adding commit with reverted changes&lt;br /&gt;
 git revert&lt;br /&gt;
Before Committing&lt;br /&gt;
 git reset --hard HEAD&lt;br /&gt;
After Committing&lt;br /&gt;
 git reset --hard ORIG_HEAD&lt;br /&gt;
use only if you committed it only to your private repo&lt;br /&gt;
&lt;br /&gt;
== Rebasing ⌘==&lt;br /&gt;
[[File:Git-rebasing1.png|260px]] [[File:Git-rebasing2.png|320px]]  [[File:Git-rebasing3.png|320px]]&lt;br /&gt;
&lt;br /&gt;
 git checkout -b mywork origin&lt;br /&gt;
 echo mywork changes &amp;gt;&amp;gt; afile.txt&lt;br /&gt;
 git commit -a&lt;br /&gt;
 git checkout master&lt;br /&gt;
 echo some new func &amp;gt;&amp;gt; afile_master.txt&lt;br /&gt;
 git add afile_master.txt&lt;br /&gt;
 git commit&lt;br /&gt;
 gitk --all&lt;br /&gt;
 git rebase mywork&lt;br /&gt;
 gitk --all&lt;br /&gt;
 git prune&lt;br /&gt;
 gitk -all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exercise ⌘==&lt;br /&gt;
# Create a branch “quickfix”&lt;br /&gt;
# add a couple of changes afile.txt in quickfix branch&lt;br /&gt;
# switch to master&lt;br /&gt;
# Commit 2 changes into the master branch&lt;br /&gt;
# switch back to quickfix&lt;br /&gt;
# analyse situation in gitk --all&lt;br /&gt;
# rebase quickfix branch to master&lt;br /&gt;
# analyse situation in gitk -all&lt;br /&gt;
# prune dangling objects&lt;br /&gt;
# gitk --all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cherry Picking ⌘==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;500px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Git-cherry-picking.jpg|250px]]&lt;br /&gt;
|| &lt;br /&gt;
 git checkout -b exp&lt;br /&gt;
 echo Not Cherry1 &amp;gt;&amp;gt; afile.txt &lt;br /&gt;
 git commit -a -m NotCherry1&lt;br /&gt;
 echo Cherry &amp;gt;&amp;gt; afile.txt &lt;br /&gt;
 git commit -a -m Cherry&lt;br /&gt;
 echo Not Cherry2 &amp;gt;&amp;gt; afile.txt &lt;br /&gt;
 git commit -a -m NotCherry2&lt;br /&gt;
 git checkout master&lt;br /&gt;
 echo masterchange &amp;gt;&amp;gt; afile_master.txt &lt;br /&gt;
 git add afile_master.txt&lt;br /&gt;
 git commit -a -m &amp;quot;Master Change&amp;quot;&lt;br /&gt;
 git log exp&lt;br /&gt;
 git cherry-pick 3c8f&lt;br /&gt;
|| &lt;br /&gt;
[[File:Git-cherry.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stashing ⌘==&lt;br /&gt;
* git-stash to save the current state of your work&lt;br /&gt;
* git stash save &amp;quot;work in progress for foo feature&amp;quot;&lt;br /&gt;
* echo “bug fix” &amp;gt;&amp;gt; afile.txt&lt;br /&gt;
* git commit -a -m &amp;quot;fixed the bug&amp;quot;&lt;br /&gt;
* git stash pop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Workflow Structure ⌘==&lt;br /&gt;
[[File:Git-wf-structure.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Combining Commits ⌘==&lt;br /&gt;
# Version upto 1.6 &lt;br /&gt;
 git format-patch  v1.0..HEAD&lt;br /&gt;
 git reset v1.0&lt;br /&gt;
 git apply *.patch&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
# Version 1.7 onwords&lt;br /&gt;
  git reset v1.0&lt;br /&gt;
  git commit&lt;br /&gt;
&lt;br /&gt;
==Git - Bisect ⌘==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 # Initiallize repo&lt;br /&gt;
 cd /g&lt;br /&gt;
 mkdir /g/tmp&lt;br /&gt;
 cd tmp&lt;br /&gt;
 mkdir repo&lt;br /&gt;
 cd repo/&lt;br /&gt;
 git init  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;exit 0&amp;quot; &amp;gt; code.sh&lt;br /&gt;
  git add code.sh; &lt;br /&gt;
  git commit -a -m &amp;quot;c0&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  # Genereate 10 revision which do not spoil the script&lt;br /&gt;
  for i in $(seq 10) ; do   echo &amp;quot;# round 1 $i&amp;quot; &amp;gt;&amp;gt; code.sh ; git commit -a -m &amp;quot;c$i&amp;quot; ; done&lt;br /&gt;
  &lt;br /&gt;
  # Spoil the script&lt;br /&gt;
  echo &amp;quot;exit 1&amp;quot; &amp;gt; code.sh&lt;br /&gt;
  git commit -a -m &amp;quot;bug revision&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  # generate 20 revisions which do not spoil already spoiled script&lt;br /&gt;
  for i in $(seq 20) ; do   echo &amp;quot;# round 2 $i&amp;quot; &amp;gt;&amp;gt; code.sh ; git commit -a -m &amp;quot;c$i&amp;quot; ; done&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 git bisect start&lt;br /&gt;
 git bisect bad&lt;br /&gt;
 # mark first revision as good&lt;br /&gt;
 git bisect good  6d34b &lt;br /&gt;
&lt;br /&gt;
 git bisect run bash code.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 running bash code.sh&lt;br /&gt;
 Bisecting: 7 revisions left to test after this (roughly 3 steps)&lt;br /&gt;
 [65e896df0fb1a865e8678bc2145f1621b802acfd] c7&lt;br /&gt;
 running bash code.sh&lt;br /&gt;
 Bisecting: 3 revisions left to test after this (roughly 2 steps)&lt;br /&gt;
 [480515f739bf6dd9a2a6ab47d8626aea805d4880] bug revision&lt;br /&gt;
 running bash code.sh&lt;br /&gt;
 Bisecting: 1 revision left to test after this (roughly 1 step)&lt;br /&gt;
 [52de39416f0f93a1b95f744de05699baa85ab224] c9&lt;br /&gt;
 running bash code.sh&lt;br /&gt;
 Bisecting: 0 revisions left to test after this (roughly 0 steps)&lt;br /&gt;
 [22ef2aaf18c69aa420534303ceeec2078154357c] c10&lt;br /&gt;
 running bash code.sh&lt;br /&gt;
 480515f739bf6dd9a2a6ab47d8626aea805d4880 is the first bad commit&lt;br /&gt;
 commit 480515f739bf6dd9a2a6ab47d8626aea805d4880&lt;br /&gt;
 Author: Your Name &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
 Date:   Tue Dec 4 00:02:09 2012 +0000&lt;br /&gt;
 &lt;br /&gt;
     bug revision&lt;br /&gt;
 &lt;br /&gt;
 :100644 100644 68d815b9ee3a9b590f2be9db2adfe37d715f964f 379a4c986e3265e08e9da42c56ec747619c56a33 M	code.sh&lt;br /&gt;
 bisect run success&lt;/div&gt;</summary>
		<author><name>Ksolis</name></author>
	</entry>
</feed>