Git 简易手册
Git 的有多个配置文件,区别在于作用范围的大小:
~/.gitconfig
针对当前用户,对当前用户的所有仓库有效.git/config
只对当前仓库有效
可以直接编辑配置文件,也可以使用命令来设置。
1 | cat ~/.gitconfig |
设置用户名和邮箱,用于代码提交时自动署名,方便查看提交日志时区分开发者。
1 | git config --global user.name "Your Name" |
--global
保存到~/.gitconfig
,而不是当前仓库。
列出配置。
1 | git config --global -l |
设置 Git 的默认推送模式为 simple——当我们执行 git push
而没有指定分支时,自动使用当前分支,而不是报错。
1 | git config --global push.default simple |
常用设置:
1 | # 不关心文件的权限 |
基本操作
工作流
初始化。
1 | git init |
查看状态。
1 | git status |
添加到快照。
1 | git add . |
-A
全部文件。
提交到仓库。
1 | git commit -m "some text..." |
-m
简短的文字说明。
列出提交历史。
1 | git log |
--pretty=oneline
一行一条。
展示某次提交的详情。
1 | git show <commit_id> |
重命名
用 mv
修改后提交即可。
1 | git mv |
比较
比较工作区和快照。
1 | git diff |
比较快照和仓库。
1 | git diff --staged |
回退
撤回 add
和 commit
操作。
1 | git reset <commit_id> |
仅撤回 commit
操作。
1 | git reset --soft <commit_id> |
重置整个仓库(包括工作区)。
1 | git reset --hard <commit_id> |
关键字 HEAD
表示当前版本。HEAD^
表示上一个版本;HEAD^^
符号则表示上上个版本。HEAD~1
等同于 HEAD^
;HEAD~2
等同于 HEAD^^
。下面的两条命令都可以将项目回退到上上个版本。
1 | git reset HEAD^^ |
堆栈
切换到其他分支时,工作区(或快照)已经发生变化,但又不想立即提交到仓库,可以将工作区(包括快照)暂时保存到堆栈中:
1 | $ git stash |
切换到其他分支后,可以弹出堆栈的栈顶元素,覆盖(合并)到当前分支的工作区:
1 | $ git stash pop |
如果只是想让栈顶元素应用到当前工作区而不要从堆栈中删除:
1 | git stash apply |
管理堆栈中的内容:
1 | $ git stash list |
修订提交
针对最新的提交:
1 | git commit --amend --message "fix bug" --author "you <your@example.com>" --no-edit |
--message
修改注释。--author
修改署名。--date
修改提交日期。--no-edit
不使用 vim。
手动处理多个提交,先执行 git rebase -i <commit_id>
,这会打开编辑器,在编辑器中把需要改动的提交前面的 pick
改为 edit
,然后就可以用 git commit --amend ...
开始逐个修改,每修改完一个,须执行一遍 git rebase --continue
才能继续修改下一个。
针对大量提交:
1 | git filter-branch -f --env-filter "..." HEAD |
其中 "..."
由键值对组成,形如 XXX='xxx';
,例如:
1 | GIT_AUTHOR_NAME='newName'; |
日志
列出日志。
1 | git reflog |
清空日志。
1 | git reflog expire --expire=now --all; git gc --prune=now |
标签
列出标签。
1 | git tag |
添加标签。
1 | git tag <tag_name> |
删除标签。
1 | git tag -d <tag_name> |
将本地已有的标签同步到远地仓库。
1 | git push <repo_name> <remote_branch> <tag_name> |
删除远地仓库的指定标签。
1 | $ git push <repo_name> <remote_branch> :refs/tags/<tag_name> |
分支
列出分支。
1 | git branch |
创建分支。
1 | git branch <branch_name> |
删除分支。
1 | git branch -d <branch_name> |
合并分支。
1 | git merge <other_branch> # 合并其他分支的提交到当前分支 |
检出
检出某个标签。
1 | git checkout <tag_name> |
检出某次提交,以此创建新的分支。
1 | git checkout <commit_id> -b <branch_name> |
检出(切换)分支。
1 | git checkout <branch_name> |
远地仓库
远地仓库的地址有 HTTPS 和 SSH 两种形式:
HTTPS 形式
无需额外的配置,但是在每次推送时都需要输入远地仓库所在平台的账户密码以验证身份。SSH 形式
只需要把 公钥 提供给远地仓库所在平台,可以用下面命令生成 SSH 公钥:1
ssh-keygen -t rsa -C "your_email@example.com"
或者导入现有的私钥,如果私钥文件位于
~/.ssh/id_rsa
:1
2
3eval "$(ssh-agent -s)"
chmod 400 ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa
远地操作
列出远地仓库。
1 | git remote -v |
-v
显示远地仓库的地址。
添加远地仓库。
1 | git remote add <repo_name> <repo_url> |
repo_name
远地仓库的别名repo_url
远地仓库的地址
移除远地仓库。
1 | git remote rm <repo_name> |
推送至远地仓库。
1 | git push <repo_name> <remote_branch> |
repo_name
远地仓库的别名。remote_branch
推送至远地的remote_branch
分支。tag_name
根据标签推送。