Git

配置名字和 Email

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

创建版本库

mkdir learngit
cd learngit
pwd

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>
rm '<file>'

git commit -m "remove <file>"

先手动删除文件,然后使用 git rmgit 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 switch <分支名>

创建并切换分支:

git checkout -b <分支名>

git switch -c <分支名>

查看分支:

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 branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

删除 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 reflog expire --expire=now --all
git gc --prune=now

全部提交到远程:

git push origin --all --force