目录
0. 学习链接
Git教程
Git sheet
Git Community Book 中文版
1. 配置相关
配置分为全局配置和每个仓库的配置。
1.1 全局配置
配置文件路径:$USER_HOME/.gitconfig
查看全局配置:git config --global --list
修改全局配置:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
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显示颜色,会让命令输出看起来更醒目:
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.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"
1.2 单个版本仓库配置
配置文件路径:$REPO/.git/config
查看单个仓库的配置:git config --local --list
Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,并将 .gitignore 添加到版本库中,Git就会自动忽略这些文件,示例如下:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
git add -f App.class
:强制添加某个文件到 git 中
git check-ignore -v App.class
:查看哪条规则对忽略的文件生效
2. 创建版本库
2.1 创建本地版本仓库
$ mkdir learngit
$ cd learngit
$ git init
2.2 同步远程版本仓库
git clone git@github.com:Ms-Amanda/gitskills.git
:
将远程库 gitskills
克隆到当前目录下。
3. 版本库操作
3.1 本地版本库管理
本地版本库分为三部分:
工作区(Working Directory)——暂存区(stage 或 index)——版本库(Repository)
对于所有分支而言, 工作区和暂存区是公共的
git add <file>
:把工作区的修改,提交到暂存区。
git add -A
:将工作区目录下所有变更(新建,修改,删除文件)都提交到暂存区。
git commit -m <message>
:把暂存区的修改,保存至本地版本库。
git commit --amend
撤销上一次提交 并将暂存区文件重新提交。
git status
:查看实时状态。
git diff
:暂存区为空,比较工作区与最后一次 commit;暂存区不为空,比较工作区与暂存区。
git diff --cached
或 git diff --staged
:比较暂存区和版本库上一次的 commit。
git diff HEAD -- filename
:比较指定文件工作区和最后一次 commit。
git log
:查看 commit 记录。
git log --graph --pretty=oneline --abbrev-commit
git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --
abbrev-commit
在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
。
git reset --hard HEAD^
或 git reset --hard 1094a
:退回到倒数第二次 commit,将工作区暂存区重置成倒数第二次的 commit 状态。
git reset --hard HEAD
:退回到最后一次 commit,相当于放弃当前所有修改。
git reset --hard commit_id
:去到指定版本,可以是之前或者之后的。
git reflog
:查看命令历史,以便确定要回到未来的哪个版本。
git reset HEAD -- <file>
:拉取最后一次提交到版本库的文件到暂存区 该操作不影响工作区。
git checkout -- <file>
:拉取暂存区文件,并将其替换成工作区文件。若暂存区无文件则拉取版本库最后一次提交,删除文件后也可以用此命令恢复。
git rm <file>
:删掉工作区和暂存区的对应文件,再运行 git commit
后可以可版本库中删除对应文件。此命令相当于运行 rm <file>
和 git add -u
。
3.2 远程版本库操作
git remote add origin git@github.com:YOUR_NAME/YOUR_PROJECT.git
git remote add origin git@bitbucket.org:YOUR_NAME/YOUR_PROJECT.git
:
将本地版本库与远程版本库关联,远程库地址使用 ssh 协议。若远程库地址使得 https 网址,则需要输入用户名密码。需要远程库存在才能关联。
git push -u origin master
:
推送本地库的 master 分支到远程库, -u
参数表示把origin这个主机设置为默认远程主机,以后用 git push
就可以把分支推送到这个主机上的对应分支,是一种简化写法。
git remote
或 git remote -v
:查看远程库的信息
5. 分支管理
5.1 本地分支管理
git checkout -b <branch name>
:创建并切换分支,相当于接下来的两条命令:
git branch <branch name>
:创建分支
git checkout <branch name>
: 切换分支,对于所有分支而言, 工作区和暂存区是公共的
git branch
:查看当前分支
git merge <branch name>
:合并指定分支到当前分支,默认为 Fast-forward
模式,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。
git branch -d <branch name>
:删除指定分支
如下图,合并前:
合并后:
删除分支后:
git merge --no-ff -m <message> <branch name>
:合并时保留分支信息。如下图,又产生了一次 commit ,同时保留了分支信息:
git stash
:隐藏当前的工作区所有变动过的文件到临时区域,并将这些文件恢复到上一次 commit 的状态
git stash save "<message>"
:隐藏时添加注释
git stash show
:显示哪些文件被隐藏并替换,默认为最新一次的 stash
git stash show -p
:显示详细的改动信息
git stash list
:查看隐藏的工作区记录
git stash pop
:恢复工作区,同时删除 stash 中的内容。恢复时会 merge 此分支的最新 commit
git stash apply stash@{0}v
:恢复指定的工作区记录,但不删除 stash 中的内容
git stash drop
:删除 stash 中的工作区内容
git cherry-pick <commit>
:把指定的 commit 的修改“复制”到当前分支,复制前必须保证工作区状态是 clean 的,因此有两种方式:1. 先 cherry-pick,再 stash pop;2. 先 stash pop,再 add 和 commit ,然后再 cherry-pick。
git stash clear
:删除所有 stash 中的内容
5.2 远程分支管理
git checkout -b dev origin/dev
:创建远程库分支对应的本地分支,需要远程库有此分支存在
git push origin dev
:推送本地 dev 分支到远程库
git branch --set-upstream-to=origin/dev dev
:将远程库的 dev 与本地的 dev 关联。当本地与远程都有 dev 分支时,使用此命令进行关联。
git pull
:拉取远程库的改动到本地,并合并。
当远程库新建了一个 dev 分支后,先执行 git pull
拉取改动到本地,然后就能 git checkout -b dev origin/dev
git rebase
:操作可以把本地未push的分叉提交历史整理成直线
git fetch
:将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
git pull
: 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
如下图所示:
详细可参考:git fetch & pull详解
6. 标签操作
git tag <tagname>
:对当前分支的最新 commit 打标签
git tag <tagname> <commit_id>
:对指定的 commit 打标签
git tag
:查看已经打的标签
git show <tagname>
:查看某个标签的详细信息
git tag -a <tagname> -m "blablabla..."
:打标签的同时指定指定标签信息;
git tag -d <tagname>
:删除标签
git push origin <tagname>
:推送标签到远程库
git push origin --tags
:一次性推送所有标签到远程库
# 远程库删除标签分为两步:
git tag -d v0.9 #本地先删除
git push origin :refs/tags/v0.9 #远程再删除
7. 搭建 git 服务器
8. 初始化配置示例
- Git 本地初始化
git config --global user.name "YOUR_NAME"
git config --global user.email "YOUR_E-MAIL"
- 在远程仓库创建新的 repository
git clone git@GIT_ADDRESS:YOUR_NAME/YOUR_PROJECT.git
cd YOUR_DIRECTORY
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
- 将本地文件夹关联到远程仓库,并推送
cd existing_folder
git init
git remote add origin git@GIT_ADDRESS:YOUR_NAME/YOUR_PROJECT.git
git add .
git commit -m "Initial commit"
git push -u origin master
- 对已存在的 repository 的处理
cd existing_repo
git remote rename origin old-origin
git remote add origin git@GIT_ADDRESS:YOUR_NAME/YOUR_PROJECT.git
git push -u origin --all
git push -u origin --tags
9. 修订记录
时间 | 修订内容 | 修订人 |
---|---|---|
2019-12-20 | 1. 创建 | Mr_Apple |
2020-06-17 | 1. 添加 git fetch 相关的内容 | Mr_Apple |