submodules

Fedora 26: install git-all

git submodule update --init

Other VC

Mercurial

Clone a project and push changes

$ hg clone https://www.mercurial-scm.org/repo/hello
$ cd hello
$ (edit files)
$ hg add (new files)
$ hg commit -m 'My changes'
$ hg push

Create a project and commit

$ hg init (project-directory)
$ cd (project-directory)
$ (add some files)
$ hg add
$ hg commit -m 'Initial commit'

To modify remote URLs, edit file .hg/hgrc

[paths]
default = ssh://hg@bitbucket.org/bowerth/michel-orgmode
default:pushurl = ssh://hg@bitbucket.org/bowerth/michel-orgmode
upstream = ssh://hg@bitbucket.org/edgimar/michel-orgmode
Get help on setting paths
$ hg help config.paths"

Commit message code

[=|+|!] [core|viewable|akka|docs|all]: <Actual message>.

  • =` means there are no API changes
  • + means added funtionality
  • ! means breaking changes (source or binary)

Platforms

Github

get user email address
https://api.github.com/users/[username]/events/public

Git workflow

git file workflow

%} +———+ +———–+ +————+ +———-+ +——–+ | | | | | | | | | | | Ignored | | Untracked | | Unmodified | | Modified | | Staged | | | | | | | | | | | | | ignore | | add | | edit | | add | | | <———-+-+ +-+——-> +-+——–> +-+——-> | | | | | | | | | | | | | | | | | | | | | | | | | rm | | | commit | | | | | | <——-+-+ <————————-+-+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +———+ +———–+ +————+ +———-+ +——–+ %}

GUI

http://sourceforge.net/projects/gitextensions/

Setup Git

account
http://github.com/cis-itn-oecd/
alternative: bitbucket.com
git config --global http.proxy wsg-proxy.oecd.org:80
git config --global https.proxy wsg-proxy.oecd.org:80
git config --global http.sslverify false
attribution for commited content
git config --global user.name "bowerth"
git config --global user.email "bo.werth@gmail.com"
add colors to git console
git config --global color.ui auto
increase Git’s HTTP buffer
git config --global http.postBuffer 2M
ssh key pair for authenticating
ssh-keygen -t rsa -C "bo.werth@gmail.com"
-C: comment for reference
will be generated in ~/
id_rsa: private part of the key (secret)
id_rsa.pub: public part of the key (share)
start ssh-agent
$ eval "$(ssh-agent -s)"
add keypair to ssh-agent
$ ssh-add for keys in standard location /home/xps13/.ssh/id_rsa
enter passphrase
version of git
git --version
create new repo
git init [reponame]
create new file
touch [filename]
status of repo
git status
add to staging area
git add [filename]
add untracked files, e.g. after renaming
git add . -A
add and commit together (only for tracked files)
git commit -a -m'[message]'
push repo to remote, e.g. github
create repo on github
git remote add origin git@github.com:bowerth/sdmxBrowser.git
git push -u origin master
undo push
git reset cc4b63b
git stash
git push -f origin alpha-0.3.0
git stash pop
change remote URI
git remote set-url origin https://github.com/bowerth/stanApi.git
nuke last commit and never see it again
git reset --hard HEAD~1
set file back to untracked state
git rm [filename]
ignore files permanently
touch .gitignore
edit contents:
*.log ignore file extension in root folder
**/*.log ignore file extension in all subfolders
target ignore folder
*.*~ ignore Emacs backup files
finally, git add .gitignore
view repo file tree
tree

Cloning Repositories

supported cloning protocols
  • http: git clone http://server/user/project.git no authentication
  • https: git clone https://user@server/user/project.git can be made to work with firewall
  • ssh: git clone git://server/user/project.git running on port 9418
  • file: git clone file:///myrepos/project or git clone /myrepos/project. Convenient way to manage different versions of large repo
clone with different name
git clone [repo] [alias name]

Command Composition, Storage, Log

show recent commits
git log
quit log view
q
show last 3 commits
git log HEAD^^^..HEAD
show last 3 commits with details (patch)
git log HEAD^^^..HEAD -p
show specific previous commits with details (patch)
git log HEAD~6..HEAD~4 -p
show recent commits in compressed view
git log --pretty=oneline
show commits around specific hash
git log [hash]
show two commits before specific hash
git log [hash]^^..[hash]
show n commits before specific hash
git log [hash]~[n]..[hash]
show details for last commit
git show
rewrite the most recent commit message
git commit --amend

Branching

when to branch
  • short lived
  • feature
  • release
list remote branches
git branch -a
switch branches
git checkout [branch] will automatically track remote branch origin [branch]
fetch remote branch
git fetch
remove branch after changing to other branch
git branch -d [branch]
remove remote branch
git push origin --delete [branch]
integrate pulled changes
git rebase
update local remote-tracking branches
git remote prune origin

Merging

open files with merge conflict in sublime
git diff --name-only | uniq | xargs sublime_text
accept own or foreign changes globally
git merge --strategy-option theirs
file-based accept own or foreign changes
git checkout --theirs path/to/the/conflicted_file
Source
McCullough and Berglund on Matering Git, O’Reilly
matthewmccullough
github-cheat-sheet

Resetting

Reset the staging area and the working directory to match the most recent commit
git reset --hard

In addition to unstaging changes, the –hard flag tells Git to overwrite all changes in the working directory, too. Put another way: this obliterates all uncommitted changes, so make sure you really want to throw away your local developments before using it.

Submodules

add submodule
git submodule add https://github.com/bowerth/nsoApiBrowser.git inst/nsoApiBrowser
  • to change submodule remote URL, modify .gitmodules file and run git submodule sync

Maintenance

BFG repo cleaner

usage
$ java -jar /home/xps13/Dropbox/Programming/Scala/bfg-1.12.6.jar --strip-blobs-bigger-than 100M ./.git

Other resources



Published

25 February 2015

Category

technical