Git: Some examples

Hi,

my git example collection…to be continued
Global Config
Set your username

git config --global user.name "Michael"

Your E-Mail Address

git config --global user.email info@michlstechblog.info

Your favorite Editor on Windows

git config --global core.editor "'D:/Tools/Notepad++/notepad++.exe -nosession -multiInst'"

and on UNIX

git config --global core.editor vi

Disable automatic Linefeed conversation

git config --global core.autocrlf false

Convert lineending while cloning

git config --global core.eol lf
git config --global core.autocrlf input

Set the default UI encoding

git config --global gui.encoding utf-8

View config

git config
git config --list
git config user.name

Mergetool

git config --global merge.tool xxdiff
git config --global merge.tool kdiff3
git config --global merge.tool meld

Mergetool on Windows

git config --global merge.tool winmerge
git config --global winmerge.cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"

Configure a proxy server

git config --global http.proxy http://192.168.233.13:8080
git config --global https.proxy http://192.168.233.13:8080

Colored UI

git config --global color.ui true

Aliases

git config --global alias.co checkout
git config --global alias.unstage 'reset HEAD --'

To get some debug information. Set the following environment variables

GIT_CURL_VERBOSE=1
GIT_TRACE=1
GIT_TRACE_PACKET=1

Note: HEAD => Pointer to your current branch/commit. The branch points to the last commit

Project based
Creates a new git repository in the current working folder

git init

Clone an existing project

git clone https://github.com/knxd/knxd

Just clone a repository (not checkout a working copy, just the latest commit) and get one file as working copy

git clone -n git://path/repository.git --depth 1 clonerepo
cd clonerepo
git checkout HEAD FileToGet

Clone a specific tag or branch

git clone --depth 1 --branch MyBranch https://github.com/knxd/knxd

Pushing local changes to origin in branch master

git push origin master

Pushing all branches

git push origin --all

Push local branch v1.0.0.0 as remote branch v1.0.0.0

git push origin v1.0.0.0:v1.0.0.0

Refresh remote branch and create a new branch

git fetch origin
git checkout -b newBranchFromMaster origin/master

Checkout a pull request. For example Pull with ID 666. Fetch the pull request into a new branch

git fetch origin pull/666/head:myPullrequestBranch
git checkout myPullrequestBranch

Some error message that often occurs while pushing your changes up to github:
By using git protokoll

fatal: remote error:
You can't push to git://github.com/user_name/project.git

or by https protocol

remote: Permission to user_name/project denied to GitUser.
fatal: unable to access 'https://github.com/user_name/project/': The requested URL returned error: 403

Pushing works only over ssh. git@github.com/user_name/project. The Username must be set to git otherwise you get an Permission denied (publickey) error.

Remote Repositories
To which remote server is the project configured

git remote -v
origin https://github.com/Race666/install-knxd.git

Add an additional remote repository

git remote add fork https://github.com/Race667/install-knxd-fork.git

Set/overwrite the url, maybe change from git:// to https://

git remote get-url origin
git://github.com/user_name/project
git remote set-url origin git@github.com/user_name/project

get remote repository to fork/master and other branches fork/branch1 …. No merge is done at this time

git fetch fork

Show remote repository

git remote show origin
git remote show fork

Rename the my local remote repository name

git remote rename fork forkNewName

Remove the remote repository

git remote rm forkNewName


git pull

Covert a repository in a bare repository. A bare repository does not held a working copy of your project

git config --bool core.bare true

Refresh your working copy from repository

git reset --hard

Clean up your working copy

git clean -d -x -f

Add all files to a respositories staging area (INDEX)

git add --all

Add an specific file to staging

git add test/test.txt

Undo a add changes in staging area

git reset HEAD test/test.txt

Also reset the file to the latest commited version

git checkout -- test/test.txt

Unstage all

git reset HEAD

And reset working directory

git checkout -- *

Show difference between repositories staging area and working tree(uncommited changes)

Remove a file from staging (INDEX), the file would also deleted from working directory

