我们在学习Git之前,我认为先搞清楚Git可以做什么是很重要的。以下就是Git的用途。
1.解决代码被误删的可能。我们的代码是存储在硬盘上的,所以是有被误删的可能的,而在Git这个版本控制系统中,他会把代码推送到远端仓库进行管理,防止误删。
2.版本持续变化,需要对多个版本进行处理。
3.方便多人协作
Git和Github的区别
Git:版本控制工具(同类工具:SVN,hg,vsc...),本质上不依赖任何第三方网站,但配合Github效果更佳。
Github:全球最大的IT社区。(全球最大的同性(程序猿)社交网站)由于在国内访问的话速度会比较慢,所以选用码云配合演示下Git。(都可以托管自己的代码,并提供给别人阅读,达到交流的目的)。
下来我们就来看看Git的基本操作(我用的是centos7,yum 源安装。如果有朋友用的是centos 6的版本,那么可能需要源码安装)
1.git clone URL 把码云上的项目克隆到本地。
(1)现在码云上建立一个文件。点击加号—-》新建—-》点击克隆下载复制HTTPS——》在命令行输入git clone URL
现象是发现这个目录下多了一个文件(本来是码云上的文件)
2,这里我们要把本地的代码向码云提交,分为三步
这是我提前准备的文件,也就是要提交的文件。
cd test-Git
touch test.c
(1)git add 文件名:告诉哪些文件是需要进行版本控制的。
(2)git commit . 把修改后的当前目录下的所有文件提交到本地,(虚拟机凉了,代码依然会凉)。回车后会出现一个提交信息(相当于提交的时候有了一个预览),并提交的时候需要写一个比较有描述性的日志信息。(一定要写,且认真写!!!!!)。刷新码云,这时可以看到仍然没有看到test.c,所以说明提交并没有同步到服务器上去。
(3)git push 服务器的同步,
3 其余指令
git pull :在码云上修改之后,在本地敲下这个指令时,会使本地的文件同步修改。
git diff:可以看到本地还没有提交的版本中,发生的变化,也就是提示发生的改动.
git status:查看哪些代码发生了修改。(不包含详细信息)类似上条
git log :实例,先对 先git commit .提交一下改动的信息,在vim中写上日志,保存,再敲下git log 作用,查看版本日志。
4.配置忽略文件.gitignore,内容如(指定要忽略的内容,如编译出的.o可执行文件)*.o。
在告诉哪些文件是需要进行版本控制的时候就不会有.o文件了。
5.版本回退:
(1)git log 查出版本信息(版本日志)由于信息较多,略显杂乱。
,git log - -pretty=oneline
回车后,一行版本号+一行日志
下面就要开始回退了
git reset —hard 版本号
下面回复一下
git log - -pretty=oneline
发下最新的版本没有了,这时怎么办呢?
git reflog:记录了我们在本地上的所有核心工作,来找git log上的不再显示的版本号。前面是版本号,后面是说明。
6.分支,产生分支的目的是为了团队的协作,不会因一个人的错误,影响团队的开发。如甲在开发代码时,基于服务器上的这一份代码,创建一份分支(对服务器上的代码拷贝一份),甲自己创建的这个分支称为开发分支(dev),服务器上原来的这份代码称为主线(master),后续甲把代码提交到dev分支上,不会对master进行任何影响,知道代码开发完,测试完,再把dev分支的代码合并到master上。
(1)git branch(分支):
完成对分支的操作。不加其他参数,查看当前本地有哪些分支(注意是本地)(*在哪个分支上,我们就工作在那个上面)。
加上分支的名字,在本地(码云上不会显示)创建一个指定名字的分支。
-d 分支名字,删除分支
(2)git checkout 分支名 调整工作分支,这之后我们就会在这个分支中工作。
-b 选项,创建分支并切换到新分支。
(git checkout -b dev 创建并切换到dev分支)
(3)git merge 分支名
会合并分支也就是把dev上的改动,合并到merge上。
(4)删除分支
git branch -d 分支名(虽然还是可以找回但还是要确定合并后再操作)
(5)合并时的重要问题:冲突,
例如:在同一个位置的代码,在不同分支中都被进行了修改,此时尝试merge两个分支,就会产生冲突。
在master也修改了main.c 在最开始的地方新增了一行代码printf (“hehe\n”);
在dev 分支中修改了main.c,在最开始的一行代码中printf (“haha\n”);
解决方法merge后打开vim手动修改master中合并的文件,再次强制提交git commit -a
场景一:
假设你在开发一个需求时,马上要开发完了,产品经理说,这个需求不用做了。此时修改的代码,不用合并到master分支中,用过的分支可以删除,但这是如果直接用git branch -d 会报错,提示
还没有没有合并到master分支中操作不可以进行,这时我们应用git branch -D 强制删除一个没有merge 过的分支。
场景二:
多人合作开发
1.直接基于master来开发(实际工作中,严格禁止)
pull—->merge/解决冲突——->commit——->push
先拉取代码,有冲突的话解决冲突,解决之后再提交代码。
场景三
开发一个功能,创建dev分支,在这个dev分支上开始开发。
开发到一半时,master上发现了一个bug,需要立刻修复。
(不可以把开发一半dev(如没有测试,可能有故障)合并到merge,在多人时,如有bug其他人将不可以工作)
如果直接切换是切换不到master上的,由于当前代码修改了,但是没有提交。此时切换不到。
git stash 把分支中修改的代码保存,并使新改的代码就没有了,恢复成修改之前的。这时就可以正常的切换了(git checkout ())处理完后git stash pop恢复
git stash list,存储列表。
场景四,多人在分支上直接开发
首先,可以试图用git push origin branch-name推送自己的修改
如果推送失败,则因为远程分支比你的本地更新(也就是有别人改过),需要先用git pull试图合并; 如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream origin/branch-name branch-name (具体看你的git如何提示) 这就是多人协作的工作流程。
以上是常出现的情景,下面我们讲最后一个问题
标签管理 tag
需要对代码进行发布版本的管理,实用标签机制告诉我们那份代码是需要发布的。一般不会直接发布master上的最新代码。
git tag v1.0 创建了一个标签名为v1.0
git tag 查看目前有什么标签名
用git log 查出想发布的标识符。
git tag -a v1.1 文件标识符,这时回车,可以在出现的页面写日志,注意这时还是在本地的
我们把它推送到服务器上。
git push origin v1.1:
下面我们来演示一下删除标签
git tag -d [标签名]
删除服务器上的标签:要尽量避免。