一、什么是GIT
Git是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。Git最初是由Linus Torvalds 设计开发的,用于管理Linux内核开发。Git是根据GUN通用公共许可证版本2的条款分发的自由/免费软件,安装详见:http://git-scm.com
GitHub是一个基于Git的远程文件托管平台。
Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:
- 无GitHub:在本地 .git 文件夹内维护历时文件
- 有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库
二、Git的使用
- 进入程序目录
- git init git初始化
初始化后,会在当前目录自动创建 .git 文件夹,该文件是Git中最重要的文件夹,因为Git相关文件以及版本都将保存在该文件夹中。
- git add . 添加当前目录下所有文件到版本库
- git commit -m '描述信息' 提交到版本库,并填写版本说明,方便以后回滚
需要注意的是,执行git commit 命令时,可能会提示用户进行用户名和邮箱的配置,该配置用于记录当前版本由哪个用户提交
- git config --local user.name 'Amos'
- git config --local user.email 'you@example.com'
Git把管理的文件分为了两个区域四个状态
工作区:当前开发程序所在的目录,工作开发都是在该目录,该区域的文件会有状态的变化且状态由git自动检测,如果程序中文件做任何操作(增、删、改),文件状态均会被检测到,可以使用【git status】命令查看。
版本库:工作区检测到有文件发生变化,那么意味着较上一个版本之后对程序进行了修改,修改完成之后,可以当做下一版本进行提交,那么就是执行【git add .】将所有文件提交到暂存区,然后再执行【git commit -m '第二个版本'】提交到版本库的分支即可,之后可以使用【git log】命令查看版本记录。
-
git init 初始化
-
git add . 当前目录中所有文件添加到【某个地方】
-
git add * 当前目录中修改过的文件的添加到暂存区
- git add 文件名 将指定文件添加到版本库的暂存状态。
-
git commit -m '描述信息' 第一版本git已经生成
-
git log 查看版本信息
-
git status 查看git当前状态
Git版本回滚
回滚完成之后,要通过【git reflog】查看版本记录,之后用get reset回滚
1.stash方法
在开发过程中线上的版本出了问题,而我们需要紧急处理一下,就暂时需要保存手中的代码,回滚到之前没有修改过的状态,这个时候,就用得用stash了
stash用于将工作区发生变化的所有文件获取临时存储在某个地方,将工作区还原当前版本未操作前的状态;
之后stash还可以将临时存储在某个地方的文件再次拿回到工作区。
需要注意的是:执行git stash pop 命令时,可能会遇到冲突,因为在紧急修复bug的代码和通过stash存储在“某个地方”的代码会有重合部分,所以执行git stash pop 的时候就会出现冲突,这个时候不要着急,手动解决冲突即可。
冲突后git会提示错误信息:
CONFLICT(content):Merge conflict in templates/index.html(合并时在某个文件出现冲突)
stash相关常用命令:
- git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
- git stash list 查看“某个地方”存储的所有记录
- git stash clear 清空“某个地方”
- git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
- git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
- git stash drop 编号,删除指定编号的记录
当然,我们遇到需要紧急修改bug的时候不止一种方法,那么下面我们就来介绍第二种方法,运用分支来进行高效率开发
方案二:branch
branch称为分支,默认仅有一个名为master的分支,一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支。
- git branch dev #创建新分支,即:拷贝一份当前所在分支代码到新分支
- git checkout dev #切换到dev分支开发功能
- git add . #将修改文件添加到版本库的暂存区
- git commit -m '新功能开发完毕' #将暂晨曲的内容提交到当前所在分支,即:dev分支
- git checkout master #切换回master分支
- git merge dev #将dev分支内容合并到master分支
如果遇到开发到一半需要临时修复线上版本bug的情况,可以按照下图的流程进行:
- git checkout master #切换回master分支
- git branch bug #创建bug分支
- git checkout bug #切换到bug分支
- 修改bug
- git add . #提交bug
- git commit -m '紧急修复bug完成' #提交bug
- git checkout master #切换回master
- git merge bug #将bug分支内容合并到master分支,表示bug修复完毕,可以上线
- git checkout dev #切换到dev分支,继续开发新功能,完成之后切换到master进行合并
注意:git merge 时也可能会出现冲突,这个时候找到冲突文件慢慢修改就好
branch相关常用命令:
- git branch 分支名称 #创建分支
- git checkout 分支名称 #切换分支
- git branch -m 分支名称 #创建并切换到指定分支
- git branch #查看所有分支
- git branch -d 分支名称 #删除分支
- git merge 分支名称 #将指定分支合并到当前分支
三、GitHub的使用
GitHub,一个基于Git实现的代码托管的平台,可以将内容以及版本记录在远程也保存一份,这样就不用拿着U盘来回拷贝了,PS:类似GitHub的产品还有很多,如:GitLab、Bitbucket、码云等。
基于GitHub实现代码托管,需要以下步骤:
- 注册GitHub
- 创建仓库,创建完仓库后会有一个URL代指该仓库,如:
- git可以使用该URL进行向远程推送版本信息或获取版本信息
长此以往,将Git和GitHub结合使用,做到避免电脑损坏造成数据丢失以及多地开发的问题,上文执行过程中执行【git pull origin 分支】命令等同于【git fetch origin 分支】+【git merge origin/分支】,并且在执行过程中可能会出现冲突,原因是由于本地代码和获取的最新代码由重合部分,那么就需要自己手动解决冲突然后再继续开发。
四、协同开发
- 合作者,将其他用户添加到仓库合作者中之后,该用户就可以向当前仓库提交代码。
- 组织,创建一个组织,然后在该组织下可以创建多个项目,组内成员可以向组内所有项目提交。PS:也可以对某个项目指定合作者
协同开发命令和以上步骤类似,此处就不再重新写代码,而是使用文件描述三人协同开发整个过程。
- 创建程序
- 用户A创建程序,提交到GitHub
- 用户B克隆项目
- 用户C克隆项目
- 开发功能
- 用户A开发功能1
- 用户B开发功能2
- 用户C开发功能3
- 提交
- 用户A提交功能1,并push(A用户手速快,先提交。)
- 用户B提交功能2,无法push,因为GitHub上已经有其他人提交的新代码。
解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能2。 - 用户C提交功能3,无法push,无法提交,因为GitHub上已经有其他人提交的新代码。
解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能3。 - 获取最新代码
- 用户A获取最新代码
- 用户B获取最新代码
- 用户C获取最新代码
在上面红色标注的解决方法位置可以有三种方式操作,三者都可以完成合并并提交新功能,但是日志记录会有差异,如:前两者版本记录中会出现合并,而第三种可以保证版本记录干净整洁。
- 先 git pull origin master 然后 git push origin master
- 先 git fetch origin master 然后 git merge origin/master 再 git push origin master
-
- 先 git fetch origin master 然后 git rebase origin/master 再 git push origin master
提交bug:
我们每天逛github的时候,看到别人有好的项目可以拿下来学习,但是也要有相应的贡献,如果发现了bug我们要提交上去,但是别人不可能给你搞成合作者什么的,那么怎么才能给别人贡献代码呢?那就是fork了、
- 找到想搞的项目,fork一下,然后这个项目就在自己的仓库出现了
- 从自己仓库获取代码并进行编辑提交
- 创建并提交一个pull request,然后等待原作者是否同意这个pull request,如果同意,那么在作者的源代码中就会出现你提交的功能
其他补充:
1.配置文件
Git 的配置文件有三个:
- 系统配置:/private/etc/gitconfig
- 用户配置:~/.gitconfig
- 项目配置:.git/config
2.配置忽略某些文件的修改,
创建 .gitignore 文件,在里面写一些文件
以斜杠“/”开头表示目录; 以星号“*”通配多个字符; 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表; 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录; ========================================= 示例: a.* --表示以a命名的所有文件 [abc] --表示,abc中的一个 test/[abc].py --test目录下的a|b|c.py文件 test/* !test/a.py --test下除a.py以外的所有文件全部忽略, .idea/* *.pyc *.excel PS:git命令只能在 .git路径