git rm test/test.txt

Just remove a file from staging area but leave the file in the working directory. Maybe you have forgotten to add the file to .gitignore

git rm test/test.txt --cached

Rename a file

git rm test/test.txt test/testmoved.txt

git diff

Show differences from INDEX which are to commit

git diff --cached
# or
git diff --staged

Commit changes

git commit -m "Changes done. v1.4.0.0"

Stage and Commit changes (git add && git commit)

git commit -am "Changes done. v1.4.0.0"

Commit from outside the working directory

git --git-dir=/home/michael/docs/.git/ --work-tree=/home/michael/docs/ commit -am "Changes commited"

Changes the last commit, may be you forgotten to add a file or want to edit the commit message

git commit --amend

Same as above but read commit message from a file

git commit --amend -F ./mynew_commit_message.txt

Delete last commit(s) (its not really a delete, it’s just set the head to a specific commit), determine commit to set

git log

and set HEAD to the commit. –soft leaves the working tree untouched so you can stage and commit your changes again.

git reset --soft e6ee3dba38b0b771668dfbc229c4295428566c63

If you want to push such a change, you must force the push(i.e. if you want to delete at github)

git push origin +master

List commits

git log --pretty=oneline

Show log from outside the working directory

git --git-dir=/home/michael/docs/.git/ --work-tree=/home/michael/docs/ log

List last 3 commits and changes/patch -p

git log -3 -p

Word diff , makes no sense for source code

git log -3 -p --word-diff

Formated log output examples, –graph shows a simple branch/merge history

git log -3 --pretty=[online|short|full|fuller]
git log -3 --pretty=format:"%h - %an, %ar : %s"
git log -3 --pretty=format:"%h - %an, %ar : %s" --graph
# Newer then
git log -3 --since "2017-05-22"
git log -3 --after "2017-05-22"
# Older then
git log -3 --until"2017-05-22"
git log -3 --before "2017-05-22"
# From a committer
git log --committer Michael
# From a Author
git log --author Michael

 
Get the short id of the last commit

git rev-parse --short HEAD

Go to/undo last commit and loose all changes, delete last commit

git reset --hard HEAD~1

or get commit id and reset working directory to this

To push the commit deletion to github you have to force pull with a + sign in front of your branch name

git push origin +master

git log
git reset --hard 7f1393782c1daeb008378e10090aa9a51d64082d

Go to a specific commit

git reset --hard f9a0864228b7c93e2974907c6439761f3d5acda7

List files in index. Its the virtual state of an repository, and does not match the files in the working copy

git ls-files --stage

Finding a file in a repository

git ls-files --stage | grep -i Filename

Create a tag

git tag -a v1.4.0.0 -m v1.4.0.0

If you are owner of a gpg key. Sign a tag

git tag -s v1.4.0.0 -m v1.4.0.0

Check signing of a tag

git tag -v v1.4.0.0

Tag a commit

git tag -a v1.0.0.0 -m v1.0.0.0 f9a08648

Show the commit for a specific tag

git rev-list -n 1 v1.0.0.0

Publish a tag, not done by default

git push origin v1.0.0.0

Or publish all tags

git push origin --tags

Delete a tag

git tag -d v0.7.7

And push the delete tag (i.e. to github)

git push origin +master :v0.7.7

Checkout a version from a specific date
# ToTest: git checkout ‘master@{2009-07-27 13:37:00}’

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Checkout a tag

git checkout tags/v0.12.12

List details of a tag

git show --name-only v4.11

Checkout latest

git checkout master

Get last commits from origin

git pull

List all branches

git branch -a

List branch with its last commit

git branch -v

Create a branch

git branch MyDevBranch21

Checkout a branch

git checkout MyDevBranch21

Create branch from commit

git branch newbranch 3af8c781d89a34a76f7435648676744673d78e0c5c230

Delete a branch on github

git push -d origin merge

Merge the branch

git checkout master
git merge MyDevBranch21

