This cookbook is built for quick and easy search for Git commands
Configuration
- SSH reset
ssh-keygen -t rsa -C "youremail@example.com"
# -C: comment
# -t: type
- configure global/local user and email
git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"
- set ssh-key
ssh-keygen -o
- add ssh_pub key
vim ~/.ssh/authorized_keys
- list the content of config file
git config --list
- set the exectuable of files
git config core.filemode false # local
git config --global core.fileMode false # global
- set editor from nano to vim
git config --global core.editor "vim"
or append editor = vim
in core
of config file
Elementary
Three sectors
-
working tree: editing space
-
index file: cache after
add
-
repository: storage after
commit
Basic pipeline
- initialization
git init
- add file contents of working tree to index files
git add <file>
- record changes to the repository
git commit -m "<message>"
- add files to index files and record to the repo
git commit -am "<message>"
- check the status of the repository
git status
- show changes between commits, commit and working tree
# compare the working tree with index files
git diff
# compare the index files with HEAD repo (<commit_id> repo)
git diff --cached <commit_id>
# compare the two repos
git diff <commit_id> <commit_id>
- discard contents of working tree after editing
git checkout -- <file>
- discard files of index file after
add
git reset HEAD file
- discard new commit before
push
git reset --hard HEAD^
git reset --hard <commit_id>
- discard a commit after
push
- use
reset
git reset --hard <commit_id>
...
git push --force
- use
rebase
TODO
git rebase -i HEAD^2 # where 2 refers to the 2 most latest commit
# delete the most latest commit
git push --force
- use
revert
git revert <commit_id> # traceback to the history commit with a new commit
- tail the log
git log
git log --pretty=oneline --abbrev-commit --graph
- tail the command log
git reflog
- remove
git rm <file>
git commit -m "xxxx"
- remove files of index files
Note: remove the cache after delete the directory if it has committed, or add .gitignore after commit the directory
git rm -r --cached $DIR
Branch
Basic
- create branch
git branch <new_name>
- rename the branch
git branch -m [<old_name>] <new_name> # omitted old_name will signify the current branch
- switch branch
git checkout <branch_name>
- switch to the created branch
git checkout -b <branch_name>
Merge
- merge branch to the current branch
git merge <branch_name>
- delete local branch
git branch -d <branch_name>
- delete branch by force before merge
git branch -D <branch_name>
- delete remote branch
git push origin --delete <branch_name>
- check the relation between local branch and remote branch
git branch -vv
Fetch remote branch
- change current branch to specified branch after clone
- use
clone
git clone -b <remote_branch_name> <repo_link>
- use
checkout
after initialization
git init
git remote add origin <repo_link>
git checkout -b <new_name> <origin/remote_name>
Advanced
Modify the commit
- modify the commit log
Reference here
git commit --amend # to modify the
git push -f origin master # to push by force
- modify the commit date
git commit --amend --date="$WEEK, $DAY $MONTH $YEAR $HOUR:$MINUTE:$SECOND +0800"
where +0800 refers to Beijing time region
创建远程仓库
添加远程库
- 关联远程仓库:首次在Github上创建repository
git remote add origin git@server-name:path/repo-name.git
- 删除关联远程仓库
git remote rm origin
- 首次 push 到远程仓库
git push -u origin master
- 非首次推送到远程仓库
git push origin master
- 从远程仓库克隆
git clone <gitURL>
Branch
创建与合并分支
- 查看分支
git branch
- 创建分支
git branch <branch_name>
解决冲突
- 禁止使用 fast forward merge 方式:当master 与 branch分别更改无法快速合并时,用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
git merge --no-ff -m "xxx" <branch name>
- git 查看分支情况
git log --graph --pretty=oneline --abbrev-commit
解决后:
Bug分支
- 隐藏现场及回复现场
git stash #保存现场 git stash apply #保存现场 git stash drop #删除现场 git stash pop #恢复并删除现场 git stash list #查看现场
多人协作
git remote #查看远程库信息
git remote -v #查看远程库信息详细
git push origin master #推送本地 master 分支
git checkout -b dev origin/dev #创建本地 dev 并关联远程 dev 分支
git branch --set-upstream branch-name origin/branch-name #建立本地分支与远程分支得关联
git pull #抓取远程分支
- 创建标签
git tag <branch_name> #创建标签 git tag #查看所有标签 git tag v0.9 6224937 #对某一次 commit 打标签 git show <tagname> #查看标签信息 git tag -a v0.1 -m "version 0.1 released" 3628164 #创建有说明的标签
- 操作标签
git tag -d v0.1 #删除标签 git push origin <tagname> #推送标签到远程 git push origin --tags #推送本地所有未推送到远程的标签 git push origin :refs/tags/<tagname> #删除远程标签
- 自定义git
git config --global color.ui true #配置颜色开启 git config --global alias.st status git config --global alias.co checkout git config --global alias.ci commit git config --global alias.br branch git config --global alias.unstage 'reset HEAD' git config --global alias.last 'log -1' git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" git config --global core.quotepath false # 设置显示中文文件名
- 清楚ssh密码
$ ssh-keygen -p 当提升你输入新的密码的时候,按enter就可以啦,继续确认enter就可以 当然上面还有别的办法自己也可以试一下。
- git rm与git rm –cached的区别
当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用 git rm file_path git commit -m 'delete somefile' git push 当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用 git rm --cached file_path git commit -m 'delete remote somefile' git push
git 命令行删除远程分支
git branch -r -d origin/branch-name
git push origin :branch-name
Git默认路径修改
在/etc/profile中最后加入
# set Project Path
proj="G:\Github"
cd $proj
Git 仓库清空
Git 删除历史内容
首先找出git中前五大的文件:
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
第一行的字母其实相当于文件的id,用以下命令可以找出id 对应的文件名
git rev-list --objects --all | grep 8f10eff91bb6aa2de1f5d096ee2e1687b0eab007
删除匹配*.db的所有文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.db' --prune-empty --tag-name-filter cat -- --all
删除操作
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <FILL YOUR FILE NAME OR ID HERE>' --prune-empty --tag-name-filter cat -- --all
收回空间
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now
强行push
git push -f origin master
PREVIOUSVim-cookbook