版本管理工具(VCS)
- 分布式版本控制
- 多个开发人员协调工作
- 有效监听谁做的修改
- 本地及远程操作
配置 (git config)
在使用git之前,要先配置git,否则代码不能提交
有三处可以对git的用户进行配置
- /etc/gitconfig(几乎不会使用)
git config --system
- ~/.gitconfig(全局的,很常用)
git config --global
- ./.git/config(局部的)
git config --local
# 显示当前的git配置
git config [--global] --list
# 设置提交代码时的用户信息
# 你的名字,你是谁;你的邮箱,怎么联系你
git config [—-global] user.name 'zhoupan'
git config [—-global] user.email '13341128625@163.com'
# 创建命令别名
git config [—-global] alias.c commit
# 设置默认使用的文本编辑器
git config [—-global] core.editor subl // sublime
初始化仓库 (git init)
初始化本地git仓库,当前目录下会生成一个隐藏的.git目录,.git这个隐藏的目录不要乱碰(你的每一次代码的修改它都帮你记录着呢)
# 在当前目录新建一个git代码库
git init
# 新建一个目录,将其初始化为git代码库
git init [project-name]
克隆远程仓库 (git clone)
# 克隆远程仓库到本地
git clone <仓库地址>
# 克隆远程仓库到本地,并将项目名称命名为project-name
git clone <仓库地址> <project-name>
添加到暂存区 (git add)
# 添加xx文件/xx目录/当前目录 到暂存区
git add <file|directory|.> # git add index.html git add *.html
# 添加所有文件到缓存区
git add .
提交代码到版本库 (git commit)
git commit -m ‘log’
# 相当于git add .并且git commit -m
git commit -am 'log'
# 修改最新一次提交的信息
git commit —amend
远程仓库同步
远程仓库 (git remote)
# 查看远程仓库
git remote
# 查看远程仓库,并显示更加详细的信息
git remote -v
# 显示所有或者某个远程仓库的信息
git remote show [remote]
# 增加一个新的远程仓库,并命名
# eg: git remote add origin <url> 本地仓库与远程仓库作关联,其中origin是远程仓库的默认名字。含义是:给远程仓库起一个别名,名字叫做origin
git remote add <shortname> <url>
# 删除xxx远程仓库别名
git remote remove <仓库名称>
代码推送到远程仓库 (git push)
# 推送本地指定分支到远程仓库(默认推送到远程的master分支)
git push <remote> <branch>
# 分别指定本地分支和远程分支
git push origin <branch>:<remote-branch>
# 推送本地当前分支到远程仓库指定分支,并使当前分支与远程指定的分支建立关联关系
# -u参数第一次推送时使用,本地当前分支推送到远程指定分支,并且将分支关联起来,在以后推送或拉取时就可以简化命令
git push -u <remote> <remote-branch>
# 将本地当前分支和远程指定分支进行关联,然后推送代码到远程指定分支
git push —set-upstream <remote> <remote-branch>
# 推送到远程分支,执行这个命令需要建立在你已经设置了本地分支与远程分支建立映射关系之后才行
git push
# 删除远程分支
git push origin —delete <remote-branch>
# 推送所有的本地分支到远程分支(最好不要这么干)
git push <remote> --all
# 强行推送当前分支到远程仓库,即使有冲突(最好不要这么干)
git push <remote> --force
拉取远程代码 (git pull=git fetch && git merge)
# 拉取远程仓库的指定分支变化,并与本地当前分支合并
git pull [remote] [branch]
# 拉取指定远程分支的变化,并合并到本地指定分支
git pull <remote> <remote-branch>:<branch>
分支操作
分支切换 (git checkout)
# 切换到本地分支,其实这是一种简写,更严格的说是切换到本地分支的最新一次的提交点,而分支名指向的就是分支最新一次的提交点
git checkout <branch>
# 创建分支,并切换到该分支。相当于执行了两步操作:git branch xxx && git checkout xxx
git checkout -b <branch>
分支增删改查 (git branch)
# 列出当前本地的所有分支,当前分支前面会有一个*号
git branch
# 列出所有本地分支和远程分支
git branch -a
# 列出所有远程分支
git branch -r
# 新建一个分支,但依然停留在当前分支
git branch [branch]
# 删除分支
git branch -d <branch>
# 强行删除分支,用于删除一个还没有被merge的分支
git branch -D <branch>
# 分支重命名
git branch -m <branch> <new-branch>
# 查看已经被合并到master的分支,更严格的说是:查看和master分支上的代码一模一样的分支
git branch —merged
# 查看没有被合并到master的分支,更严格的说是:查看和maste分支上的代码不一样的分支
git branch —no-merged
# 建立追踪关系,在现有的分支与指定的远程分支之间
git branch --set-upstream <branch> <remote-branch>
分支合并 (git merge)
# 合并指定分支到当前分支
git merge <branch>
删除远程分支
git push origin --delete <branch>
git branch -dr <remote/branch>
删除文件 (git rm)
git rm <file|directory|.>
删除xxx文件,版本库和工作区都会一并被删除
git rm -—cached <file|directory|.>
从缓存区中删除被add的文件,或者从版本库中删除被commit的文件,将文件放回工作区
查看信息
查看工作区的状态 (git status)
# 显示有变更的文件
git status
查看提交日志 (git log)
# 显示当前分支的提交版本历史
git log
# 查看指定文件的提交历史
git log [file]
# 查看当前目录下所有文件的提交历史
git log .
# 日志单行显示
git log —-pretty=oneline
git log —-oneline
# 显示commit历史,以及每次commit发生变更的文件
git log --stat
# 显示过去5次提交
git log -5
# 搜索提交历史,根据关键词
git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其“提交说明”必须符合搜索条件
git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
git log --follow [file]
git whatchanged [file]
# 显示指定文件相关的每一次diff
git log -p [file]
# 查看文件的增删信息
git log —name-only
# 查看文件的修改信息
git log —name-status
# 显示所有提交过的用户,按提交次数排序
git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
git blame <file>
# 显示暂存区与工作区的差异
git diff
# 显示最新的提交与工作区与的差异
git diff HEAD
# 显示最新的提交与暂存区的差异
git diff --cached [commit]
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
git diff --shortstat '@{0 day ago}'
# 显示某次提交的元数据和内容变化
git show [commit]
# 显示某次提交发生变化的文件
git show --name-only [commit]
# 显示某次提交时,某个文件的内容
git show [commit]:[file]
# 显示当前分支的最近几次操作日志
git reflog
撤销
撤销工作区 (git checkout)
# 丢弃工作区指定文件相对于暂存区最后一次添加的内容所做的变更
git checkout -- <file>
# 恢复暂存区的指定文件到工作区
git checkout <file>
# 恢复某个commit的指定文件到暂存区和工作区
git checkout <commit> <file>
# 恢复暂存区的所有文件到工作区
git checkout .
撤销暂存区 (git reset HEAD)
# 恢复暂存区的指定文件到工作区
git reset HEAD <file>
版本切换 (git reset)
# 切换到当前版本(HEAD是一个指向当前版本的指针)
git reset —-hard HEAD
# 切换到上一版本(^表示当前版本向前第几个版本,^的个数代表切换到向前几个版本)
git reset —-hard HEAD^
# 切换到向前第3个版本
git reset --hard HEAD~3
# 指定commit_id,切换到指定的版本。版本号不需要写全,只要能唯一确定某一版本就行
git reset —-hard <commit_id>
重命名 (git mv)
git mv old.php new.php
将old.php文件重命名为new.php
暂存区操作 (git stash)
# 储藏工作区,并未执行add,也未执行commit
git stash
# 查看储藏的工作区
git stash list
# 储藏工作区,并且编写备注
git stash save <remark>
# 恢复指定的储藏到工作区,但不删除储藏
git stash apply <stash>
# 删除指定的储藏
git stash drop <stash>
# 恢复指定的储藏到工作区,并删除储藏(这个命令相当于上面两条命令连用)
git stash pop
标签 (git tag)
标签有两种
- 轻量级标签(lightweight)
- 带有附注标签(annotated)
# 查看标签列表
git tag
# 新建一个tag在当前commit
git tag [tag] # eg: git tag v1.0
# 新建一个tag在指定commit
git tag [tag] [commit]
# 新建一个带有附注的标签
git tag -a <tag> -m <remark>
# 模糊查找tag
git tag -l <keyword>
# 删除本地tag
git tag -d [tag]
# 删除远程tag
git push origin :refs/tags/[tag]
# 查看tag信息
git show [tag]
# 提交指定的tag
git push [remote] [tag]
# 提交所有tag
git push [remote] --tags
# 新建一个分支,指向某个tag
git checkout -b [branch] [tag]
压缩包
git archive
- git archive master —prefix=‘test/’ —format=zip > test.zip // 将master分支压缩打包成test.zip
使用系统别名配置git全局命令
进入家目录~,家目录中有一个.bash_profile文件,在这个文件中写入下面代码:
alias gs=“git status”
alias gc=“git commit -m”
alias ga=“git add .”
alias go=“git chekout”
优化分支合并
git rebase // rebase=replace base 改变基础点,不会产生多余的分支合并记录。
- 适用于:在master分支创建了一个A分支,在A分支上一顿操作,此时和master分支合并,不会产生任何问题;
- 但是如果master分支上有过变动,此时在和master分支进行合并时,就会产生多余的分支合并问题;
- 所以,B分支在向master分支合并时,最好先进行一次rebase操作,rebase操作会移动B分支的指针到master分支最近一次修改的指针处,此时再和master分支进行合并时就一切OK了。
忽略文件
.gitignore 文件
- log.txt
- /dir // 忽略dir目录
- /dir/index.php // 忽略dir目录中的index.php文件
- *.txt // 忽略所有的txt文件
- !a.txt // 除过a.txt