Working with GIT

# http://marklodato.github.io/visual-git-guide/index-en.html -> best visual guide
# http://onlywei.github.io/explain-git-with-d3/#checkout -> best interactive guide
# http://rogerdudler.github.io/git-guide/ -> graphical clients listed
# http://nvie.com/posts/a-successful-git-branching-model/
# https://github.com/nvie/gitflow
# http://think-like-a-git.net/sections/rebase-from-the-ground-up/cherry-picking-explained.html
# https://www.atlassian.com/git/tutorials/learn-git-with-bitbucket-cloud

# 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

# 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 2>/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 branch
git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/foo
  remotes/origin/master
git branch --track foo remotes/origin/foo
git checkout foo
or in 1 step
git checkout --track -b foo remotes/origin/foo

Make an existing Git branch track a remote branch
When current branch is foo:
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 remotes
git remote -v
deleting the remote
git remote rm remote_name_from_showed_above

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.