List merged branches

git branch --merged

List branches not merged

git branch --no-merged

On Merge conflicts edit the unmerged file, edit the marked section. <<<<< => current branch, ===== => spliter, >>>>>> end branch to merge

<<<<<<< HEAD include <stdio.c> ======= include <stdio.h> >>>>>>> mydevbranch

and add the changed file to stage.
or start mergetool

git mergetool

Stash dirty (not commited) changes of your working directory (by default untracked and ignored files are not stashed)

git stash

Reapply stashed changes

git stash pop

Reapply stashed changes and keep stash

git stash apply

List all stashes

git stash list

Apply stash from list

git stash pop stash@{2}

If you have a detached HEAD, this occures when you checkout a commit, then you makes changes in this commit and went back to master the changes seems lost. To get it back see the ref log for your lost commit

git reflog --all
ec51ec1 HEAD@{0}: checkout: moving from 88d682c130e8556fa80f4a42a428ee66070751a2 to master
88d682c HEAD@{1}: commit: midcommit2

or

git log -g
--pretty=oneline
ec51ec1050c381c90fb5b82dccebb27772444d01 HEAD@{0}: checkout: moving from 88d682c130e8556fa80f4a42a428ee66070751a2 to master
88d682c130e8556fa80f4a42a428ee66070751a2 HEAD@{1}: commit: midcommit2

and merge the detached commit/head “commit: midcommit2” => HEAD@{1}

git merge HEAD@{1}

or with the hash, this makes it unique because HEAD@{x} changes each time you make a checkout,reset, merge or commit…

git merge 88d682c130e8556fa80f4a42a428ee66070751a2

Change E-Mail and Author of a commit => You have to rebase the commit

git rebase -i midcommit2

Change the date of an old commit. Rebase the commit interactive. This oens a text editor

git rebase -i 0224b7acfa9cafe30251efc13ec59244d2f1b488^

Replace pick with edit and save the changes

edit 0224b7a Some commit description

Change the date

GIT_COMMITTER_DATE="Thu Sep 25 23:55:32 2019 +0200" git commit --amend --no-edit --date "Thu Sep 25 23:55:32 2019 +0200"

and save it

git rebase --continue

Your text editor opens and you have to set all commits to change to edit

e b136cc3 Clone commit
e a38ac0e Last commit
e d0a1dc8 detached
# Rebase f737209..

After saving and closing the editor, take changes and go to next commit(s)

git commit --amend --author "The Newname <email@newdomain.org>" --no-edit
git rebase --continue

Exclusions
Create a .gitignore file in the repository root. # are comments. Example Filepatterns:

*.exe*
*.log
*.rl
log.txt
old*/**
*.opt-????????*
*.lic-????????*

Add just specific file type to a git repository. Create Create a .gitignore file in the repository root

# ignore everything
*
# Add directories
!*/
# And add file types you want
!*.one
!*.two
!*.etc

List all commits of a file

git log --follow yourFilename

List details of a commit

git show 8af8c781d89a34a76f70049b7734673d78e0c5c230

and with changed files

git show --summary 8af8c781d89a34a76f70049b7734673d78e0c5c230

Find when a file was added

git log --diff-filter=A -- yourPath/yourFilename

Difference between 2 commits

git diff 3af8c781d89a34a76f7435648676744673d78e0c5c230 8af8c781d89a34a76f70049b7734673d78e0c5c230

Sync your forked project from the master you forked from

# Clone my repository
git clone https://github.com/myGitHubUser/knxd.git knxd
cd knxd
# The repository you forked from
git remote add upstream https://github.com/knxd/knxd.git
git fetch upstream
git pull
git push origin +master

If a merge conflict occures (error: Merging is not possible because you have unmerged files…fatal: Exiting because of an unresolved conflict. )abort merging before git pull

git merge --abort
git pull
....

Optimize a repository and delete unneeded files

git gc --auto

Run Health check and check objects in database

git fsck

Michael

Leave a Reply