了解
git是一个版本管理的软件,这个软件可以通过可视化的客户端来使用,也可以通过这个软件配套的命令来使用。
github是一个代码托管平台,从本质上来说,git和github没有任何关系,但是基本上很多代码托管平台可以通过git的语法来管理
先把目录管理起来
学习git的第一步是先把我们创建的程序目录管理起来。
初始化
git init -- 会在当前目录创建一个隐藏的.git文件夹,这个文件夹不可以删除,git的使用全指望它
git status -- 查看当前目录所有文件状态
git add . -- 把红色的变绿色
git commit -m '第一次提交' -- 把绿色变成透明色,第一次使用commit相当于把所有文件又拷贝一份放到别地
更改目录文件
初始化后更改目录文件内容,如templates/index.html文件,原先是
现在是
执行下面操作
git status -- 发现index.html标记为红色
git add .
git commit -m '新增linux'
然后再修改内容,如下
执行下面操作
git status -- 发现index.html标记为红色
git add .
git commit -m '新增java'
现在第一个问题来了,想回到新增java之前的版本,如下操作
内容回到
第二个问题,又想回到有java的版本,执行
此时发现git log中没有新增java的版本,因为默认git log查看的是当前版本及之前的版本,这时候需要用到git reflog
这时内容变为
第三个问题,如果我修改了index.html文件,但是没有add,或者add之后没有commit,那想回到修改之前的状态,参考下面图例
代码上线之后出bug解决办法之stash
先回到初始状态
这个代码已经在线上运行了,紧接着开发新功能linux,开发到一半
这时候php代码需要修改,如果此时commit之后再去修改,那么linux的半残品就会被用户使用。所以应该先把新增的代码保存到一个地方,去修改php的bug,修改完成之后再把新增的linux的一般代码拿过来
先执行git stash
此时内容如下
修改bug如下
重复add和commit的操作
通过 git stash pop
把新增的linux内容拿回来,因为显式地修改了<li>php</li>
这一行的代码,有stash储存的这一行发生冲突.如果新增或删除基本就不会出现冲突,其实出现冲突也不要紧,手动更改冲突并add和commit即可
stash相关常用命令:
git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
git stash list 查看“某个地方”存储的所有记录
git stash clear 清空“某个地方”
git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
git stash drop 编号,删除指定编号的记录
代码上线之后出bug解决办法之branch
看两幅图
在平常的开发中,一般master分支不做改动,仅仅用来合并其他分支的代码,要想新增功能或者修改bug需要创建其他分支,开发完毕或者bug修改完成之后删除相应分支即可。分支的好处是可以多个人并行开发,然后再合并到master分支。先让一切回归初始状态
创建dev分支并新开发linux功能,开发到一半,此时内容为
git branch dev
git checkout dev
git add .
git commit -m 'linux开发到一半'
这时候php出现bug了,要修改bug。创建bug分支修改bug,注意:需要在master分支去创建bug分支,这样bug分支拷贝的就是master里的内容,如果在已经开发的dev分支去创建bug分支,那么bug分支拷贝的就是dev分支的内容
切换到master分支去合并
此时master内容为
然后切换到dev分支继续开发linux,开发完成合并到master
此时文件内容为
注意:git merge 时也可能会出现冲突,解决冲突的方式上述stash相同,即:找到冲突文件,手动修改冲突并提交,此处不再敖述。
branch相关常用命令:
git branch 分支名称 创建分支
git checkout 分支名称 切换分支
git branch -m 分支名称 创建并切换到指定分支
git branch 查看所有分支
git branch -D 分支名称 删除分支
git merge 分支名称 将指定分支合并到当前分支,一般是切换到主分支再合并其他分支
github托管
单人开发
单人开发,可能公司和家里都有电脑可以开发,每次把代码进行来回拷贝是一件麻烦事,所以考虑把代码放在一个第三方平台,通过这个第三方平台做代码寄存中转站。
去github注册一个账号,然后创建一个repository,其实就可以理解为放代码的文件夹,创建完成之后里面是空内容,但是有一些提示信息
git remote add origin https://github.com/longyunfeigu/nj.git
git push -u origin master
git branch dev -- 创建dev开发分支并把dev推送到github
git checkout dev
git push origin dev
此时github具有两个分支
回到家,打开电脑,创建空文件夹
在家开发功能之后add commit之后还有一步操作git push origin dev
.回到公司第一步是切换到dev分支并把家里开发的代码拉下来`git pull origin dev',然后继续开发。
现在问题来了,如果在家新增了一个py的代码没有push到github该咋办?回到公司,先pull内容之后,继续新增一个py文件
回到家之后第一件事是拉代码,此时合并会出现下面问题
git pull origin dev
的操作相当于两部分git fetch origin dev
和git merge origin/dev
,这种情况会出现分叉,如果使用git fetch origin dev
和git rebase origin/dev
就不会出现这种分叉情况