A Visual Git Reference Understand some basic git concepts visually A successful Git branching model Cherry-picking explained Learn Git with Bitbucket Cloud Squash your latests commits into one
# show diff for last commit only git log -p HEAD -1 git log -p -n 1 git log -p HEAD~1..HEAD # --graph draw a text based graph of the commits on the left hand side of the commit messages # --decorate adds the names of branches or tags of the commits that are shown git log --full-history --all --graph --color --oneline --date-order git log --full-history --all --graph --color --date-order --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s" # view changesets even though they are not referenced by any branch or tag git reflog # shows which files were altered and the relative number of lines added or deleted from each of them git log --stat git log --stat -1 git log --stat 57a6586c53bede7334d1be67b40e3c4f9cb63af9 -n 1 gitk --all -> GUI graph (run it from .git parent directory) # shows both remote and local branches git branch -a # shows local branches git branch # shows remote branches git branch -r # restore file test4.txt to match the current HEAD git reset HEAD test4.txt git checkout -- test4.txt # restore multiple deleted files git checkout $(git ls-files -d) # commit directly without first staging git commit -m 'comment' -- README.txt # display the information about the source of the clone: git config --get remote.origin.url git remote -v git remote show origin # git + ssh on port 222 (other than default 22) with ssh user gigi git clone ssh://adrhc222/********/temp/git-try # in ~/.ssh/config (create if not exists) put: Host adrhc222 HostName adrhc.go.ro Port 222 User gigi ServerAliveInterval 30 # view commits on origin only git fetch origin git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/readme-edits git log --full-history --all --graph --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s" master..origin/master git log --full-history --all --graph --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s" origin/readme-edits~1..origin/master # Caching your GitHub password in Git # see https://help.github.com/articles/caching-your-github-password-in-git/ git config --global credential.helper cache git config --global credential.helper 'cache --timeout=3600' git config --global credential.helper 'cache --timeout=31536000' # create a “shared” repository which allows anyone with “group write” permissions on the folder to push into the repository mkdir gitProject.git -> .git it's a good practice for --bare repositories cd gitProject.git git init --bare --shared # see https://git-scm.com/docs/githooks -> post-update cp -v hooks/post-update.sample hooks/post-update # generation of info/refs and objects/info/packs files cd test-bare-repository.git /usr/lib/git-core/git-update-server-info man git-update-server-info cat info/refs cat objects/info/packs # create locally a project then upload to remote: rm -rf .git git init git add . git commit -m "Initial commit" git remote add origin https://adrhc.go.ro/angular2-quickstart.git # -u option determines the creation of the remote branch master git push -u origin master # /etc/gitconfig git config --system --list # global configuration git config --global --list git config --global --edit -> at top you'll see the file's path (e.g. $HOME/.gitconfig) # in a project git config --list # for CRLF see core.autocrlf variable # https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration # http://stackoverflow.com/questions/3206843/how-line-ending-conversions-work-with-git-core-autocrlf-between-different-operat # exists in $HOME/.gitconfig git config --global core.autocrlf input git config --global --get core.autocrlf # workflow example: # https://help.github.com/articles/syncing-a-fork/ git clone https://github.com/adrhc/angular2-webpack-starter.git git checkout master git remote add upstream https://github.com/AngularClass/angular2-webpack-starter.git git remote -v sudo npm install webpack-dev-server rimraf webpack -g npm install git fetch upstream git merge upstream/master # create a lightweight tag for HEAD git tag "tag-name-here" HEAD # list tags git tag -n # list tags for current branch git describe --tags --abbrev=0 # push all tags git push origin --tags # push one tag git push origin "tag-name-here" # get all new tags git fetch --all # checkout tag named n3.2.2 git checkout tags/n3.2.2 # copy/duplicate repository # https://help.github.com/articles/duplicating-a-repository/ git clone --bare https://github.com/exampleuser/old-repository.git cd old-repository.git git push --mirror https://github.com/exampleuser/new-repository.git #ERROR error: Your local changes to the following files would be overwritten by merge: README.txt app.sh build.prod.sh config/webpack.common.js Please, commit your changes or stash them before you can merge. Aborting #SOLUTION git stash git stash pop #ERROR GitCommandFailedException: GitCommandFailedException: Command 'fetch' failed in /ffp/opt/couchpotato (128): fatal: unable to access 'https://github.com/RuudBurger/CouchPotatoServer.git/': SSL certificate problem: unable to get local issuer certificate #SOLUTION #ignore ssl certificate git config --system http.sslverify false -> set in /etc/gitconfig #or use the Mozilla's CA Bundle certificate: wget -nv http://curl.haxx.se/ca/cacert.pem -O /ffp/etc/ssl/cert.pem git config --system http.sslcainfo /ffp/etc/ssl/cert.pem #SOLUTION # export site certificate chain cd $HOME openssl s_client -connect adrhc.go.ro:443 -showcerts /dev/null | openssl x509 -outform PEM > adrhc.go.ro.pem openssl x509 -in adrhc.go.ro.pem -out adrhc.go.ro.crt # install site certificate chain su root root@gigi:~# cat adrhc.go.ro.crt >> /etc/ssl/certs/ca-certificates.crt CTRL+D #SOLUTION /etc/ssl/certs/ca-certificates.crt is the result of "curl-config --ca" sudo bash -c "echo -n | openssl s_client -showcerts -connect 172.17.20.43:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> /etc/ssl/certs/ca-certificates.crt"
Remove last commit from remote repository (e.g. origin) git push origin +HEAD^:master git reset --hard origin/master This only works if the remote repository has the configuration: [receive] denyNonFastForwards = false Use master branch for angular2-websocket library in package.json http://www.devthought.com/2012/02/17/npm-tricks/ https://github.com/afrad/angular2-websocket package.json: "angular2-websocket": "https://github.com/afrad/angular2-websocket.git#8cb292ea25d5306dd516ece4480cf2d3b8263138", "angular2-websocket": "git+https://172.17.20.43/angular2-websocket.git", Install own private repository http://stackoverflow.com/questions/10386310/how-to-install-a-private-npm-module-without-my-own-registry npm install "git+https://172.17.20.43/angular2-websocket.git" --save generates in package.json: "angular2-websocket": "git+https://172.17.20.43/angular2-websocket.git" npm install "git+https://172.17.20.43/angular2-websocket.git#master" --save generates in package.json: "angular2-websocket": "git+https://172.17.20.43/angular2-websocket.git#master" Force update from git when running npm install npm install "git+https://172.17.20.43/angular2-websocket.git#master" --force Fork after already cloning git clone https://github.com/adrhc/h264-live-player git remote -v git remote rm origin git remote add upstream https://github.com/131/h264-live-player.git git remote add origin https://github.com/adrhc/h264-live-player.git git branch --set-upstream-to=origin/master git config core.autocrlf input -> linux only git fetch --all git pull upstream master Checkout a remote branchgit branch -a
* master remotes/origin/HEAD -> origin/master remotes/origin/foo remotes/origin/mastergit branch --track foo remotes/origin/foo git checkout foo
or in 1 stepgit checkout --track -b foo remotes/origin/foo
Make an existing Git branch track a remote branch Just switch the remote for the current branch:git branch -u origin/current-branch
When current branch is foo switch the remote while also pushing:git push -u origin foo
Checkout all remote branches https://stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches git branch -a for b in `git branch -r | grep -v -- '->'`; do echo "${b##origin/}"; done for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done # for already existing branches will fail with no undesirable consequences, e.g.: fatal: A branch named 'master' already exists. Show which remote branch is tracked by which local one git branch -vv git status -sb git status | grep 'Your branch is up-to-date with' Create a local branch then the remote counterpart You'll have to make sure there's no "refactor" branch (but could be refactor/...). git refactor maven-modules -> using https://github.com/tj/git-extras git push -u origin refactor/maven-modules Remove a local branch git branch -d feature/app-init Remove a remote branch git push origin --delete feature/app-init Remove all stale branches git remote prune origin --dry-run -> report what branches will be pruned git fetch -p -> fetches and prunes all origins Find branch first commit or creation date git reflog show --no-abbrev branch-name revert pushed commit after a wrong merge from branch X into master we already are on master after merging the wrong branch ...git revert -m 1 last-commit-id-meaning-the-merge-commit
git stash examples git stash list git stash save '[2017.11.01] before liquibase' git stash show stash@{0} git stash apply how to remove a remote repository showing the remotesgit remote -v
deleting the remotegit remote rm remote_name_from_showed_above
merge current branch into another without leaving the currentgit merge-into target-branch-name