Git
配置名字和 Email
git config --global user.name "Your Name" |
创建版本库
mkdir learngit |
pwd
命令用于显示当前目录
初始化目录:
git init |
把文件添加到版本库
把文件添加到仓库:
git add readme.txt |
把文件提交到仓库:
git commit -m "本次提交的说明" |
时光机穿梭
查看仓库当前状态:
git status |
查看更改:
git diff |
版本回退
显示从最近到最远的提交日志:
git log |
每条日志都只显示一行:
git log --pretty=oneline |
HEAD
表示当前版本,上一个版本就是 HEAD^
,上上一个版本就是 HEAD^^
,往上 100 个版本写成 HEAD~100
。
把当前版本回退到上一版本:
git reset --hard HEAD^ |
把当前版本回退到指定版本:
git reset --hard <commit_id(前几位)> |
--hard
模式将当前分支指向指定的提交,并删除所有的修改,包括工作区和暂存区的修改,适用于撤销错误的提交,回退到历史版本。--soft
模式只重置分支指针,不会修改工作区和暂存区,适用于修改提交信息、合并提交。--miexd
模式将当前分支指向指定的提交,并将暂存区重置为指定提交的状态,但工作区的修改不会被删除,适用于取消暂存的修改、撤销部分提交。
查看命令历史:
git reflog |
工作区和暂存区
工作区 (Working Directory)
就是在电脑里能看到的目录。
版本库 (Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是 Git 的版本库。
Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支 master
,以及指向 master
的一个指针叫 HEAD
。
管理修改
查看工作区和版本库里面最新版本的区别:
git diff HEAD -- <file> |
撤销修改
丢弃工作区的修改:
git checkout -- <file> |
把暂存区的修改撤销掉 (unstage),重新放回工作区:
git reset HEAD <file> |
删除文件
从版本库中删除文件:
git rm <file> |
先手动删除文件,然后使用 git rm
和 git add
效果是一样的。
远程仓库
创建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com" |
添加远程仓库
关联远程库:
git remote add <name> git@server-name:path/repo-name.git |
取消关联远程库:
git remote remove <name> |
将本地的分支版本上传到远程并合并:
git push <远程主机名> <本地分支名>:<远程分支名> |
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名> |
-u
参数指定一个默认主机
从远程库克隆
git clone [url] |
分支管理
创建与合并分支
创建分支:
git branch <分支名> |
切换分支:
git checkout <分支名> |
创建并切换分支:
git checkout -b <分支名> |
查看分支:
git branch |
查看本地和远程的所有分支:
git branch -a |
查看本地分支和远程分支的关联:
git branch -vv |
合并指定分支到当前分支:
git merge <分支名> |
删除分支:
git branch -d <分支名> |
查看分支合并图:
git log --graph |
分支管理策略
禁用 Fast forward 模式,用普通模式合并:
git merge --no-ff -m "提交说明" <分支名> |
“储藏” 当前工作现场:
git stash |
查看工作现场:
git stash list |
恢复工作现场:
git stash apply (<stash id>) |
删除 stash:
git stash drop (<stash id>) |
恢复并删除 stash:
git stash pop (<stash id>) |
把某个提交所作的修改 “复制” 到分支:
git cherry-pick <id> |
丢弃一个没有被合并过的分支:
git branch -D <分支名> |
查看远程库信息:
git remote |
查看远程库详细信息:
git remote -v |
在本地创建和远程分支对应的分支:
git checkout -b <分支名> <远程仓库>/<分支名> |
建立本地分支和远程分支的关联:
git branch --set-upstream <分支名> <远程仓库>/<分支名> |
从远程抓取分支:
git pull |
rebase
操作可以把本地未 push 的分叉提交历史整理成直线。
标签管理
创建标签
创建标签:
git tag <name> |
查看标签:
git tag |
对指定提交打标签:
git tag <name> <commit_id> |
查看标签信息:
git show <tagname> |
创建带有说明的标签:
git tag -a <tagname> -m "说明文字" (<commit_id>) |
删除标签:
git tag -d <tagname> |
推送指定标签到远程:
git push origin <tagname> |
推送所有标签到远程:
git push origin --tags |
删除远程标签:
git push origin :refs/tags/<tagname> |
其它操作
从远程库获取所有分支:
git clone xxx |
删除 git 中无用的大文件
查找.git\objects\pack
中的 5 个大文件:
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" |
删除提交中的文件:
git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch YOU-FILE-NAME' --tag-name-filter cat -- --all |
使更改生效:
rm -rf .git/refs/original/ |
全部提交到远程:
git push origin --all --force |