How to use git? Contents Jiang Lin
Transcription
How to use git? Contents Jiang Lin
How to use git? Jiang Lin∗† This version: 03/18/2014 Contents 1 Why git? 4 2 Install git 4 3 Overview 5 4 Initial config 5 5 First project 5 5.1 Repository hosting . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5.2 Clone remote repository . . . . . . . . . . . . . . . . . . . . . . . 6 5.3 Ignore list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.4 Add files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.5 Show changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.6 First commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.7 First push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.8 Back to the beginning . . . . . . . . . . . . . . . . . . . . . . . . 6 5.9 Remove git repository . . . . . . . . . . . . . . . . . . . . . . . . 7 6 Git maintenance 6.1 ∗ email: 7 Local vs remote . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 6.1.1 basic steps . . . . . . . . . . . . . . . . . . . . . . . . . . 7 6.1.2 git remote origin . . . . . . . . . . . . . . . . . . . . . . . 7 [email protected]; imlinj.github.io. † homepage: 1 6.1.3 additional tools . . . . . . . . . . . . . . . . . . . . . . . . 7 6.1.4 change remote URL . . . . . . . . . . . . . . . . . . . . . 7 Tracked files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2.1 list contents . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2.2 update .gitignore . . . . . . . . . . . . . . . . . . . . . . . 8 Branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6.3.1 list branches . . . . . . . . . . . . . . . . . . . . . . . . . 8 6.3.2 new branches . . . . . . . . . . . . . . . . . . . . . . . . . 8 6.3.3 push to remote . . . . . . . . . . . . . . . . . . . . . . . . 9 6.3.4 copy files across . . . . . . . . . . . . . . . . . . . . . . . 9 6.3.5 merge a branch . . . . . . . . . . . . . . . . . . . . . . . . 9 6.3.6 delete a branch . . . . . . . . . . . . . . . . . . . . . . . . 9 6.3.7 compare branches . . . . . . . . . . . . . . . . . . . . . . 9 Stash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 6.4.1 what is stash . . . . . . . . . . . . . . . . . . . . . . . . . 9 6.4.2 discard unstaged changes . . . . . . . . . . . . . . . . . . 9 Compare commits . . . . . . . . . . . . . . . . . . . . . . . . . . 9 6.5.1 compare a specific file . . . . . . . . . . . . . . . . . . . . 9 Merge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6.6.1 fetch/merge vs. pull . . . . . . . . . . . . . . . . . . . . . 10 6.6.2 mergetool . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6.6.3 solve merge conflicts . . . . . . . . . . . . . . . . . . . . . 10 6.7 Export commits . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6.8 Revert commits . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 6.8.1 git diff commits difference . . . . . . . . . . . . . . . . . . 11 6.8.2 change HEAD . . . . . . . . . . . . . . . . . . . . . . . . 11 6.8.3 revert commits . . . . . . . . . . . . . . . . . . . . . . . . 11 Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 6.9.1 create a tag . . . . . . . . . . . . . . . . . . . . . . . . . . 11 6.9.2 list all tags . . . . . . . . . . . . . . . . . . . . . . . . . . 11 6.9.3 checkout a specific tag . . . . . . . . . . . . . . . . . . . . 11 6.9.4 git describe . . . . . . . . . . . . . . . . . . . . . . . . . . 11 6.2 6.3 6.4 6.5 6.6 6.9 2 7 Git with SSH 11 7.1 SSH with Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 12 7.2 Set up SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 7.3 Configure local repository . . . . . . . . . . . . . . . . . . . . . . 12 8 Miscellaneous 12 8.1 Help Documentation . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.2 Take a try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.3 git-rev-parse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.4 GitLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8.5 Gitweb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8.6 master vs testing . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8.7 https vs git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8.8 git-extras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8.9 Create build numbers . . . . . . . . . . . . . . . . . . . . . . . . 13 8.10 index.lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 8.11 A sample .gitignore file . . . . . . . . . . . . . . . . . . . . . . . . 14 3 1 Why git? • Version control is an essential part of research. – What is version control? The management of changes to documents, programme source codes, and other forms of text-based information. – What can a version control system do? ∗ Keep track of editing history; ∗ Coordinate team collaboration. • What is git? – Git is a distributed version control system1 ; – A tool to implement version control efficiently. • What does “distributed” mean? – Local machines keep a full history of versions; – No need to get connected to a server. Git was initially designed and written in 2005 by Linus Torvalds, the creator of Linux, for the convenience of maintaining the Linux kernel, so far the biggest OpenSource project on earth. Since then, git has been used to help organize the collaboration of authors from all over the world working on Linux, very efficiently2 . Take-away message • For not-so-heavy users other than IT programmers, git can be used to: 1. 2. 3. 4. 2 track revisions of your codes/documents (text-based3 ); backup version history; sync documents across local and remote machines; make collaboration with your co-authors easier. Install git Windows users could download installation files form official homepage: www.gitscm.com4 . Under Linux: (1) Arch Linux: sudo pacman -S git; (2) Debian/Ubuntu: sudo apt-get install git. 1 The opposite is the “centralized version control”, CVS. lines added; 1800 lines removed; 1500 lines modified per day from 2007-2008”, according to Greg Hartman’s talk on the development of Linux Kernel. 3 To confirm this, check whether the documents could be open by a text editor like gvim or notepad. 4 SCM is short for “Source Code Management”. 2 “4300 4 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Overview usage : git [ - - version ] [ - - help ] [ - C < path >] [ - c name = value ] [ - - exec - path [= < path >]] [ - - html - path ] [ - - man - path ] [ - - info - path ] [ - p | - - paginate | - - no - pager ] [ - - no - replace - objects ] [ - - bare ] [ - - git - dir = < path >] [ - - work - tree = < path >] [ - - namespace = < name >] < command > [ < args >] The most commonly used git commands are : add Add file contents to the index bisect Find by binary search the change that introduced a bug branch List , create , or delete branches checkout Checkout a branch or paths to the working tree clone Clone a repository into a new directory commit Record changes to the repository diff Show changes between commits , commit and working tree , etc fetch Download objects and refs from another repository grep Print lines matching a pattern init Create an empty Git repository or reinitialize an existing one log Show commit logs merge Join two or more development histories together mv Move or rename a file , a directory , or a symlink pull Fetch from and integrate with another repository or a branch push Update remote refs along with associated objects rebase Forward - port local commits to the updated upstream head reset Reset current HEAD to the specified state rm Remove files from the working tree and from the index show Show various types of objects status Show the working tree status tag Create , list , delete or verify a tag object signed with GPG ’ git help -a ’ and ’ git help -g ’ lists available subcommands and some concept guides . See ’ git help < command > ’ or ’ git help < concept > ’ to read about a specific subcommand or concept . 4 Initial config git config –global user.name your name git config –global user.email [email protected] git config –global core.editor vim 5 git config –global merge.tool vimdiff git config –list 5 First project 5.1 Repository hosting Github: free for public project; Bitbucket: free for both public and private project. 5 Under Windows, try: git config –global core.editor notepad . 5 5.2 Clone remote repository Clone via https: git clone https://[email protected]/HelloLj/replicatemodel/ Clone via SSH: [email protected]:HelloLj/replicatemodel.git Git clone to a specific directory: git clone [email protected]:flazz/vim-colorschemes.git bundle/colorschemes 5.3 Ignore list Local: .gitignore Global: git config –global core.excludesfile ’~/.gitignore’ A local ignore list is recommended, which is useful when editing from other remote machines (by doing that, you can easily sync the ignor file with the repository together). 5.4 Add files git add –all 5.5 Show changes git diff git diff #commit1 #commit2 5.6 First commit git commit -m “repository initialization” 5.7 First push git push origin master 5.8 Back to the beginning git init git remote add origin [email protected]:HelloLj/learnjulia.git git push origin master 6 5.9 Remove git repository rm -rf .git or delete .git folder directly. Be very cautious! 6 Git maintenance 6.1 6.1.1 Local vs remote basic steps 1. stage: git add 2. commit: git commit 3. push: git push local: 1 and 2. remote: 3. 6.1.2 git remote origin What is origin? 6.1.3 additional tools git merge ... git pull ... 6.1.4 change remote URL 1. Say I had a repository that I have mistakenly set the remote url. To check this, do the git info . It returns the following, ## Remote URLs: origin https://[email protected]/linjecon/linjecon.jekyll.git (fetch) origin https://[email protected]/linjecon/jekyll.pages.git (push) So, I have different origin url’s for the fetch and push labels. Sometimes it is exactly what you want, however for most cases it is not. In order to fix this, I have to run the following line: git remote set-url origin https://[email protected]/linjecon/jekyll.pages.git Do the git info line again, which gives, ## Remote URLs: origin https://[email protected]/linjecon/jekyll.pages.git (fetch) origin https://[email protected]/linjecon/jekyll.pages.git (push) 7 2. A more tedious/inefficient way could be as follows, git remote rm origin #Removes old origin git remote add origin https://[email protected]/your.new.repo #Adds new origin pointing to BitBucket git push -u origin #Pushes commits to new repo 6.2 6.2.1 Tracked files list contents http://stackoverflow.com/questions/424071/list-all-the-files-for-a-commit-in-git git ls-tree –name-only HEAD git ls-tree –name-only HEAD -r git ls-files 6.2.2 update .gitignore http://stackoverflow.com/questions/1274057/making-git-forget-about-a-file-thatwas-tracked-but-is-now-gitignored git tracks any files that have been cached. This means newly updated .gitignore files has no effect on relevant files cached previousely. Instead, one has to remove those files manully. git rm –cached *.aux or git rm -cached . and git add . Be cautiouse when doing the git rm command. Try git rm –cached *.aux -n to do a dry run. 6.3 6.3.1 Branches list branches local: git branch local & remote: git branch -a 6.3.2 new branches git branch testing git checkout testing “checkout”: it dose not mean “getting out”, instead it means “have a look at it”, i.e., “check-in”. 8 6.3.3 push to remote git push origin master git push origin testing 6.3.4 copy files across Copy a file form master branch to the testing branch: git checkout testing git checkout master – notebook/RMagic.ipynb git branch -a # check all branches, both local and remote. 6.3.5 merge a branch Merge branch testing to master: git checkout master git merge testing 6.3.6 delete a branch git branch -d testing 6.3.7 compare branches Compare local/master and remote/testing git diff master origin/testing 6.4 Stash 6.4.1 what is stash 6.4.2 discard unstaged changes 6.5 Compare commits git diff #commit1 #commit2 6.5.1 compare a specific file git diff master~1:Note-UTF.tex Note-UTF.tex > diff.tmp git diff 4d8d54d4:Note-UTF.tex f018329a:Note-UTF.tex git diff f018329a Note-UTF.tex git log -p -1 Note-UTF.tex 9 6.6 Merge http://svn.cs.swarthmore.edu/cs40/wiki/git/merge 6.6.1 fetch/merge vs. pull ... 6.6.2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 mergetool $ git pull ... CONFLICT ( content ) : Merge conflict in plugins / go / go . plugin . zsh ... Auto - merging plugins / battery / battery . plugin . zsh Auto - merging lib / termsupport . zsh Removing lib / rvm . zsh Removing lib / rbenv . zsh ... Automatic merge failed ; fix conflicts and then commit the result $ git mergetool Merging : plugins / go / go . plugin . zsh Symbolic link merge conflict for ’ plugins / go / go . plugin . zsh ’: { local }: modified file { remote }: a symbolic link -> ’../ golang / golang . plugin . zsh ’ Use ( l ) ocal or ( r ) emote , or ( a ) bort ? r $ ... 6.6.3 solve merge conflicts Assume there is a merge conflict with filename.c. There are three options to solve the conflict: 1. keep local changes: $ git checkout –ours filename.c 2. adopt remote changes: $ git checkout –theirs filename.c 3. mix both versions by hand and then add the merged result: $ git add filename.c $ git commit -m "mixed changes from both local and remote" 6.7 Export commits git archive –format zip –output /full/path/to/zipfile.zip 29435bc 10 6.8 Revert commits On one branch, there usually are many a history of commites along the time. When doing git checkout, git treats those commits as if they are different branches. Switching between diffent commits is usually callled changing HEAD in git, where HEAD acts like a pointer pointing to a specific commit that you are currently working with on the timeline of a branch . 6.8.1 git diff commits difference 6.8.2 change HEAD git log git checkout f018329a 6.8.3 revert commits 6.9 Tags 6.9.1 create a tag git tag -a v1.4 -m ’create version 1.4’ 6.9.2 list all tags git tag git tag -l ’v1.2.’ 6.9.3 checkout a specific tag git clone [email protected]:julialang/julia.git git tag -l git checkout tags/v0.2.0 6.9.4 git describe http://git-scm.com/docs/git-describe 7 Git with SSH SSH is short for “secure shell”. By using SSH, one can conveniently log into online git hosting services without typing username and password repeatedly. Both github.com and bitbucket.org support SSH login. 11 7.1 SSH with Windows Three options: 1. Install Cygwin; in Cygwin, install OpenSSH. 2. Install Github client for windows, and once installed, OpenSSH should be available in Gitshell; 3. Install Gitbash, OpenSSH would have already been included. 7.2 Set up SSH Three steps: 1. Get bash terminal 2. ssh-v 3. ssh-keygen 4. copy ~/.ssh/id_ras.pub to Github or Bitbucket 7.3 Configure local repository switch to SSH from https: git remote set-url https:\\[email protected]\repository.git and switch it back to SSH: git remote set-url [email protected]:username\repository.git 8 8.1 Miscellaneous Help Documentation http://git-scm.com/doc; GitImpression 8.2 Take a try try.github.io/ 8.3 git-rev-parse https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html 12 8.4 GitLab GitLab (https://www.gitlab.com/) is an OpenSource project with which users could build their own git hosting server. It is particularly suitable for enthusiastic academic teams/institutions and startup firms. 8.5 Gitweb Build simple HTTP server for git repository browsing: http://git-scm.com/book/en/Giton-the-Server-GitWeb. 1. install HTTP webserver, e.g., lighttpd or WEBrick; 2. [optional] modify .git/description to add custom description of the repositiory; 3. git instaweb 8.6 master vs testing Assume that you have created two branches for your thesis: master and testing with a consideration that “master” branch is used for milestone updates while “testing” is just for some daily maintenance. Make sure only checkout master branch when you want to update it. Do not try to update files when checking out the master branch, otherwise it may cause some conflicts, though usually dose not make a big fuzz. But for a good manner of branch management, those could be avoided. 8.7 https vs git If you are behind a firewall and you need to use the https protocol instead of the git protocol: git config –global url."https://".insteadOf git:// 8.8 git-extras git-extras is a set of utilities that provides extra tools for the use of git. Using git-extras under Widows would be a little bit tricky. One can install gitextras in MinGW or Cygwin environment. As an alternative, see here for the installation in Windows. 8.9 Create build numbers http://blog.marcingil.com/2011/11/creating-build-numbers-using-git-commits/ 13 8.10 1 index.lock fatal : Unable to create ’/. git / index . lock ’: File exists . If no other git process is currently running , this probably means a git process crashed in this repository earlier . Make sure no other git process is running and remove the file manually to continue . Solution: (1) check all other git processes have been terminated; (2) if (1) is confirmed, rm .git/index.lock. 8.11 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 # A sample .gitignore file Edited based on a sample file from : https :// help . github . com / articles / ignoring - files by LJ . ipynb_checkpoints / # Compiled source # # ################## *. com *. class *. dll *. exe *. o *. so # Packages # # ########### # it ’ s better to unpack these files and commit the raw source # git has its own built in compression methods *.7 z *. dmg *. gz *. iso *. jar *. rar *. tar *. zip # Logs and databases # # ##################### *. log *. sql *. sqlite # OS generated files # # ##################### . DS_Store . DS_Store ? ._* . Spotlight - V100 . Trashes ehthumbs . db Thumbs . db 14