Git
General
See also Vim#Git
- Git - a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git is easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.
- https://en.wikipedia.org/wiki/Git - a distributed version control system that tracks changes in any set of computer files, usually used for coordinating work among programmers collaboratively developing source code during software development. Its goals include speed, data integrity, and support for distributed, non-linear workflows (thousands of parallel branches running on different computers).
- Git - Book - The entire Pro Git book, written by Scott Chacon and Ben Straub and published by Apress, is available here. All content is licensed under the Creative Commons Attribution Non Commercial Share Alike 3.0 license. Print versions of the book are available on Amazon.com.
- https://github.com/k88hudson/git-flight-rules - Flight rules for git. Flight Rules are the hard-earned body of knowledge recorded in manuals that list, step-by-step, what to do if X occurs, and why. [3]
Guides
- Git wiki
- Pro Git [4]
- Arch Linux Wiki: Git
- Git cookbook
- git - the simple guide
- http://www-cs-students.stanford.edu/~blynn/gitmagic/
- http://gitimmersion.com/
- http://blog.quickpeople.co.uk/2013/07/10/useful-github-patterns/
- http://marklodato.github.com/visual-git-guide/index-en.html
- http://try.github.com/ - interactive introduction
- http://pcottle.github.io/learnGitBranching/ - like vim golf. ish.
- https://speakerdeck.com/simonclouds/understand-git - nice one page intro slide
- http://marklodato.github.io/visual-git-guide/index-en.html
- http://www.wei-wang.com/ExplainGitWithD3/ [5]
- PDF: Git from the bottom up - by John Wiegley, 2009
Articles
- Understanding Git Conceptually
- pushing and pulling
- Understanding the Git Workflow
- http://durdn.com/blog/2012/12/05/git-12-curated-git-tips-and-workflows/
- https://blogs.atlassian.com/2014/01/simple-git-workflow-simple/ [7]
Consider how a common Git workflow falls apart.
Create a branch off Master, do work, and merge it back into Master when you’re done
Most of the time this behaves as you expect because Master changed since you branched. Then one day you merge a feature branch into Master, but Master hasn’t diverged. Instead of creating a merge commit, Git points Master to the latest commit on the feature branch, or “fast forwards.” (Diagram)
Unfortunately, your feature branch contained checkpoint commits, frequent commits that back up your work but captures the code in an unstable state. Now these commits are indistinguishable from Master’s stable commits. You could easily roll back into a disaster.
- A successful Git branching model [8]
- https://gist.github.com/jbenet/ee6c9ac48068889b0912
- A Rebase Workflow for Git
- http://mercurial.selenic.com/wiki/GitConcepts
- http://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg39091.html
- http://joeyh.name/blog/entry/git_push_over_XMPP/ - an idea..
- http://marklodato.github.com/visual-git-guide/index-en.html
- https://ventrellathing.wordpress.com/2013/01/25/git-a-nightmare-of-mixed-metaphors/
- http://blog.moertel.com/posts/2013-02-18-git-second-order-diff.html
Config
git config --global --edit open config file in editor
git config --global user.name "Your Name Here" git config --global user.email "your_email@youremail.com"
git config color.ui true turns on colour for everything git config format.pretty oneline
git config --global push.default matching (will be default soon)
git config --global help.autocorrect 10
git config --global credential.helper 'cache --timeout=3600'
The credential helper only works when you clone an HTTPS repo URL. If you use the SSH repo URL instead, SSH keys are used for authentication.
Aliases
Bare repo
To convert repo to bare repo; [13]
mv repo/.git repo.git git --git-dir=repo.git config core.bare true rm -rf repo
Commands
See Vim#Git
Clone
git clone git://github.com/SomeUser/SomeRepo.git # clone read-only repo git clone git@github.com:UserName/OtherRepo.git # clone with SSH key git clone https://github.com/UserName/OtherRepo # clone with github username git clone --reference git git://github.com/git/git git2 # clone local
Repo config
- git config receive.denyCurrentBranch warn - allow pushing to a non-base repo
git repo-config core.sharedRepository true - allow access by multiple users
Status
git status # show repo status
git status -uno # show status without untracked file list
Describe
git describe # last tag plus number of releases from that tag plus abbreviated sha git describe --abbrev=0 --tags # gets tag from current branch
Listing
git ls-files --modified
git ls-tree -r HEAD --name-only
Diff
See also Vim#Git
git diff # diff uncommitted changes
git diff --cached # diff changes in the staging area
git diff master <branch> # show difference between master and another branch
git diff shaOfCheckIn # show diff between sha and current
git show shaOfCheckIn # show diff of sha from previous # or git diff shaOfCheckIn^ shaOfCheckIn git diff shaOfCheckIn{^,}
git diff <revision_1>:<file_1> <revision_2>:<file_2> # diff between two files
git diff --dirstat=files --no-index dir1/ dir2/ # diff between any two directory contents
- https://github.com/dandavison/delta - A viewer for git and diff output
Patches
git diff > change.patch # create a patch git diff > [description]-[issue-number]-[comment-number].patch # create a Drupal patch git apply -v <patch> # apply patch. also; curl https://github.com/github/jobs/pull/25.patch | git am
Adding files
git add . # add file to Index (staging)
git add * # add all (except those in .gitignore) files to Index
git add -i # interactive shell
git add -p # add hunks seperatly ### commonly used commands y - stage this hunk n - do not stage this hunk a - stage this and all the remaining hunks in the file d - do not stage this hunk nor any of the remaining hunks in the file ### more advanced commands g - select a hunk to go to / - search for a hunk matching the given regex j - leave this hunk undecided, see next undecided hunk J - leave this hunk undecided, see next hunk k - leave this hunk undecided, see previous undecided hunk K - leave this hunk undecided, see previous hunk s - split the current hunk into smaller hunks e - manually edit the current hunk ? - print help
- git add -p: The most powerful git feature you’re not using yet - John Kary - with videos
- Gist: Lightning Talk: Git add -p
git ls-files --modified | xargs git add # list modified (not untracked) and add [14]
Committing
- Spend effort on your Git commits - Version control systems like Git are widely appreciated for their ability to provide a centralised location for source code, for helping people work together on the same code base, and for allowing you to scrap the crap you just wrote and get your code back to the state it was in before you started your misguided refactoring.However, there's one thing it can do for you that is overlooked too often: help you document your code. In fact, it can prove to be at least as useful as comments.
Committing moves files from Index into HEAD.
git commit -m Commit message goes here.
git commit -a git adds at the same time
git commit --amend without file change, alter last commit msg
git commit --verbose # or -v, add diff to commit message comments (not the commit message)
git commit --allow-empty -m 'Empty commit so I can open a PR'
git commit -eF .git/filename
- Ryan Castellucci on Twitter: "Okay, I managed to encode my avatar with terminal escape sequences and unicode block characters and put it in the author email field. git clone https://t.co/TWHTRMkely /tmp/a256c3c cd /tmp/a256c3c git --no-pager log -s --format="%ae" https://t.co/jG7RNBgv3o" / Twitter [15]
Remotes
git remote -v # list all remotes
git remote add origin <server> git remote show origin
git remote set-url origin git://github.com/chief/global.git git remote set-url --push origin git@github.com:User/forked.git git remote set-url --push origin DISABLE
git branch --set-upstream master origin/master # branch master set up to track remote branch master from origin.
Sending/receiving
git fetch [origin] [master] get files from origin master remote git pull [origin] [master] fetch from and merge with another repository or a local branch git push otherrepo <branch> stick branch on otherrepo remote
Reset
git reset --hard HEAD reset any uncommitted changes in Index git reset --hard origin/master reset from remote master
Rebase
Branches
git branch # list branches with current starred git branch -a # list branches (including remote) git branch <branch> # create branch git branch -d <branch> # delete branch
Staging
git checkout <branch> # switch to working on <branch> git checkout -b <branch> # same as "git branch <branch> | git checkout <branch>" git checkout - # check out previous branch git checkout HEAD@{1} # checkout next commit on current branch git checkout HEAD~ # checkout previous commit on current branch
git checkout -- <file> # checkout file from HEAD git checkout SHA <file> # checkout file from the point of a certain commit
Merging
git merge <branch> merge branch, keep branch in commit log
cd path/to/project-b git remote add project-a path/to/project-a git fetch project-a git merge project-a/master # or whichever branch you want to merge git remote remove project-a [17]
git rebase <branch> - fast-forward merge current to <branch> (?)
- The Biggest and Weirdest Commits in Linux Kernel Git History - "It's pulled, and it's fine, but there's clearly a balance between "octopus merges are fine" and "Christ, that's not an octopus, that's a Cthulhu merge". [18]
Stash
Log
git log list commits with message and sha git log . log for current directory git log --since="today" git log --since="6am" git log -p show diffs git log -p -2 show second two last diffs
lol = log --graph --decorate --pretty=oneline --abbrev-commit
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
Bisect
Merging
git mergetool git mergetool -t opendiff
Meld GUI is worth checking.
Fugitive
:ls list window numbers
[c jump to previous changeset ]c jump to next changeset
:diffget [window] get change from active window to working
:diffupdate redraw diff highlighting
- Vimcasts.org: a complement to command line git
- Vimcasts.org: resolving merge conflicts with vimdiff
Tags
git tag list repo tags
tags point to a sha. use git checkout [tag] to change to the commit.
git tag v1.3 # add a tag git tag -a v1.4 -m "my version 1.4" # add an annotated tag with message
git push origin --tags # push changed tags
Submodules
git submodule add git@mygithost:project [--branch x.y] [directory/path] # add submodule and checkout specific branch
git submodule init git submodule update
or
git submodule update --init # bootstrap submodules listed in .gitmodules after cloning somewhere
git submodule foreach git pull origin master # update all submodules
git submodule deinit directory/path # disable a submodule
git rm --cached path/to/submodule # remove a submodule
- Drupal Deployment with Git Submodules
- Use Git submodules to avoid storing Drupal core and contrib modules in your site's repository
- Git Submodules: Adding, Using, Removing, Updating
Subtrees
git-subtrac
- https://github.com/apenwarr/git-subtrac - Keep the content for your git submodules all in one place: the parent repo.
.gitignore
- man gitignore - Specifies intentionally untracked files to ignore
- https://github.com/github/gitignore - A Collection of Useful .gitignore Templates
Example to exclude everything except a specific directory foo/bar (note the /* - without the slash, the wildcard would also exclude everything within foo/bar):
$ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar
* !.gitignore !sxhkd/sxhkdrc !bspwm/* !compton.conf !gtk-2.0/gtkrc-2.0 !/myrepos
Archive to tar
git archive [20] default output is tar git archive master | tar -x -C /somewhere/else pipe to extraction git archive --format=tar --remote=git@server:repo.git master | tar -xf -
also, Legit.
Bundle
- https://git-scm.com/docs/git-bundle - provides support for git fetch and git pull to operate by packaging objects and references in an archive at the originating machine, then importing those into another repository using git fetch and git pull after moving the archive by some means (e.g., by sneakernet). As no direct connection between the repositories exists, the user must specify a basis for the bundle that is held by the destination repository: the bundle assumes that all objects in the basis are already in the destination repository.
Filter branch
Plumbing
Attributes
- https://github.com/topics/gitattributes-templates - A collection of useful .gitattributes templates
CLI tools
Zsh prompt symbols
Status: ✔: repository clean ●n: there are n staged files ✖n: there are n unmerged files ✚n: there are n changed but unstaged files …: there are some untracked files Branch: ↑n: ahead of remote by n commits ↓n: behind remote by n commits ↓m↑n: branches diverged, other by m commits, yours by n commits :: hash, not a branch
Ncurses
tig
gita
- https://github.com/nosarthur/gita - a command-line tool to manage multiple git reposThis tool does two thingsdisplay the status of multiple git repos such as branch, modification, commit message side by sidedelegate git commands/aliases from any working directory
to sort
- https://github.com/icefox/git-achievements - records all of the achievements you acquire while using Git. There are over 40 achievements, most with different levels to be achieved. After a git command is executed if a new achievement is unlocked git-achievements will display a message on the console for your enjoyment:
- https://github.com/abhshkdz/graf - Graf is a simple git log analyzer gem.
- https://github.com/holygeek/git-number - Use numbers for dealing with files in git
- https://github.com/kamranahmedse/git-standup - Recall what you did on the last working day. Psst! or be nosy and find what someone else in your team did ;-)
- https://github.com/Kentzo/git-archive-all - Archive a repository with all its submodules.
BFG Repo-Cleaner
- BFG Repo-Cleaner - Removes large or troublesome blobs like git-filter-branch does, but faster. And written in Scala
Clients
- https://live.gnome.org/giggle - viewer
- https://github.com/jesseduffield/lazygit - A simple terminal UI for git commands, written in Go with the gocui library.Are YOU tired of typing every git command directly into the terminal, but you're too stubborn to use Sourcetree because you'll never forgive Atlassian for making Jira? This is the app for you!
- https://github.com/extrawurst/gitui - Blazing boom fast terminal-ui for git written in rust crab
Handy
- https://github.com/aanand/git-up - fetch and rebase all locally-tracked remote branches
- https://github.com/ndbroadbent/scm_breeze - a set of shell scripts (for bash and zsh) that enhance your interaction with git. It integrates with your shell to give you numbered file shortcuts, a repository index with tab completion, and many other useful features. [22]
- https://github.com/nickistre/git-export - Export the contents of the current git index to the given destination, ready to rock.
- https://github.com/chrishunt/git-pissed - tracks any number of words across your entire git history. The defaults are wildly offensive and inspired by Vidar Holen's Linux Kernel Swear Counts.
- https://github.com/donnemartin/gitsome - A Supercharged Git/Shell Autocompleter with GitHub Integration. [24]
- https://github.com/bigH/git-fuzzy - interactive git with the help of fzf
- https://github.com/wfxr/forgit - Utility tool for using git interactively. Powered by junegunn/fzf.
Large files
git-annex
GitMedia
LFS
Repository management
Articles
Git used for private repo, with Gitweb for easy overview.
- https://moocode.com/posts/6-code-your-own-multi-user-private-git-server-in-5-minutes
- http://computercamp.cdwilson.us/git-gitolite-git-daemon-gitweb-setup-on-ubunt
- http://tjworld.net/wiki/Howto/GitPublicRepositoryInstallAndConfigure
git-daemon
- http://git-scm.com/book/en/Git-on-the-Server-Git-Daemon
- http://hype-free.blogspot.co.uk/2011/06/setting-up-git-daemon-under-ubuntu.html
- http://granjow.net/git-read-access.html
- https://srctwig.com/2012/08/16/gitdaemon-troubleshooting/
Gitolite
- create git user
- ~/.ssh/authorized_keys is empty or non-existent
- put pub key in $HOME/YourName.pub
git clone git://github.com/sitaramc/gitolite mkdir -p $HOME/bin gitolite/install -to $HOME/bin gitolite setup -pk YourName.pub
gitolite-admin is only accessible with the public key named after the git account used for the gitolite
- Public read access for git repositories
- git + gitolite + git-daemon + gitweb setup on Ubuntu 11.10 server
GitLab
- GitLab is a free project and repository management application
recommends 1Gb ram!
gerrit
RhodeCode
GitBucket
Gitblit
Gogs
Gitea
- Gitea - a community managed fork of Gogs, lightweight code hosting solution written in Go and published under the MIT license.
Stagit
- Stagit - a static page generator for git. It is similar in functionality to cgit.
GitGrep
- https://perlcodesample.sakura.ne.jp/gitprep/gitprep.cgi/kimoto/gitprep - portable Github system. You can install portable GitHub system into your own Unix/Linux server.
Pagure
- Pagure - git-centered forge, python based using pygit2.
Apache Allura
- Apache Allura - an open source implementation of a software forge, a web site that manages source code repositories, bug reports, discussions, wiki pages, blogs, and more for any number of individual projects. Read about all of Allura's features or compare features to other OSS forge software.
Services
GitHub
Tools
- github-cli - command-line interface to GitHub's Issues API (v2)
- hub - a command-line wrapper for git that makes you better at GitHub.
- https://github.com/shama/willitmerge - A command line tool to check if pull requests are mergeable.
Gist
- https://github.com/defunkt/gist - gists from the commandline
- https://github.com/ConradIrwin/jist - active fork of above with oauth
Related
- GitTorrent - a peer-to-peer network of Git repositories being shared over BitTorrent. You can read more about the project at this blog post. The design of GitTorrent has five components: A "git transport helper" that knows how to download and unpack git objects, and can be used by Git itself to perform a fetch/clone/push. A distributed hash table that advertises which git commits a node is willing to serve. A BitTorrent protocol extension that negotiates sending a packfile with needed objects to a peer. A key/value store on the distributed hash table, used as a "user profile" describing a user's repositories and their latest git hashes. A method for registering friendly usernames on Bitcoin's blockchain, so that a written username can be used to find a user instead of an ugly hex string.
- http://prose.io/ - static site management
- http://gitfm.com - find interesting projects
- Ost.io ("open-source talks") is a forum for open-source projects and the best place for discussing project stuff with other users. It is tightly integrated with GitHub.
- https://github.com/FriendCode/gitrap - forum system
Bitbucket
- https://bitbucket.org - free private repos
N.b. https clone url includes username@, which will require password. remove this for straight-through access.
curl -k -X POST --user user:pass "https://api.bitbucket.org/1.0/repositories" -d "name=project_name"
https://<user>:<pass>@bitbucket.org/<user>/<project>.git
Other
to sort
- https://bitbucket.org/oridb/git9 - implements a git client for plan 9. [33]
Plumbing