最近发现一个项目手动保存了十几个版本,还远远没有结束的迹象。。。所以决定学学版本控制工具,首选当然是好评最高的git了,总结了些必要的命令和使用场景放上来
- Git与SVN的区别
- Git的安装
- 本地版本库(仓库)repository的创建和文件add、commit
- 工作区和暂存区Stage
- Git命令之查看、回退、撤销、删除:
- 分支的意义 & 创建 & 切换 & 合并 & 删除
- 分支管理 & bug分支 & feature分支
- 多人协作常规操作&push失败操作
- 打标签
- git的自定义配置:别名&忽略
- 1.Git与SVN(CVS的改进)相比的最大好处:不用联网,原因如下
- Git是分布式的版本控制系统,工作组每个人的电脑都有完整的版本库,当然通常会选择一台充当所谓的“中央服务器”,只是为了方便交换各组员提交的修改(组员可能没开电脑)
- SVN是集中式的版本控制系统,版本库是集中存放在中央服务器的,每次工作时,终端必须联网同步最新的版本库
- 2.Git的安装:
- Linux:先输入git,看看安装没;如果没有,就sudo apt-get install git或者 yum install git(看你是那个版本了)
- Windows:下载msysgit,它是Windows版的模拟环境和Git,下载地址:http://msysgit.github.io/,小白一路默认安装就行了
- 安装完成后记得进行初始配置如下:表示本机器所有Git仓库都用这个名字和Email,要想单独对某仓库做设置再百度吧
- git config --global user.name "???"
- git config --global user.email "???"
- 3.版本库(仓库)repository的创建和文件添加、提交:
- 定义:相当于一个目录,目录里所有文件都能被Git管理起来,增删都被跟踪,所以创建可以直接mkdir
- TXT,网页,代码等的内容变化才能被跟踪,图片视频等二进制文件不能
- git init 可以将当前目录初始化为Git可以管理的仓库,生成的 .git 目录就是用来跟踪版本库的,不要手动修改它
- git add 【文件名】在仓库中添加文件,该文件必须存在于Git仓库中
- git add . : add当前目录及其子目录下,所有被tracked且changes的文件或 .gitignore中没有且未被tracked的文件
- git commit -m “change somethings”提交文件到仓库,-m 后面接的内容是本次提交的说明,即备注修改了什么
- 4.工作区和暂存区Stage
- 创建版本库时的目录就是工作区(Working Directory),不包括 .git,.git是Git的版本库,其中有称为Stage的暂存区,还有自动创建的第一个分支master,以及指向master的一个指针HEAD
- git add的文件进入stage,git commit之后才进入master分支
- 5.Git命令之查看、回退、撤销、删除:
- git status:掌握仓库当前状态,比如哪个文件修改了,哪个文件add了但还没commit等
- git diff 【文件名】:查看某文件修改(增删)了什么
- git log:查看从最近到最远的提交日志,加上参数 --pretty=oneline ,可以只显示commit id和提交时的备注
- git reflog:Git会记录你使用的每一个命令,用这个命令可以查看
- git checkout -- 【文件名】:丢弃工作区的修改,即回到最近一次git commit 或 git add的状态;也能做误删回复,即本地误删了,从版本库里取回最近一次提交的该文件
- git reset HEAD 【文件名】:撤销暂存区的修改,此时最近一次commit的master内容会覆盖暂存区Stage,如果还想丢弃此时工作区的修改内容,就是checkout了
- git reset --hard HEAD^ :退回到上一个版本,HEAD是当前版本,^是上一个,^^是上上个,HEAD~10是往前10个版本 ;当然也可以用commit id 代替HEAD^,Git的commit id通常比较长,输入前几位就可以了
- git rm【文件名】:在版本库中删除文件,删除后也要git commit
- 6.分支的意义 & 创建 & 切换 & 合并 & 删除
- 在自己的分支下干活,到完成一个阶段性工作后,再合并到主分支上;这样既能为自己的工作提供版本迭代,又能不因功能实现一半就提交而影响别人工作
- git checkout -b dev:创建并切换到dev分支:git branch dev 创建dev分支,再git checkout dev 切换到dev分支;
- git brance:列出所有分支,当前分支前有一个 * 号,git brance -d dev 删除dev分支
- git merge dev:合并dev到当前分支
- 7.分支管理 & bug分支 & feature分支
- ------分支管理----------:
- master分支只用来发布新版本,干活都在dev分支上,dev是不稳定的,发版本时dev合并到master上;;
- 每个组成员有自己的分支,平时都是向dev合并
- git log --graph --pretty=oneline --abbrev-commit:查看分支合并图
- git merge --no-ff -m "备注" dev:禁用Fast forward合并,merge后创建一个新的commit,“备注”就是用来描述它的;这样可以在log里能看到分支历史
- ------bug 分支----------:
- git stash:保存当前工作状态,
- git checkout -b issue-99:创建临时分支,用来修复bug,修复好后,git merge --no-ff -m "merge bug issue-99"
- git stash pop:先checkout到原先工作的分支,然后用这个命令恢复工作状态并删除stash内容,相当于git stash apply恢复+git stash drop删除,git stash list查看工作现场位置
- ------feature 分支-------:
- 出现新功能,就新建一个分支git checkout -b feature-xx
- 要强行删除没有合并过的分支,git branch -D feature-xx
- ------分支管理----------:
- 8.多人协作常规操作&push失败操作
- ------常规的push和clone-------:
- git remote:显示远程库名称,加 -v 可以显示可抓取fetch和push的origin地址
- git push origin 【分支名】:把本地的某个分支推到远程库;除了 master和dev,其他分支都可以不与远程库同步
- git clone git@github.com:username/repo-name.git:抓取分支,默认只能获得master分支;要获得dev分支,需要
- git checkout -b dev origin/dev:要在本地创建与远程分支aiang
- git config user.name "xxx"/user.email "xxx":clone下来之后配置一下name和emai
- ------push失败的处理-------:
- git pull:两个协作者同时提交,发生冲突,用这个命令抓取,手动合并,再add、commit、push
- git branch --set-upstream 【分支名】 origin/【分支名】:如果提示本地分支和远程分支链接关系没有创建no tracking information,用这个命令关联
- ------常规的push和clone-------:
- 9.打标签
- git tag 【标签名】:打标签,默认为HEAD,也可以在后面加上commit id
- git tag -a 【标签名】 -m “标签信息”:指定标签信息
- git tag:查看所有标签
- git tag -d v1.0:删除本地标签v1.0,git push origin:refs/tags/v1.0:先删除本地,才能删除远程库
- git push origin v1.0:推送标签v1.0,git push origin --tags:推送全部标签到远程库
- 10.git的自定义配置:别名&忽略
- ------别名-------:.gitconfig
- git config --global alias.ci commit:--golbal是全局设置的意思,这样设置,git ci就代替git commit
- git config --global alias.last 'log -l':这样git last 就代表查看最近一次commit
- 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":好吧这个才是我想说的,前两个只是举个例子,这样变态的偷懒方式才是程序猿应该做的
- ------忽略-------:.gitignore
- 有些文件是编译产生的或者带有敏感信息的,不希望提交,那么可以在Git工作区根目录下创建.gitignore文件,记得 .gitignore 也要commit
- https://github.com/github/gitignore 这个链接有现成的一些常用忽略项,组合、添加就可以用了,git status看看之前Untracked files的提示还在不在,检验是否生效