认识GIT
git是一种分布式版本控制系统,依托本地仓库和远程仓库达到分布式控制的目标。
最核心的功能是很好的解决了版本状态存储(即文件变更过程存储)的问题,即方便使用者对仓库下的每一次文件内容的变更都能方便查找及回滚。
本地仓库和远程仓库
1.本地仓库:一般指本地电脑,用于自己提交自己本地的相关代码。可理解为本地备份代码。
2.远程仓库:一般指类似于GitHub专门的“中央服务器”,但局域网任意一台电脑也可以充当“中央服务器”的角色。远程仓库的目的是方便大家交换彼此的提交记录【即多人协助对同一仓库下的内容变更】,一般不直接参与日常开发工作,主要作为项目托管中心。可理解为网盘备份代码。
Part1:本地的centos服务器为本地仓库,老徐搭建的git.istester.com为远程仓库,介绍一些基本的git操作指令
1.centos服务器上增加远程仓库的key值,可理解为相互认证彼此的身份信息
1.centos服务器安装git,参考文章:http://www.jianshu.com/p/871994fd9282
2.访问git.istester.com网站注册属于自己的用户名和密码
3.添加key,参考文章:http://www.jianshu.com/p/36df3c48e3c1
注:key需要同步加到git远程服务器
2.git.istester.com上建立远程仓库
访问git.istester.com,登录用户名和密码,点击图像旁的+号,选择创建新的仓库,就可见如下界面
完成仓库名称的填写后,即可见如下界面,此时远程仓库目前是空的,没有任何内容。
注:除新建一个仓库以外,也可以直接迁移他人的仓库,但需要知道他人仓库的用户名和密码作为迁移的凭据
3.本地仓库和远程仓库间相互联系
本地仓库和远程仓库间相互联系可用如下截图说明,git fetch用于将远程仓库的代码拉取到本地,git push用于将本地仓库的代码推送到远程仓库
本地仓库推送代码的操作流程:
1.新建一个目录,如执行mkdir -p /data/git_jianshu[与远程仓库名保持一致,方便查找],作为本地服务器上存放本地代码的一个目录文件
2.cd /data/git_jianshu,执行git init初始化仓库,执行后的效果如下
3.建立本地仓库与远程仓库的关联,可执行git remote add origin http://t.istester.com:3000/xiaopan/git_jianshu.git【远程仓库地址】,
PS.可通过git remote -v命令检查两者间是否已建立关联
4.将本地仓库的文件推送到远程服务器
1)本地仓库的文件主要由工作区/暂存区/本地仓库区三部分组成,如下方截图所示
a.工作区就是电脑文件系统上的项目文件所处的环境,即我们在本地编写代码的文件存放的位置,所有文件的新增的改动都是从工作区开始
b.暂存区是暂时存放文件改动的区域
c.本地仓库区,进入到本地仓库的文件改动都会有对应的commit object,是三个区中最不会丢失数据的地方,当本地开发时间较长的时候,可多次提交代码至此处,确保内容不会丢失
PS.可通过git status命令查看本地改动的文件当前的状态
2)仓库下创建一个文件,touch README.md,写入内容echo ‘jianshu’> README.md,执行git add README.md命令后是将工作目录下的文件修改了的文件README.md提交到暂存区
3)执行git commit -m “add README.md”命令后是将暂存区的文件提交到仓库区,“add README.md”是message部分,相当于增加注释
4)执行git push -u origin master,上传本地master分支到远程仓库
7.查看远程仓库,检查相关记录,如果有的话,则整个过程结束
从远程仓库拉取代码的操作流程[需先建立本地和远程的连接]
1.直接clone整个仓库
1).执行cd /data/git_jianshu,切换到匹配的目录️
2).执行git clone http://t.istester.com:3000/xiaopan/git_jianshu.git,拉取远程代码到本地服务器
3).执行ll,检查有无相关文件,如果有的话,则整个过程结束
2.拉取分支新变动的部分
1.执行git fetch来更新本地跟踪的远程分支
2.执行git merge去合并这两个不同的代码:
1)merge无冲突的情况下则成功拉取远程分支
2)两个版本都修改了同一处代码的话,此时merge就会出现冲突,此时需要先解决完冲突后,再进行merge
注:可执行git pull强制拉取远程代码,但从安全性角度来说,建议使用方式二的步骤
Part2:分支/合并模块
日常工作中一般都会存在多人协作对一个远程仓库进行编辑,此时需要借助分支和合并等操作帮我们解决多人协助的问题。开始这个话题之前可先了解哈git的一个核心设计,即commit object!
1.commit object模块
1)当我们执行git commit -m "first commit"的时候快就会在git内容生成一个commit object,可理解为会在git的数据库中增加一条记录,当我们需要回滚代码的时候,只需要通过git指令回滚到这条记录的时候,我们就可以恢复成生成这条记录的时候。
2)每次新生成一个commit object的时候会指向前一个commit object,仿佛一根树枝往上生长,如截图所示
注:commit object的值可以在.git/refs/head/[本地分支],.git/refs/remotes/[正在跟踪的分支]进行查找
2.分支
可通俗理解在现有的树上长出一个分叉,新建一个分支dev的命令为git checkout -b dev,查看当前所在的分支命令为git branch,查看仓库的所有分支git branch -a
3.合并
可通俗理解为将两个分支,如截图所示d376833和3a76835再次合并至863823c上,合并的命令为git merge 分支名
问题来了,怎么查看本地的代码指向哪一个分支呢?
看head
Part3:汇总日常工作git的操作流程
1.从远程master上拉取一个分支到本地用于开发
1)需要从master分支上拉取一个新分支用于开发使用,给新建分支命令为jianshu_dev
2)本地仓库建立与远程仓库的关联
a.本地建一个文件夹jianshu
b.cd jianshu文件目录下,执行git init,在本地建立一个git初始仓库
c. 执行git remote add origin 远程仓库地址,建立本地仓库与远程仓库的关联
d.拉取步骤1中建立的分支的代码,执行 git fetch origin jianshu_dev
e.查看文件夹jianshu可见远程的相关代码内容,在本地完成代码开发后,再将本地的代码上传至远程仓库
f.分别执行 git add ./git commit -m "update"/ git push origin master:jianshu_dev
g.远程仓库的jianshu_dev发起merge请求合并至master分支,至此完成整个流程
2.开发进行一半,需要远端主分支的最新代码
开发过程中发现远程的master分支有更新,而且更新的内容可以帮助自己本地的代码开发,此时需要我们拉取master分支上最新的代码来协助本地开发
1)先将本地已开发的内容,通过git add ./git commit -m "update"保存下来
2)git pull --rebase origin master使用这个指令将远端的主分支以 rebase 的形式 “合进”当前分支
PS.使用rebase的原因是由于所有本地开发的 commit 都会出现在远端主分支里的 commit 之后;并且可以避免额外引入一次 merge 的 commit
3)git log --oneline查看当前分支下的commit message是否符合预期,退出的话,输入q即可
3.本地多次git commit后怎么只生成一条commit记录
开发过程本地代码量较多,再加上调试代码的时候修复一些bug等操作,避免代码的遗漏,最好做好有修改就及时提交
1)从master上拉取了jianshu_dev分支用于本地的开发
2)修改了部分代码,此时完成一次提交,git add ./git commit -m "update"
3)继续修改了部分代码,此时完成一次提交,git add ./git commit -m "tina update",此时完成了本地所有代码的开发,准备提交至远程jianshu_dev完成合并操作
4)此时直接执行git push命令的话,会对远程的commit message造成污染,期望只出现一次commit记录
5)只有2条commit记录,所以执行git rebase -i HEAD~2,可见一个记录
6)第一行记录不变,将下面几行开头的pick换成s,点击保存后
7)删除所有内容( #开头的可以忽略),然后写一句简短、准确的句子作为这次开发的commit message,如
8)点击保存后,可见如下的页面,则说明成功了,最后执行git push origin master:jianshu_dev 把本地仓库推到远端仓库
4.合并冲突
1.创建一个分支A/21day,修改公共文件xiaopan.ini,合并到master分支上
2.再创建一个分支B/21day,修改公共文件xiaopan.ini[与1中修改的内容有差异],推送到远程服务器时无问题,此时把这个分支合并到master分支时,会报这个错误
3.通过报错提示说明是由于xiaopan.ini文件造成了冲突,查看文件内容,git会用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,<<
>>>>>> xiaopan/21day是指分支中修改的内容。最简单的编辑冲突的办法,就是直接编辑冲突了的文件(test.txt),把冲突标记删掉,即把标记全部删除。3.修改完成之后,再分别执行git add ./git commit -m "xiaopan add"/git push origin master,即解决了合并冲突,将B/21day的分支合并到master分支上
Part4:向远程仓库push时候被拒绝
向远程仓库推送代码的时候,出现了如图所示的错误,从报错信息可知是由于远程repository和本地的repository冲突导致的,产生了版本冲突的问题。
有如下几种解决方法:
1)使用强制push的方法:
$ git push -u origin master -f
这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。
2)push前先将远程repository修改pull下来
$git pull origin master
$ git push -u origin master
3)若不想merge远程和本地修改,可以先创建新的分支:
$git branch [name]
然后push
$git push -u origin [name]
Part5:git常用的指令
1.git commit 提交每一次改动,可以算是整个git的核心,依托此命令可保证开发的代码不会丢失
2.git log --oneline 可以打印出最近的commit messages,每条message只占一行,通过commit message 确认我当前的分支以及当前分支是否是最新的
3.git status 查看文件的状态,哪些文件还在工作区(还没 git add)、哪些文件还在暂存区(还没 git commit)或者 rebase、merge 的进展等
4.强制从远程拉代码或者推送代码
git push <远程主机名> <远程分支名>:<本地分支名> --force
git pull --force <远程主机名> <远程分支名>:<本地分支名>
git reset --hard 版本号 可任意回退至某一版本号