First create the project in the git repository. Then copy the url. (possibly from https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server and https://git-scm.com/docs/git-shell) This is a good method of limiting git to a non-interactive shell. Copy keys to the git user authorized_keys2 file in /l/git/.ssh on lycoming. On the client: git init testapp cd testapp/ git config --global user.name "Stephen R Edwards" git config --global user.email "steve.edwards@vt.edu" touch README.md git add README.md git add . git commit -m 'First commit' git remote add origin git@git.it.vt.edu:stedwar1/testapp.git git push -u origin master On git host server, initialize the repo: git init --bare stedwar1/testapp chown -R git:git stedwar1/ On the client: git remote add origin ssh://git@lycoming.aoe.vt.edu:32722/l/git/stedwar1/testapp git push -u origin master ====== markdown ====== Headlines ## Blockquote > Blockquote in a blockquote >> Lists + or - 4 spaces for code indent back tics for code inline test `code` inline tab Use delimited back tics to render a back quote test \'code\' HTML ====== clone with all branches ====== git clone --bare https://github.com/planetoftheweb/angular.git .git git config --bool core.bare false git reset --hard git branch git status git stash && git checkout 01_03 ====== git essentials (lynda.com) ====== ===== Configuration ===== * System git config --system /etc/gitconfig Program Files\Git\etc\gitconfig * User git config --global ~/.gitconfig $HOME\.gitconfig git config --global user.name "Steve Edwards" git config --global user.email "steve.edwards@vt.edu" git config --list git config user.name git config user.email cd ~ ls -la cat .gitconfig git config --global core.editor "mate -wl1" #(wait on line one) git config --global color.ui true cat .gitconfig git config --global core.excludesfile ~/.gitignore_global * Project git config my_project/.git/config ===== git-completion ===== $ curl -OL https://github.com/git/git/raw/master/contrib/completion/git-completion.bash $ mv ~/git-completion.bash ~/.git-completion $ cat >> .bash_profile if [ -f ~/.git-completion.bash ]; then source ~/.git-completion.bash fi ^d ===== git help ===== git help git help log man git-log http://www.kernel.org/pub/software/scm/git/docs ====== 3. Getting Started ====== ===== git initialize project ===== First create a new folder then cd into that folder cd ~/Documents mkdir first_git_project cd !$ git init creates the ./.git folder that tracks all the changes ls -la .git Only the //config// file should be edited, but even git commands can edit this file. git keeps all changes here, unlike svn that creates an svn file(?) in every directory. Delete the .git and the changes are no longer being tracked. ===== git tracking changes ===== create a file, first_file.txt, in the project directory touch first_file.txt git add . git commit -m "Initial commit" * make changes * add the changes * commit changes to the repository with a message ===== writing commit messages ===== * short single-line summary (less than 50 characters) * optionally followed by a blank line and a more complete descrtiption * keep each line to less than 72 charactes * write commit messages in the present tense, not past tense * "fix bug" or "fixes bug", not "fixed bug" * bullet points are usually asterisks or hyphens * can add "ticket tracking numbers" from bugs or support requests * can develop shorthand for your organization * "[css,js]" * "bugfix: " * "#38405 - " * Be clear and descriptive * Bad: "Fix typo" * Good: "Add missing > in project section of HTML" * Bad: "Update login code" * Good: "Change user authentication to use Blowfish * Bad: "Updates member report, we should discuss if this is right next week" t23094 - Fixes bug in admin logout When an admin logge out of the admin ares, they could not log in to the memebers area because their session[:user_id] was still set to the admin ID. This patch fixes the bug by setting session[:user_id] to nil when any user logs out of any area. ===== Viewing commit log ===== git log limit number of commit messages git log -n 5 time periods git log --since=2012-06-14 git log --until=2012-06-15 git log --author="Kevin" git log --grep="Init" (global reg ex search) ====== 4. Git Concepts and Architecture ====== ===== Three tree architecture ===== * Two tree * working * commit * repository * checkout * Three tree * working * git add file.txt * staging index * git commit file.txt * repository The third tree allows a way to get changes ready for the commit and still allow modifications to the working directory until time to commit. ===== Git workflow ===== * New file creation is in the working directory. touch file.txt * git add places the file in the staging directory git add file.txt * git commit saves the changes to the repository git commit ... * edited file is modified in the working directory cat >> file.txt some changes ^d * add the changes to the staging index git add file.txt * commit changes git commit ... ===== Using has values (SHA-1) ===== * Git generates a checksum for each change set * checksum algorithms convert data into a simple number * sam data always equals same checksum * data integrity is fundamental * changing data would change checksum * Git uses SHA-1 hash algorithm to create checksums * 40-character hexadecimal string (0-9,a-f) git log Each commit has the parent hash as part of the commit to ensure data integrity between commits. ===== Working with the HEAD pointer ===== HEAD * reference pointer to "tip" of current branch in repository * last state of repository; what was last checked out * points to parent of next commit * where writing commits takes place kind of like the record head of a tape player cd .git ls -la cat HEAD cd refs ls -la cd heads cat master git log (to review what the SHA-1 refers to) git log HEAD (is the same as above) ====== 5. Making Changes to Files ====== ===== Adding Files ===== git status git add second_file.txt git status git commit -m "Add second file to project" git status git log git add third_file.txt git status git commit -m "Add third file to project" git status git log ===== Editing Files ===== Same procedure as adding files. Make changes with text editor git status git add first_file.txt git log files can be in staging directory and not in staging and "status" will show the differences. ===== Viewing Changes with diff ===== view differences between repository version and the working directory git diff less started with -S will chop long lines. -R will show raw and wrap lines Inside less, use - shift S to toggle back and forth between wrap and chop lines. ===== Viewing only staged changes ===== view differences between repository verison and the staging index version git add first_file.txt git diff --staged This used to be called --cached which was confusing. Both return the same information. ===== Deleting files ===== git add * git commit -m "files to delete" Two ways to delete files. One it to delete file_to_delete1.txt from the OS which can put it in the trash, then: git rm file_to_delete1.txt git commit -m "deleted file_to_delete1.txt" git status git log The other way is to just do the whole remove from git, which will bypass the trash. git rm file_to_delete2.txt git commit -m "Removed second file" ===== Moving and renaming files ===== Two ways: from the OS, then tell git, or just let git do it. (rename a file) git status (then git shows a deleted file and a new untracked file.) git add primary_file.txt git rm first_file.txt git status (then shows the file to be renamed even with up to 50% changes.) git mv second_file.txt secondary_file.txt git status will then show the file renamed Moving is similar git mv third_file.txt first_directory/third_file.txt git commit -m "reorganized file structure by moving files" ====== 6. Using Git with a Real Project ====== ===== Editing the support Phone Number ===== TextMate allows files to be edited as a project by dragging the folder onto TextMate. Make desired changes. Then use git status and git diff to see the changes git status git diff contact.html Shows the lines with +/- designating changed lines. * Uses the Less pager. * "f" and "b" can be used to move forward and back pages of text. * Start "less" with -r to fold lines (set in global config.) * or, hit the minus key and Shift-S + return To highlight changes specifically (not on a line by line level): git diff --color-words contact.html ==== commit the changes ==== git add contacts.html or git add . or git commit -am "changed phone number." Note: -a includes all changed files, but not new files or deleted files. ===== Editing the backpak file name and links ===== Changing file names within git is a good option. git mv tours/tour_detail_backpack.html tours/tour_detail_backpack_cal.html git status will show that the file has been renamed. Make changes to the html by using a global search and change the references. git add tours.html git add /tours git status Note: git reports just the rename for the file that was renamed. A good practice is to make commits one change at a time. If after renaming files, a context change is made, then go ahead and commit the name change, then add the changed file(s) for another commit. ====== 7. Undoing Changes ====== ===== Undoing working directory changes ===== Show files modified. git status Show specific changes git diff Could be ambiguous: git checkout index.html git checkout resources This will retrieve the named thing (file, directory or branch), (index.html or resources) and make my directory look like that. Better practice: git checkout -- index.html (-- Means stay on the current branch.) These checkout(s) will blow away the contents of the present directory. ===== Unstaging files ===== To get a hint: git status git reset HEAD ... ===== Amending Commits ===== Changing prior commits to git cannot really be made because of the hash integrity. The last commit is editable however. With a change that needs to be commited git add resources.html git commit -m "Rearrange the items to bring on a trip" git log Make another change git status git add resources.html git commit --amend -m "Rearrange the items to bring on a trip" Or just the message can be updated which will change the hash of the last commit. Remember, once another commit is made, that commit cannot be changed. ===== Retrieving old versions ===== git status git log copy the first few letters of the hash, say 10 or so. git checkout 2907d12603a34 -- resources.html git status (shows it is moved into the staging index git diff --staged git commit -m "This commit reverts 2907d12603a34" (adding the hash is a good idea) Undo the checkout and commit: git status git reset HEAD resources.html (puts it back in the working directory.) git checkout -- resources.html ===== Reverting a commit ===== Takes all the changes and go back to that version git log git revert eb2f28564fd3cf git -n (does not automatically do the commit.) A merge is performed if the changes cannot be easily undone with a mirror image commit. ===== Using reset to undo many commits ===== git reset Allows us to specify where the HEAD pointer points to. git reset is analogous to rewinding a cassette and recording over it. --soft - does not change the staging index or working directory --mixed (default) - Changes staging index to match repository - does not change working directory --hard - changes staging index and working directory to match repository - USE WITH CAUTION as it removes from the working directory any changes since the commit ===== Demonstrating a soft reset ===== git log If we want to undo, we could "revert" or we can rewind and record over. Open up a new text file and paste the output of the "git log" because once we rewind, we will not be able to see the log of changes since. $ git log commit 78687188cca4cbd9374da062952eaa2db3a0ba7f Author: Steve Edwards Date: Tue Dec 20 15:41:36 2016 -0500 moved items in list. commit eb2f28564fd3cfe164be4329a78b3eac5c80ddd1 Author: Steve Edwards Date: Tue Dec 20 14:54:00 2016 -0500 Initial-07_02 commit 2907d12603a340c02a4c846e3709991a7d0c21b9 Author: Kevin Skoglund Date: Tue Jun 19 16:28:37 2012 -0400 Removed contractions from contact page text commit cf78db87140d6470393177c7dc634d706422acfa Author: Kevin Skoglund Date: Tue Jun 19 16:28:21 2012 -0400 Renamed Backpack Cal file for clarity commit 1506576375b15992e3d1f0a3d8965550efb89fa2 Author: Kevin Skoglund Date: Tue Jun 19 16:02:29 2012 -0400 Changed 24 hour support number to 4314 commit c4b913ef2da10a5d72c1ab515ada11ffb9c343e0 Author: Kevin Skoglund Date: Tue Jun 19 15:04:41 2012 -0400 Initial commit $ cat .git/HEAD ref: refs/heads/master $ cat .git/refs/heads/master eb2f28564fd3cfe164be4329a78b3eac5c80ddd1 git reset --soft eb2f28564fd3 git status Shows the reverted file. git diff show no changes git diff --staged shows changes All it does is move the head pointer. A re-commit could be made: git commit -m "Doing the commit over again." or just change the head pointer back. git reset --soft 78687188cca4cb ===== Demonstrating a mixed reset ===== Same as soft except it makes the staging index look the same as the repository Make a copy of the log so we have the commit hashes: $ git log commit 78687188cca4cbd9374da062952eaa2db3a0ba7f Author: Steve Edwards Date: Tue Dec 20 15:41:36 2016 -0500 moved items in list. commit eb2f28564fd3cfe164be4329a78b3eac5c80ddd1 Author: Steve Edwards Date: Tue Dec 20 14:54:00 2016 -0500 Initial-07_02 commit 2907d12603a340c02a4c846e3709991a7d0c21b9 Author: Kevin Skoglund Date: Tue Jun 19 16:28:37 2012 -0400 Removed contractions from contact page text commit cf78db87140d6470393177c7dc634d706422acfa Author: Kevin Skoglund Date: Tue Jun 19 16:28:21 2012 -0400 Renamed Backpack Cal file for clarity commit 1506576375b15992e3d1f0a3d8965550efb89fa2 Author: Kevin Skoglund Date: Tue Jun 19 16:02:29 2012 -0400 Changed 24 hour support number to 4314 commit c4b913ef2da10a5d72c1ab515ada11ffb9c343e0 Author: Kevin Skoglund Date: Tue Jun 19 15:04:41 2012 -0400 Initial commit git reset --mixed eb2f28564fd3c Unstaged changes after reset: M resources.html So, `--mixed` will change the staging index to what is in the repository. Now, a git diff will show changes, and git diff --staged will not indicate changes. We could restage and re-commit. git add . git status ===== Demonstrating a hard reset ===== This will destuctively rewrite files in the current directory. $ git log commit 78687188cca4cbd9374da062952eaa2db3a0ba7f Author: Steve Edwards Date: Tue Dec 20 15:41:36 2016 -0500 moved items in list. commit eb2f28564fd3cfe164be4329a78b3eac5c80ddd1 Author: Steve Edwards Date: Tue Dec 20 14:54:00 2016 -0500 Initial-07_02 commit 2907d12603a340c02a4c846e3709991a7d0c21b9 Author: Kevin Skoglund Date: Tue Jun 19 16:28:37 2012 -0400 Removed contractions from contact page text commit cf78db87140d6470393177c7dc634d706422acfa Author: Kevin Skoglund Date: Tue Jun 19 16:28:21 2012 -0400 Renamed Backpack Cal file for clarity commit 1506576375b15992e3d1f0a3d8965550efb89fa2 Author: Kevin Skoglund Date: Tue Jun 19 16:02:29 2012 -0400 Changed 24 hour support number to 4314 commit c4b913ef2da10a5d72c1ab515ada11ffb9c343e0 Author: Kevin Skoglund Date: Tue Jun 19 15:04:41 2012 -0400 Initial commit git reset --hard eb2f28564fd3cfe164be git log git status files have been changed and reverted. We can move back to the latest commit if we know the hash, but at some point the commit would be garbage collected. git reset --hard 78687188cca4cbd93 Or make another commit. git reset --hard eb2f28564fd3cfe164be git log git status are both clean and the files are rewound. ...make a change git status git commit -am "moved sunglasses above hat." git log The overwritten commits are abandoned and will eventually get cleaned up. ===== Remove untracked files ===== Destructivly deletes files from the pwd. git clean if some unneeded files, say text files, are in the directory, then git can purge them. cat > junk1.txt cat > junk2.txt cat > junk3.txt Test run: git clean -n git add junk1.txt Force: git clean -f removes junk2 and 3 git status git reset HEAD junk1.txt removes junk1.txt from staging index git clean -f removes junk1.txt ====== 8. Ignoring Files ====== ===== Using .gitignore files ===== Create a file in the root of the project directory project/.gitignore Can have very basic regular expressions `* ? [aeiou] [0-9] negate expressions with ! `*.php` !index.php ignore all files in a directory with trailing slash assets/videos/ comment lines begin with #, blank lines are skipped cat >.gitignore tempfile.txt .DS_Store *.zip *.gz log/*.log log.*.log.[0-9] assets/photoshop/ assets/videos # But don't ignore: !assets/videos/tour_*.mp4 ===== Understanding what to ignore ===== * compiled source code * packages and compressed files * logs and databases * operating system generated files * user-uploaded assets (images, PDF's, videos) https://help.github.com/articles/ignoring-files https://github.com/github/gitignore ===== Ignoring files globally ===== * ignore files in all repositories * setting not tracked in repository * user-specific instead of repository-specific Create the .gitignore_global in base of home directory cat > ~/.gitignore_global .DS_Store .Trashes .Spotlight-V100 git config --global core.excludesfile ~/.gitignore_global ===== Ignoring tracked files ===== Tracked files are not ignored even if the file is in .gitignore * Add file to .gitignore Then git rm --cached tempfile2.txt ===== Tracking Empty Directories ===== Empty directories are not tracked. mkdir assets git status Add: touch .gitignore or touch .gitkeep git status git add assets/pdfs/ git status reveals a tracked file git commit -m "Add 'empty' directory with .gitkeep file in it" ====== 9. navigating the Commit Tree ====== ===== Referencing commits ===== tree-ish is something that references part of a tree. * references a commit (sha-1 hash) * sha-1 hash * short sha-1 hash * at least 4 characters for a small project * unambiguous (8-10 characters) * HEAD pointer * always points to the commit of tip of the currently checked out branch * branch reference, or tag reference * ancestry * parent commit * `-HEAD^`, `acf87504^`, `master^` * `-HEAD~1`, `HEAD~` * grandparent commit * `HEAD^^`, `acf87504^^`, `master^^` * `-HEAD~1` * great-grandparent commit * `-HEAD^^^`, `acf87504^^^`, `master^^^` * `HEAD~3` ===== Exploring tree listings ===== git ls-tree ... git help ls-tree git ls-tree HEAD A tree is a directory ===== Getting more from the commit log ===== git help log git log --oneline git log --oneline -3 git log --since="2012-06-20" git log --after="2012-06-20" (same as previous) git log --until="2012-06-20" git log --before="2012-06-20" (same as previous) git log --since="2 weeks ago" --until="3 days ago" git log --since=2.weeks --until=3.days git log --author="Kevin Skoglund" git log --grep="temp" git log --online git log 2907d12..acf8750 git log 2907d12..acf8750 --oneline git log c4b913.. index.html git log -p c4b913.. index.html git log --stat c4b913.. index.html git log --summary c4b913.. index.html git log --stat --summary c4b913.. index.html git log --format=oneline (returns full sha1) git log --format=short git log --format=meduim (default) git log --format=full git log --format=fuller git log --format=email git log --format=raw git log --graph (shows branches) git log --oneline --graph --all --decorate ===== Viewing commits ===== git log --oneline git show cdb913e git show --format=online cdb913e git show --format=online HEAD git show --format=online HEAD^ git show --format=online HEAD^^ git show --format=online HEAD~3 git help show git ls-tree master git show 6fa98b (Tree-ish object "tree" instead of "blob", which is a directory) git show 497db6 (Tree-ish object "blob" instead of "tree", which is a file) git show index.html (is not the same thing as a tree-sh and will not work.) ===== Comparing commits ===== Show changes between working directory and Staging index git diff Show changes between staging index and the repository or the HEAD (where the HEAD pointer is pointing) git diff --staged git diff --cached (same thing) git log --oneline Passing in one sha1 will show the difference between that commit and the pwd. git diff cdae0ed git diff cdae0ed tours.html git diff cdae0ed..cdae0ed git diff cdae0ed..cdae0ed tours.html git diff cdae0ed..HEAD git diff cdae0ed..HEAD^^ git log --oneline git diff --stat --summary 1506576..HEAD git diff -b 1506576..HEAD git diff --ignore-space-change 1506576..HEAD (same as -b) git diff --ignore-all-space 1506576..HEAD (same a w) git diff -w 1506576..HEAD (ignore all space changes) ====== 10. Branching ====== ===== Branching overview ===== Branches of the master can be created and merged back into the master or discarded. It is a good way to test ideas in code that might not make it, rather than undoing a bunch of commits. The HEAD pointer will point to the same commit until changes on the created branch are made and committed. ===== Viewing and creating branches ===== To show the branches before creating: git branch The * indicates the current branch cat .git/HEAD ls -la .git/refs/heads cat .gits/refs/heads/master To create the branch: git branch new_feature ls -la .git/refs/heads cat .git/refs/heads/new_feature (shows hash of master since nothing has been committed yet.) cat .git/HEAD (still points to master) ===== Switching branches ===== pwd git branch cat .git/HEAD git checkout new_feature git branch cat .git/HEAD Make a change git status git commit -am "Modified title on index.html" git log --oneline git checkout master git branch git log --oneline ===== Creating and switching branches ===== git branch To create a new branch and checkout at the same time git checkout -b shorten_title git status (note the checkout help option to discard changes) git add index.html git commit -m "Shorten title in index.html" git log --oneline git checkout new_feature git log --oneline git checkout master git log --oneline git log --graph --oneline --decorate --all ===== Switching branches with uncommitted changes ===== Working directory must be " mostly clean". Untracked files will not be deleted, as they will just show up as untracked files in any branch switched to. git status git checkout shorten_title make a change to index.html git status (shows unstaged change) git checkout master (will fail with an error.) Two options. One is to discard changes. git status git checkout -- Second is to commit the changes git commit -am "Swap out dash for colon in index.html title." Third is to stash the changes. Described later. ===== Comparing branches ===== git branch git diff master..new_feature git diff --color-words new_feature..shorten_title git diff --color-words new_feature..shorten_title^ To check if a branch has been completely included in a branch. git branch --merged ===== Renaming branches ===== pwd git branch git diff master..new_feature git branch -m new_feature seo_title git branch --move new_feature seo_title (same as previous) ===== Deleting branches ===== git branch git checkout master git branch branch_to_delete git branch -d branch_to_delete git branch branch_to_delete git checkout branch_to_delete git branch -d branch_to_delete (will fail to delete) make a change git commit -am "Changed Title" git log --oneline git checkout master git branch git branch -d branch_to_delete (will fail to delete) git branch ===== Configuring the command prompt to show the branch ===== Make sure .git-completion.bash and git-prompt.sh are installed and .git-completion is loaded from .bash_profile $ cat ~/.bash_profile if [ -f ~/.git-completion.bash ]; then source ~/.git-completion.bash fi if [ -f ~/git-prompt.sh ]; then echo $PS1 source ~/git-prompt.sh PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' # Default seems to be '\h:\W \u\$' fi export PS1='>>>>>' export PS1='$(_git_ps1 "(%s)") > ' export PS1='\W$(_git_ps1 "(%s)") > ' ====== 11. Merging Branches ====== ===== Merging code ===== Start with a clean working directory with everything committed. Checkout the branch the is receiving the changes. git checkout master git merge seo_title ===== Using fast-forward merge vs. true merge ===== A fast forward merge can occur when no changes have been made on the originating branch. It can simply move the commit to the timeline and point the HEAD at it. To take a look: git log seo_title --oneline -3 git log master --oneline -3 Force a commit while merging so a commit message can be logged. git merge --no-ff branch Merge only if ff merge can be performed. git merge --ff-only branch True merge git checkout master git branch make a change to contact.html git status git add contact.html git commit -m "edit contact.html title" git log --oneline -3 git log shorten_title --oneline -3 git merge shorten_title (text editor will be involked to add a commit message.) ===== Merging Conflicts ===== If the same line is changed on the same file in different branches, then a conflict will arrise git checkout -b 'text_edits' Make changes to mission.html on lines 65, 66, 67 and 68. git status git commit -am "Text edits on mission.html page" git checkout master Make changes to mission.html on lines 67 git commit -am "Replace quotes on mission.html page" git log --oneline git log text_edits --oneline git merge text_edits the conflicting files get lines inserted with the conflicts that will need to be fixed manually. ===== Resolving merge conflicts ===== If PS1 is set, the prompt will show (master|MERGING) Three choices * abort merge * resolve the conflicts manually * use a merge tool (not recommended until fully understanding merging manually) Abort git merge --abort Resolve manually Search for "<<<<" in the conflicting file git log --oneline -3 git show 432e8c6 (This will show differences.) Find the proper changes and remove all the <<<< and ===== and extra parts. git add mission.html git commit (a message is not necessary.) git log --graph --oneline --all --decorate git mergetool --tool= git mergetool ===== Exploring strategies to reduce merge conflicts ===== * keep lines short * keep commits small and focused (don't make changes "while in the file".) * beware stray edits to whitespace * spaces, tabs, line returns * merge often * track changes to master (merge master into branch as changes get made.) ====== 12. Stashing Changes ====== ===== Saving changes in the stash ===== git branch git checkout shorten_title git branch --merged modify mission.html git status git checkout master (will not work since changes to the shorten_title branch have been made!) so stash them instead git stash save "changed mission.html page title" A stash is not a commit, it can be a little sloppier. git log --oneline -3 runs get reset hard HEAD and made what is in the repo our pwd Untracked files can be included with the git stash "include untracked" option. ===== Viewing stashed changes ===== list changes git stash list show files changed git stash show stash@{0} show files changed with diff git stash show -p stash@{0} ===== Retrieving stashed changes ===== Stashed changes can be brought (merged) into whatever branch you are on like merging. git stash pop (removes code from stash. Used most of the time.) git stash apply (leaves a copy in stash) By default, it will pop the first stash A specific stash can be popped. git stash pop stash@{2} ===== Deleting stashed changes ===== git stash list git stash drop stash@{0} make a change tours.html git status git stash save "changed mission and tours page title" git stash list git status Make a change to explorers.html Delete everything in stash all at once git stash clear ====== 13. Remotes ====== ===== Using local and Remote repositories ===== Remotes are the central repository online. GitHub is one as such is BitBucket. Changes are sent to the server with a "push" command. This creates a branch called origin/master that matches the changes pushed to the repository on our local machine. This origin allows changes to be made by others while a local copy is also being modified. The changes have to be merged together to combine the changes. Origin/master just tries to stay in sync with the version on the remote. push (send local commits to remote server and creates orgin/master and tries to stay in sync with server master.) fetch (brings remote changes into origin/master. A merge needs to be done to move changes to local master. merge (fast forward merge) Do commits locally, fetch changes from server, then merge locally, and then push up to the server. ===== Setting up a GitHub account ===== Create an account. Free ones are public only. Create a new repository (repo) Initialize with README will add a README file. .gitignore is also available. The setup page show commands to add the remote server origin branch ===== Adding a remote repository ===== git remote Create a origin brach by convention for the main git remote add origin https://... git remote To list remotes verbosely and show the url git remote -v To remove a remote alias git remote rm orgin (or whatever alias name used) ===== Creating a remote branch ===== Push (-u track branch change) (alias for remote repository) (branch) git push -u origin master cat .git/config master references origin, and origin references a url. ls -la .git/refs/remotes/ ls -la .git/refs/remotes/origin/ cat .git/refs/remotes/origin/remotes stores branch hashes git branch -r git branch -a ===== Cloning a remote repository ===== Find the link on github path to the repository and use it following: git clone https://github.com/kevinskoglund/explore_california.git To put it in a different named folder git clone https://github.com/kevinskoglund/explore_california.git lynda_version git branch Only the master branch by default (which can be changed) will be cloned unless -b specifies a different branch. ===== Tracking remote branches ===== The dash u option tracks changes on a remote server. cat .git/config ... [branch "master"] remote = origin merge = refs/heads/master Create a branch that does not track don't use the `-u` option git branch non_tracking git push origin non_tracking Does not create a branch paragraph in the config file To manually create: git config branch.non_tracking.remote origin git config branch.non_tracking.merge refs/heasd/master with git 1.7: git branch --set-upstream non_tracking origin/non_tracking ===== Pushing Changes to a remote repository ===== Make some changes to tours.html git commit -am "some changes made to tours.html" git log --oneline git log --oneline origin/master (my copy of remote branch) git diff origin/master..master git push origin master Since it is a tracking branch, just: git push git log --oneline ===== Fetching changes from a remote repository ===== pwd git log --oneline -5 git log --oneline -5 orgin/master git branch git branch -r (to show remote branches) git does not automatically sync changes, it just looks at the local copy. git fetch origin git fetch (if only one repository is specified) * Always fetch before you work. * Fetch before you push. * Fetch often ===== Merging in fetched changes ===== pwd git branch -a git diff origin/master..master git merge origin/master git log --oneline -3 master git pull = git fetch + git merge ===== Checking out remote branches ===== pwd git branch git branch -r A non-tracking branch can be retrieved and set to track: git branch non_tracking origin/non_tracking git branch cat .git/config (shows tracked branch) To delete the local copy of the branch: git branch -d non_tracking git branch -r create a branch and check it out: git checkout -b non_tracking origin/non_tracking git branch (shows the active branch is non_tracking.) git checkout master (to go back to the master branch.) ===== Pushing to an updated remote branch ===== If commits have been made to the remote server since the local fetch, git will not push. git fetch git merge origin/master git push ===== Deleting a remote branch ===== pwd git branch -a old way: git push origin :non_tracking git branch -r (it's gone!) The colon is shorthand for from:to and if nothing is on the left side, it assumes nothing goes to the right and deletes it. The shorthand can also be used to push from one to another git push origin non_tracking:non_tracking Newer, more intuitive way: First push the local copy of the branch back up git push origin non_tracking git branch -r git push origin --delete non_tracking ===== Enabling collaboration ===== From the github project homepage, select admin and add collaborators. For an open source project, create a fork. ===== A collaboration workflow ===== git checkout master git fetch git merge origin/master Create a branch to work on changes git checkout -b feedback_form Create a new file called feedback.html git add feedback.html git commit -m "Add customer feedback form" git fetch git push -u origin feedback_form Co-workers point of view: git clone ??? (if not already cloned) git checkout master git merge origin/master Now grab the remote version of feedback_form git checkout -b feedback_form origin/feedback_form git log git show 84b6adf0 or git show feedback_form (if it is the last commit made.) make a change to the feedback_form git commit -am "Adde tour selector to feedback form" git fetch git push My p.o.v. git fetch git log -p feedback_form..origin/feedback_form if changes are acceptable, them merge them with the local copy git merge origin/feedback_form Go back to master and update it for other remote changes. git checkout master git fetch git merge origin/master Master is now up-to-date. Now merge in the feedback_form git merge feedback_form git push ====== 14. Tools and Next Steps ====== ===== Setting up aliases for common commands ===== pwd Set aliases in the global git config file so that they work for all projects ls -la ~/ The file is .gitconfig git config --global alias.(abbreviated command) (actual command) git config --global alias.st status cat ~/.gitconfig git config --global alias.co checkout git config --global alias.ci commit git config --global alias. git config --global alias.br branch git config --global alias.df diff git config --global alias.dfs "diff --staged" git config --global alias.dfc "diff --cached" git config --global alias.logg "log --graph --decorate --oneline --abbrev-commit --all" ===== Using SSH keys for remote login ===== https://help.github.com/articles/set-up-git https://help.github.com/articles/caching-your-github-password-in-git/ https://help.github.com/articles/connecting-to-github-with-ssh/ ===== Exploring integrated development environments ===== Textmate > Bundles > Git * Vim * Emacs * TextMate * Eclipse * Netbeans * Visual Studio * IntelliJ * RubyMine * PHPStorm ===== Exploring graphical user interfaces ===== * GitWeb * https://git.wiki.kernel.org/index.php/Gitweb ==== Graphical User Interfaces for Mac ==== * GitX http://gitx.org * GitHub http://mac.github.com * SourceTree http://sourcetreeapp.com * Tower http://git-tower.com * SmartGit http://syntevo.com/smartgit * Gitbox http://gitboxapp.com ==== Graphical User Interfaces for Windows ==== * TortiseGit http://code.google.com/p/tortoisegit * GitHub http://windows.github.com * Git Extensions http://code.google.com/p/gitextensions * SmartGit http://syntevo.com/smartgit List of others: https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools ===== Understand Git hosting ===== A git server needs to be set up. * GitHub http://github.com * Bitbucket http://bitbucker.org * Gitorious http://gitorious.org ==== Git Self-Hosting ==== * Gitosis http://github.com/tv42/gitosis * development stopped a few years ago * Gitolite http://github.com/sitaramc/gitolite * based on gitosis