文章目录
前言
这几天学习了一下廖雪峰老师的git教程,为了总结和方便日后回顾,故写了如下的文章来大概总结一下git使用的知识点。
一、Git 简介
1.Git 介绍
Git是目前世界上最先进的分布式版本控制系统
能自动记录每次文件的改动,还可以让同事协作编辑。
集中式版本控制系统:版本库集中存放在中央服务器,干活时,先从中央服务器取得最新版本,干完活再推送给中央服务器。
缺点:必须联网,若在互联网遇到网速慢,可能提交一个10M的文件就需要5分钟,过于缓慢。
分布式版本控制系统:无中央服务器,每个人的电脑都是一个完整的版本库,工作时无需联网,因为版本库就在你自己的电脑上。只需推送各自的修改给对方。
工作区、版本库、暂存区概念:
工作区
在开发一个项目时,主目录就是工作区。
版本库(仓库)
工作区中有一个隐藏目录.git,这个就是git的版本库了。
暂存区
Git的版本库里存了很多文件,其中包括称为Stage或index的暂存区,还有一个git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD。
2.版本库(仓库)
创建版本库
1创建版本库
(1)创建空目录并进入mkdir、cd
(2)把这个目录变成Git可以管理的仓库git init
2添加文件到git仓库
1.使用命令git add < file >,注意,可反复多次使用,添加多个文件;把文件修改添加到暂存区
2.使用命令git commit -m < message >,完成。把暂存区的所有内容提交到当前分支master
二、时光机穿梭
1.介绍
原理:
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
┌────┐
│HEAD│
└────┘
│
└──> ○ append GPL
│
○ add distributed
│
○ wrote a readme file
改为指向add distributed:
┌────┐
│HEAD│
└────┘
│
│ ○ append GPL
│ │
└──> ○ add distributed
│
○ wrote a readme file
然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。
1使用git status命令掌握工作区的状态。
2如果有被修改过用git diff xxx查看修改内容。
2.版本回退
1.HEAD指向的版本是当前版本,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id,上一个版本可以用HEAD ^,上上一个版本就是HEAD ^^。
2.穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本,若嫌输出信息太乱,可以试试加上–pretty=oneline。
3.要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
3.撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout - - file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD < file >,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,前提是没有推送到远程库。
4.删除文件
1.手动删除文件后要从版本库中删除该文件,用命令git rm删掉,并且git commit。
2.误删,从版本库恢复到最新版本$ git checkout - - test.txt
但从来没有被添加到版本库就被删除的文件,是无法恢复的!
三、远程仓库
1.添加远程库
1.关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
2.关联后,使用命令git push -u origin master第一次推送master分支的所有内容;-u 把本地的master分支和远程的master分支关联起来,以后可以简化命令
3.此后,每次本地提交后,就可使用命令git push origin master推送最新修改;
4.如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm < name >命令,建议先用git remote -v查看远程库信息。(解除了本地和远程的绑定关系,并不是物理上删除)
2从远程库克隆
1.必须知道仓库的地址,一般是git://(ssh最快)
2.使用git clone命令克隆。
四、分支管理
1.介绍
分支在实际中的作用?
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
2.创建与合并分支
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
新提交一次后,dev指针往前移动一步,而master指针不变
把dev合并到master上直接把master指向dev的当前提交
删除dev分支完成提交
3.解决冲突
1.$ git merge xxx当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
2.解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
3.用git log --graph命令可以看到分支合并图。
4.分支管理策略
合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
5.Bug分支
1.修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
2.当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
3.在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick < commit >命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
6.多人协作
查看远程库信息,使用git remote -v;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
多人协作的工作模式通常是这样:
1.首先,可以试图用git push origin < branch-name >推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to < branch-name > origin/< branch-name >
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用git push origin < branch-name >推送就能成功!
哪些分支需要推送,哪些不需要?
1.master分支是主分支,因此要时刻与远程同步;
2.dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
3.bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
4.feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
7.Rebase
可以把本地未push的分叉提交历史整理成直线
原理还没弄明白
五、标签管理
1.tag是一个让人容易记住的有意义的名字,它跟某个commit绑在一起,如v1.0
2.tag可以通过历史提交的commit id打在commit上,还可以创建带有说明的tag
3.可以删除,可以推送至远程
六、其他特殊功能
1.忽略特殊文件
忽略某些文件时,需要编写.gitignore
2.配置别名,搭建git服务器,SourceTree等熟练git后再用
总结
以上是对廖雪峰老师的git教程的简单总结,若需要详细学习请详见廖老师课程或官方文档。有兴趣的也可以看看我根据廖老师教程做的代码笔记。
链接: Git教程-廖雪峰的官方网站.
链接: Git官方网站.
链接: 我的代码笔记.