简介: 本篇文章将讲述如何使用git完成代码项目的版本控制以及更好地团队协作开发。

关于Git,你需要知道这些基本概念

什么是Git?官方的定义是:Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。这我的理解是,Git会帮你记录一个目录下(Repositotory 仓库)的文件的每次改动,并以此方便我们对同一个项目中的文件进行协作编辑。

什么是仓库?仓库又称版本库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

Git的最基本的操作:add 和 commit。当我们对于仓库中的文件需要进行添加、编辑、删除的时候,add 命令和 commit 命令是我们每次都要遇到的。我们把文件往Git版本库里添加的时候,是分两步执行的:第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。为什么要分两步呢?我们之前提到Git会记录每次文件的改动,也就是每次commit之后的文件变动。如果你需要对文件在一天里进行反复的修改,或者是一天里对文件逐个编辑修改,你是不会想在commit记录看到一堆记录的。你可能只想看到一天工作做完后的最终版本。所以你可以在暂存区里反复添加删除修改的文件,然后最终一次性Commit一波。

分支是啥呀?分支这个部分可以参考下廖雪峰对这个部分的讲述.我这里也举一个自己想到的例子。假如小宇和小代想基于一个不成熟的app增添几个功能。目前这个app虽然不完善,但是功能都有。两个人商量过后决定,小宇负责新功能A,小代负责新功能B,然后两个人都写好之后一合并就齐活儿。但是在开发过程中,如果两个人同时对仓库下的文件又add又commit,很可能相互干扰。所以索性两个人都基于最原始app开发。巧妙的是,我们之前强调过,git记录的是文件的改动,所以最后两个人把对所有文件的改动一合并就可以啦。但是如果两个人同时对一个文件的一句话改动了怎么办呢?这就涉及到合并冲突的问题啦,需要手动解决。

Github好像非常熟悉呀?Github其实就是Git的远程仓库。如果我们团队在一起开发时,当然希望大家的项目目录,文件变动都能保持一致。那这样的话就可以通过一个远程的Git仓库,每个人在开始工作前都从远程仓库上 clone 一份最新的项目,然后在一天工作后对将改动更新的部分再 push 上去。

Git命令指南

初始化你的本地Repo

首先要创建一个本地的Repo很简单,你可以选择从已经Github上的仓库上 clone 下来,或者初始化一个全新的仓库。

cd path/to/the dir where you want to set as repo/
git init

Add & Commit

如果你的文件夹不是空的,你想通过git管理里面文件夹内的文件的变动,那么执行你的第一次 add & commit

git add . # 把当前文件夹下所有文件全部提交到暂存区
git commit -m "something you want to say like 'It's my first init!'" # 把暂存区的全部文件提交到本地仓库

创建并切换分支

git branch dev # 创建dev分支
git checkout dev # 切换到dev分支
git branch # 查看当前分支

连接并上传到已有的远程仓库

使用以下这条命令本地仓库和Github上创建的远程仓库连接起来。需要注意的是,这条命令只需要执行一次就好,之后在 pull 和push 的时候就不需要执行了,因为本地和远程已经建立了连接。

git remote add origin https://github.com/yourname/your_repo.git

如果要把本地仓库提交到远程仓库,要使用以下命令。

git push -u origin master # 其中origin表示的是远程仓库,master是提交的分支

如果遇到以下的报错,说明你一次提交的内容太大,我的解决方法是通过ssh而不是https上传到远程仓库。可以参考下官方博客.

Enumerating objects: 4610, done.
Counting objects: 100% (4610/4610), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4015/4015), done.
Writing objects: 100% (4610/4610), 12.37 MiB | 602.96 MiB/s, done.
Total 4610 (delta 518), reused 4606 (delta 515)
error: RPC failed; curl 55 SSL_write() returned SYSCALL, errno = 32
fatal: the remote end hung up unexpectedly
fatal: the remote end hung up unexpectedly
Everything up-to-date

版本回退和前进

参考这里

从远程仓库更新

我们很可能会需要从远程仓库更新本地的代码,可能是别人已经做的一些工作。

git fetch origin master # 从远程获取最新版本到本地
git diff master # 查看区别
git merge master # 更新本地的版本

其中是以master作为分支,实际项目中很可能是其他分支(fuzz-dev)。