三个区域
工作区、暂存区、版本库
基本操作
个人信息配置
git config --global user.email "UserName@example.com" #设置全局用户名
git config --global user.name "UserName" #设置全局邮箱地址
执行一次即可,信息记录在~/.gitconfig
文件中
git对一个目录进行版本控制
- 进入文件夹
- 执行初始化命令,将当前目录目录配置成git仓库,信息记录在
.git
文件夹中
git init
- 查看管理目录下的文件状态
git status
新增文件和修改过的文件是红色
- 将指定文件放入暂存区(红变绿)
git add filename
git add . #当前目录所有待加入暂存区文件
- 生成版本,将暂存区的内容提交到分支
git commit -m 'details' #-m注释参数
- 查看XX文件相对于暂存区修改了哪些内容
git diff filename
- 查看当前分支的所有版本
git log
- 查看head指针的移动历史
git relog
- 回滚
git reset --hard HEAD^ #回滚一次
git reset --hard HEAD~ #回滚一次
git reset --hard HEAD^^ #回滚两次
git reset --hard HEAD~100 #回滚100次
git reset --hard 版本号 #回滚到特定版本
- 将XX文件尚未加入暂存区的修改全部撤销
git checkout -- filename
git checkout . #全部撤销
git restore filename
- 将在暂存区的指定文件放回工作区
git restore --stage filename
- 记录图形展示
git log --graph --pretty=format:"%h %s"
用树展示版本结构
远程仓库配置
- 将本地仓库关联到远程仓库
git remote add origin Servername@IP:Directory/xxx.git
origin后面的是远程仓库地址 比如 git@github.com:Genevieve_xiao/program.git
这条命令本身的框架其实是
git remote add <shortname> <url>
一般来讲我们都将<shortname>写成origin,而<url>才是仓库唯一的地址。
这条命令也就是让远程仓库的唯一url映射成本地仓库对它起的别名shortname,这样就方便之后的命令不用每次都输入一遍很长的url,而是直接用origin代替就可以了。
- 将远程仓库克隆到当前目录下
git clone Servername@IP:Directory/xxx.git
这条指令不同于git pull
的地方在于:clone是在一个没有本地版本库的设备,从云端下载一个完整的版本库,是一个从无到有的过程;而pull只是在有本地版本库的情况下,从云端拉去最新版本的commit。
分支
本地分支
- 创建新分支
git branch branch_name
- 切换到新分支
git checkout branch_name
- 创建并切换到新分支
git checkout -b branch_name
- 查看所有分支和当前所处分支
git branch
- 将指定分支合并到当前分支上 注意顺序
git merge branch_name
- 删除分支
git branch -d branch_name
远程分支
远程仓库和本地仓库其实是两个相对独立的系统,分支与分支之间其实也相对独立。
所以其实本地仓库的分支和远程仓库的分支的名称不一定相同,合并分支时也不一定非要是两个对应的分支。
同样的,本地仓库新建一个分支的时候,远程仓库并不会自动同步创建,而是需要在远程新建一个分支然后再将两个分支对应起来;或者在设置好本地分支的同时对应到远程仓库。
- 将当前分支推送到远程仓库
git push -u
(只有第一次推送需要-u 之后推送不需要)
- 将本地的某个指定分支推送到远程仓库
git push origin branch_name
执行这条指令的前提是远程仓库已存在对应分支,否则就会弹出提示我们使用以下这条指令:
- 设置本地的分支对应远程仓库的分支(同时在远程新建该分支)
git push --set-upstream origin branch_name
这条指令就可以在本地已经创建好新分支,但是远程仓库还不存在对应分支的时候,在远程新建分支并上传
- 将远程的
branch_name1
与本地的branch_name2
对应
git push --set-upstream-to=origin/branch_name1 branch_name2
将远程的一条指定分支和本地的一条指定分支对应起来,注意顺序
- 删除远程仓库的分支
git push -d origin branch_name
- 将远程仓库的对应分支和本地仓库的当前分支拉取合并
git pull
- 将远程仓库的指定分支
branch_name
和本地仓库的当前分支拉取合并
git pull origin branch_name
这时候不一定就是两个对应的分支
- 将远程的分支拉取至本地
git checkout -t origin/branch_name
前面几条checkout
的指令都是跟切换分支有关,其实这条也是切换分支,不过这条分支只存在于远程仓库而本地并不存在。实质就是,先将远程的指定分支拉取至本地,再切换到这个分支。
栈
没有来得及保存版本的工作内容可以先存在栈里。
- 将工作区和暂存区中尚未提交的修改存入栈中
git stash
- 将栈顶储存的修改恢复到当前分支 同时删除栈顶元素
git stash apply
- 将栈顶储存的修改恢复到当前分支 同时删除栈顶元素
git stash pop
- 删除栈顶储存的修改
git stash drop
- 查看栈中的所有元素
git stash list
总结
实际上一般在公司开发的时候,master分支主要是只用来保存发行版本的,所有的开发都在dev分支上完成,每个部门再在dev上的不同分支进行开发。
不过如果是一个人做项目的话,其实用不到那么多git上面的指令,最主要的就四个,pull add commit push。