Git: Difference between revisions
m (→Undo mistakes) |
m (→Undo mistakes) |
||
Line 175: | Line 175: | ||
=== move commit from master to branch === | === move commit from master to branch === | ||
<pre class="bash"> | <pre class="bash"> | ||
git commit - | git log # get hash from commit you want to cherry pick | ||
git commit -- | git checkout <branch> | ||
git cherry-pick <hash-of-commit> # add commit to branch | |||
git checkout master # if not pushed to remote, | |||
git log # get hash of previous commit | |||
git reset --soft <hash> # resets commit to previous hash, but will keep changes in staging area | |||
git reset (--mixed) <hash> # resets commit to previous hash, will keep changes only in working dir | |||
git reset --hard <hash> # resets commit to previous hash, will delete changes (untracked files will stay) | |||
git clean -df # deletes untracked files from working dir | |||
</pre> | </pre> | ||
Revision as of 20:25, 5 April 2021
Quick Cheat Sheet |
git config credential.helper store git config user.email "email@example.com" git config user.name "username" git log --graph --oneline git log --stat |
Speed-up
# alias 'acp' = add+commit+push git config --global alias.acp '!f() { git add . && git commit -m "$@" && git push; }; f' git acp "this is my commit comment"
Basics
Create repository
git init # standard git init --bare # bare without working directoryInitial checkout of remote repository
git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git git clone ssh://user@server/srv/git/git-repo.gitGet latest updates from server
git pull # (= git fetch && git merge) git fetch # get updates from remote, safe operation git merge # merges those updates into working dirChange files and commit
- show changed files
git status # show changed files (working dir & staging area) git diff # show changes in working dir git diff --cached # show changes in staging area git diff --cached --name-only git diff --name-status
- add files
git add . git add -A # all
- commit changes
git commit -m "Commit message" git commit -a # includes add git commit -am.
- send changes to server
git push.gitignore files
*.log filename.txt subfolder/*
Staging
<------------------------ checkout --------------------- Working Directory -stage-> Staging Area -commit-> Repository
git add . # add all files to staging area git status # show staged & unstaged(untracked) files git reset # unstage all files
Branches
git branch # list local branches git branch -a # list local & remote branches git branch --merged # list branches that have been merged git branch <new-branch-name> # create new branch
hard reset to specific branch
git fetch --all git reset --hard origin/branchname
switch to branch
git switch <new-branch-name> git commit ... some-stuff git switch master
merge feature branch into master
git checkout master git merge <new-branch-name> (--no-ff) # no fast forward: create merge commit git diff git commit -a
delete branch
git branch -d <branch-name> # local git push origin --delete <branch-name> # remote
Repositories
move repo to new server
git remote -v # show remote location git remote set-url origin <URL to my NEW repo location> # change remote url git push -f origin # push to remote url git remote -v
sparse clone (only specific folder)
mkdir <repo> cd <repo> git init git remote add -f origin <url> git config core.sparseCheckout true echo "some/dir/" >> .git/info/sparse-checkout git pull origin master
Forks
Syncing fork
git clone https://your-fork.git git remote -v # should show your fork git remote add upstream https # adding upstream repo git remote -v # should show your fork as origin and upstream git fetch upstream # get changes from upstream git checkout master (or fork-branch) git merge upstream/master git add . git commit -m "sync with upstream" git push origin master
Undo mistakes
revert file to commited version
git checkout file.txt # file gets replaced by repo version
fix commit message or files
git commit -m "Wrong message" git commit --amend -m "Fixed message" # only do this if you never pushed the wrong commit
move commit from master to branch
git log # get hash from commit you want to cherry pick git checkout <branch> git cherry-pick <hash-of-commit> # add commit to branch git checkout master # if not pushed to remote, git log # get hash of previous commit git reset --soft <hash> # resets commit to previous hash, but will keep changes in staging area git reset (--mixed) <hash> # resets commit to previous hash, will keep changes only in working dir git reset --hard <hash> # resets commit to previous hash, will delete changes (untracked files will stay) git clean -df # deletes untracked files from working dir
Configuration
Show config
git config --list
Store credentials
git config credential.helper store
Set username and email
git config --global user.email "you@example.com" git config --global user.name "Your Name"
Windows - remove old credentials
rundll32.exe keymgr.dll,KRShowKeyMgr
post-receive hook
- execute script on main git server, after receiving push: hooks/post-receive
#!/bin/bash # unset GIT_INDEX_FILE # not needed for post-receive? git --work-tree=/srv/targetfolder --git-dir=/home/demo/proj/.git checkout -f
- or
#!/bin/bash while read oldrev newrev ref do if [[ $ref =~ .*/master$ ]]; then echo "Master ref received. Deploying master branch to production..." git --work-tree=/var/www/html --git-dir=/home/demo/proj checkout -f else echo "Ref $ref successfully received. Doing nothing: only the master branch may be deployed on this server." fi done
- make executable
chmod +x post-receive
Links
- https://ohmygit.org/
- https://nvie.com/posts/a-successful-git-branching-model/
- https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps
- https://gist.github.com/noelboss/3fe13927025b89757f8fb12e9066f2fa
- https://gist.github.com/thomasfr/9691385
Other
Special features
- auto-commit when file changes
inotifywait -q -m -e CLOSE_WRITE --format="git commit -a -m 'autocommit on change' %w" file.txt | sh
- or
while true; do inotifywait -qq -e CLOSE_WRITE ~/.calendar/calendar cd ~/.calendar; git commit -a -m 'autocommit on change' done # inotify "-r" for recursive
- or
- etckeeper or gitwatch