Git
Local
Install Git
# install
sudo apt-get install git
# important config
# --global means it's working for current user (~/.gitconfig)
# without --global means for current repository (.git/config)
git config --global user.name "myname"
git config --global user.email "myemail"
# other config
git conifg --global color.ui true
git config --global alias alias_name raw_name
Basic Skills
# make directory
mkdir dir
cd dir
# initialize git repository
git init
# add files which ready to commit
git add file1
git add file2
# even the file3 is in .gitignore
git add -f file3
...
# delete files
rm file1
git rm file1
# introduce later, recovery file1
# git checkout -- file1
# commit changes
git commit -m "msg"
# branches
# create branch
git branch bra1
# switch to new branch ${bra1}
git checkout bra1
# create and switch
git checkout -b bra1
# merge branches
# merge specified branch with current branch
git merge bra1
git merge --no-ff -m "msg" bra1
# delete branch
git branch -d bra1
git branch -D feature-name
# stash
git stash
# recovery
git stash apply
git stash apply stash@{num}
# drop
git stash drop
# recovery and drop
git stash pop
# generate .gitignore and put the files or directories which you don't want track to it.
Check
# difference
git diff file1
git diff HEAD -- readme.txt
# add and commit status
git status
# log
# first commit to current commit
git log
git log --pretty=oneline
git log --graph --pretty=oneline --abbrev-commit
git log -1
# all commit
git reflog
# check status of current branches
git branch
git branch -a
git branch -vv
# check stash
git stash list
# check remote repository
git remote
git remote -v
# check .gitignore
# find the rule why file3 has been ignored
git check-ignore -v file3
Time Travel
# commitid fineness
git reset --hard HEAD^
git reset --hard HEAD^^
git reset --hard HEAD~100
git reset --hard commitid
# variant fineness
# file will change: discard changes after git add
# file will change: discard changes after git commit
git checkout -- file1
# variant fineness
# file don't change: discard git add
git reset HEAD file1
Remote
Link
# use ssh to communicate
# generate id_rsa and id_rsa.pub in ~/.ssh/
ssh-keygen -t rsa -C "myeami"
# add id_rsa.pub to SSH KEYS of remote servers
# remote server: GitHub, gitoschina etc.
Basic Skills
# fetch remote repository information
git fetch
# merge local branch with remote branch
git merge
git merge origin/remote_branch_name
git merge @{upstream}
git merge @{u}
# fetch and merge
git pull
# create remote branch the first time
# push local branch to the remote branch
git push origin remote_branch_name
# push specified local tag to the remote server
git push origin local_tag_name
# push all local tag (which havn't been pushed) to the remote server
git push origin --tags
# make tag (the name of commitid)
git tag tag_name
git tag tag_name commitid
git tag -a tag_name -m "msg" commitid
# use -s (instead of -a) to generate PGP signature, gpg has been needed.
git tag -s tag_name -m "msg" commitid
# delete local tag
git tag -d v0.1
# delete remote tag
# delete local tag first
git push origin :refs/tags/tag_name
Check
# show all tag names
git tag
# show one specific tag information
git show tag_name
Sync
# both local and remote repository already exists
# create new repository on remote server
# associate local repository with remote repository
# Git remote repository name: origin (default name)
git remote add origin remote.git.address
# push current branch (default master) to remote branch
# -u : used at the first time to associate local master branch with remote master branch.
git push -u origin master
git push origin master
git push origin remote_branch_name
Clone
# local repository doesn't exists
# clone repository from remote server
# create local directory itself
# can only see master branch
git clone remote.git.address
# get other branch
# create new remote branch
git push origin remote_branch_name
# create local branch and link it to remote branch
git branch local_branch_name
git branch -u origin/remote_branch_name
git branch --set-upstream local_branch_name origin/remote_branch_name
# remote branch already exists
git checkout -b other_branch origin/other_branch
Usage
- master: only do release
- dev: everyone commit to dev, dev commit to master.
- feature-name: new feature, experiment.
- bug:
- everyone:
GitHub
- Fork other people's project
- clone from self-repository on GitHub
- pull request on self-repository of GitHub, waiting for raw project manager to accept.
Git server
install:
sudo apt-get install git
add user:
sudo adduser git
certificate: collect id_rsa.pub and put them into file
/home/git/.ssh/authorized_keys
init git repository: do
sudo git init --bare repository_name.git
under /dirname/. (No working directory in it, because it's just for share, no one should login this server and change it.)change owner:
sudo chown -R git:git repository_name.git
forbiden shell: change /etc/passwd, change
git:x:1001:1001:,,,:/home/git:bin/bash
intogit:x:1001:1001:,,,:/home/git:/user/bin/git-shell
.
(then we can use git by ssh, but we can't use shell.)clone:
git clone git@server:/dirname/repository_name.git
push etc.
Gitosis to manage id_rsa.pub
Gitolite to manage privilege