集中式和分布式的区别
git是分布式版本控制。与分布式相对应的就是集中式,SVN就是集中式的管理。
集中式
集中式版本控制系统,版本库是集中存放在中央服务器的,要进行相应操作的时候,需要从中央服务器中获取最新的版本,结束相应的操作后再将自己所修改的代码推送到中央服务器。
集中式缺点:
- 最大的缺点在于需要互联网才能进行工作
分布式
分布式版本控制没有“中央服务器”,每个电脑都是一个独立的版本库,这样你工作的时候就不需要互联网了,因为版本库就在你的电脑上,相当于就是你的本地文件了。
创建版本库
版本库又称为仓库,英文名repository,可以简单理解成一个目录,这个目录下所有的文件都将被git管理起来,每个文件的修改,删除,git都能进行跟踪。
初始化一个Git仓库,使用git init
命令
添加文件到仓库,可以分成两步:
1.使用命令git add <file>
。注意:可以使用多次,也就是可以添加多个文件。
2.使用命令git commit -m <message>
,完成提交
查看仓库状态
git status
命令可以让我们时刻掌握仓库当前的状态
git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式
版本回退
版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log
命令查看
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
git log --pretty=oneline
上面打印出来的信息中commit id是比较重要的,版本回退的时候需要用到
怎么回退版本呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
然后可以使用git reset
命令进行回退版本
git reset --hard HEAD^
如果回退完,又想回到之前的版本的话,也就是在git log
没有办法查看到commit id 了。那么我们可以使用git reflog
查看历史命令,以便确定回到未来的哪个版本
git reset --hard [版本号]
工作区和暂存区
工作区也就是你在电脑上能够看到的目录
版本库
工作区中有一个隐藏目录.git,这个不算工作区,而是git的版本库。
git的版本库中存放了很多东西,其中最重要的就是stage(或者叫做index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针——HEAD。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
撤销修改
如果你进行了一些“傻逼操作”,你想想撤销的时候应该怎么做呢?可以使用(像如果误删了某个文件,也可以使用这个命令进行撤销,是不是很强)
git checkout -- file
远程仓库
git是分布式版本控制系统,同一个git仓库,可以分布到不同的机器上。如何进行分布呢?最早是有一台机器有一个原始版本库,此后,别的机器可以克隆这个原始版本库,而每台机器的版本库都是一样的,没有了主次之分。
为什么GitHub需要添加SSH key
因为GitHub需要确定识别出提交人是你,而不是别人冒充的,而git支持的是SSH协议,所以GitHub只要知道了你的公钥,就可以确定是你本人的操作了。当然你可以添加多个key,这样你可以在家办公,也可以在宿舍办公,只要这两台电脑的key都添加到了GitHub上,就都可以往GitHub上推送了。
添加远程仓库
我们可以在GitHub上新建一个远程的仓库,右上角找到“Create a new repo”按钮,创建一个新的仓库。
如何将远程仓库和本地的仓库关联起来呢?
可以在本地仓库目录下使用命令:
git remote add origin git@github.com:guangpingfeng/git学习笔记.git
特别注意的是:guangpingfeng记得替换成自己的GitHub账户名,否则你在本地关联的就是我的远程GitHub,关联是没有问题,但是你是没有办法进行推送的,因为你的SSH Key公钥不在我的GitHub列表中。
添加后,远程仓库的名称就是origin,这是git默认的叫法,也可以修改成别的。
然后就可以将本地的仓库推送到远程仓库了,第一次使用如下命令进行推送
git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
之后进行推送直接可以使用
git push origin master
分支管理
意义
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
创建和合并分支
一开始的时候,master分支是一条线,git使用master指向最新的提交,再用HEAD指向master,就能确定当前的分支,以及当前分支的提交点。
现在我们可以新建一个dev的分支,并将其切换到dev分支
git checkout -b dev
git checkout
命令加上-b就相当于表示创建并切换,相当于以下两条命令
git branch dev // 创建
git checkout dev // 切换
使用git branch
可以查看当前有哪些分支。
我们可以在当前分支上进行修改代码并提交,注意,这个时候我们修改的是dev分支上的代码,所以当你切换回去的时候,master分支的代码还是之前的。那么要怎么将其合并呢?
先切换回master分支
git checkout master
然后使用命令
git merge dev
合并完成之后,我们觉得dev分支没有用处了,那么我们可以删除dev分支了
git branch -d dev
PS:鼓励使用分支
解决冲突
Bug分支
当遇到bug的时候,我们可以选择新建一个bug分支进行解决问题,解决完成之后再切换回原来的分支
如果工作到一半,我们不想那么快提交的时候,我们可以使用git stash
将当前的工作现场储藏起来,等以后再恢复现场并进行工作
我们可以通过git stash list
进行查看
恢复的时候有两种方法,一种是:
git stash apply // 恢复
git stash drop // 删除
或者一步到位:
git stash pop // 恢复的同时将其删除
feature分支
在软件开发过程中,我们会不断的接收到功能的需求和功能,如果一个功能比较大的时候,我们一个好的做法是新建一个feature分支,在上面开发,完成后,合并,最后删除该分支。
但是有时候我们开发到一半的时候,该功能就不要了,那么我们可以直接使用以下命令进行删除,注意不是d,而是D。强行进行删除
git branch -D feature-vulcan
多人协作
查看远程库的状态,使用git remote
或者使用git remote -v
查看比较详细的信息
推送分支
推送分支,就是将本地上该分支的所有提交推送到远程仓库。推送的时候,要制定本地分支,这样git就会将该分支推送到远程库对应的远程分支上
git push origin master // 推送master分支
git push origin dev // 推送dev分支
抓取分支
当你的代码推送到远程失败(因为你的小伙伴最新的推送和你试图推送的提交有冲突),可以先选择使用git pull
将最新的提交拉取下来,在本地合并,解决冲突后,再进行推送。
注意:如果你没有指定本地dev分支和远程origin/dev分支的连接,设置两者的连接
git branch --set-upstream-to=origin/dev dev
rebase
一般都是要将master分支上的代码rebase到自己的分支上,通常的命令如下(注意当前的分支应该是自己的分支)
git rebase master
如果有冲突就解决冲突,解决完
git add .
git rebase --continue # 加上--continue参数让rebase继续处理
标签管理
使用git tag <tagname>就可以打一个新的标签。
git tag v1.0
默认标签是打到最新提交的commit上的,但是有的时候,如果忘记打标签,我们可以根据commit_id进行添加
git tag v0.9 f52c633
如何查看标签?
git tag
具体某个标签的详细信息?
git show vo.9
如何对标签名进行说明?
git tag -a v0.1 -m "version 0.1 released" 1094adb
-a制定标签名,-m指定说明的文字
如何删除标签?
git tag -d v0.1
创建的标签都只是存储在本地,不会自动的推送到远程。所以打错的标签可以在本地进行安全删除。
如何推送标签到远程?
git push origin <tagname>
git push origin v1.0
命令git push origin :refs/tags/<tagname>
可以删除一个远程标签。
git push origin :refs/tags/v0.9
结束语
使用git进行代码版本控制已经成为程序员必不可少的技能之一,如何在团队协作高效的管理,遇到冲突怎么解决,以上做了一定的总结与归纳。以上内容主要参考廖雪峰的教程,内容比较基础,适合新手学习。
参考:
廖雪峰教程 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000