欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一篇文章入门Git

程序员文章站 2024-03-23 08:31:28
...

Git前世今生

大家可能听说过CVS、SVN这些免费的版本控制系统。但是集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统虽然好用,但是是付费的。LInus(Linux的创始人)本来是使用BitKeeper来管理庞大的linux代码库,但是因为手下的人师徒**BitKeeper的协议,被BitMover公司逮住了,收回Linux社区的免费使用权。Linus因此花了两周时间自己用C写了一个分布式的版本控制系统,这就是Git的诞生。之后Linux系统的源码就由GIt管理了。08年,GitHub网站上线,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

集中式vs分布式

集中式版本控制系统,版本库是集中存放在*服务器的,,所以你在操作时,先从*服务器把最新的版本下载过来,再操作,然后再把操作好的推送给*服务器。所以这样就存在不少弊端。首先是必须要互联网才能工作,如果在局域网中,带宽够大,速度就够快,但是在互联网中,网速慢的话,根本无法满足现在的速度需求。同时安全性也不好,如果*处理器坏掉了,GG。
分布式版本控制系统,没有*服务器,所以工作的时候就不用联网了,安全性也得到保证。

linux下使用git

首先看看自己有没有装git

$ git   

如果没装,linux会告诉你怎么安装,或者直接

$ sudo apt-get install git

接下来创建版本库

$ mkdir gitrep
$ cd gitrep
$ pwd   //pwd命令用于显示当前目录。
$ git init   //把这个目录变成Git可以管理的仓库
Initialized empty Git repository in /home/tbs/test/gitrep/.git/
$ touch readme.txt
$ gedit readme.txt
$ git add readme.txt    //告诉git把文件添加到仓库
$ git config --global user,email "aaa@qq.com"   //输入配置信息
$ git config --global user.name "youname"   //输入配置信息
$ git commit -m "write a readme file"  //输入本次提交的说明,可以从历史记录中找到改动记录  一次可以提交多个文件
//接下来我们修改一下txt文件试试
//把文件内容随便改改
$ gedit readme.txt
$ git status   //查看现在的状况,发现现在有更改但是没有提交
$ git diff    //查看更改了个啥
$ git add readme.txt 
$ git commit -m "new change"

工作区和暂存区

工作区:working directory 就是在电脑中能看到的目录
版本库:repository 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,最重要的就是称为stage(index)的暂存区,还有自动创建的第一个分之master,以及指向master的一个指针HEAD
一篇文章入门Git
所以我们上面的操作,就可以解释清楚了。git add就是把文件添加到暂存区。git commit就是把暂存区的所有内容提交到当前的分支里面去。

修改

版本回退

$ git log   //告诉版本的历史记录
//接下来会退到上一个版本
$ git reset --hard HEAD^   //HEAD表示当前版本,HEAD^表示上一个版本,一次类推,HEAD~100表示上一百个版本。或者直接输入commit_id

撤销修改

$ git checkout -- readme.txt
//这句话的意思,把readme.txt文件在工作区的修改全部撤销,有两种情况:
//1.是readme.txt自动修改还没有被放到暂存区,现在,撤销修改就回到版本库一模一样的状态。
//2.是readme.txt已经添加到暂存区后,又做了修改,现在撤销修改就回到添加到暂存区后的状态。
$ git reset HEAD readme.txt    //可以把暂存区的修改撤销掉unstage,重新放回工作区。

删除

$ rm test.txt   //删除某个文件
//确实要删除这个文件
$ git rm test.txt    //删除该文件
$ git commit -m "remove test.txt"
//删错了
$ git checkout -- test.txt   //因为在版本库里还有,所以可以很轻松的把误删的文件回复到最新的版本中去
//git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以一键还原。

远程仓库

由于本地Git仓库和Github仓库之间的传输是用过SSH加密的。所以需要一点设置:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看有没有id_rsa和id_rsa.pub这两个文件,如果没有

$ ssh-****** -t rsa -C "aaa@qq.com"
//在用户主目录中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的密匙对。前一个是私钥,后一个是公钥。

第二步:登录github,打开account setting,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意title,在Key文本框中粘贴id_rsa.pub文件的内容

添加远程库
之后在自己的github账号下创建一个库。
然后我们就可以把本地库关联到github上了。首先进入我们的本地库的目录下。之后建立远程连接。

$ git remote add origin aaa@qq.com:yourusername/test.git //github.com不能丢
$ git push -u origin master  //把本地库的所有文件关联到github上

克隆远程库
对已经存在github上的库进行克隆,我们可以克隆到本地。

$ git clone aaa@qq.com:yourusername/test.git

分支管理

创建和合并分支
一篇文章入门Git
一篇文章入门Git
一篇文章入门Git
一篇文章入门Git
一篇文章入门Git
步骤如下:
首先创建dev分支,然后切换到dev分支

$ git checkout -b dev   //checkout + -b表示创建并切换
$ git branch    //查看当前分支
//之后对里面的文件做一些修改
$ git add readme.txt
$git commit -m "branch test"
//dev分支修改完毕,切回master
$ git checkout master
//然后把dev分支的成果合并到master分支上
$ git merge dev   //用于合并指定分支到当前分支。
//合并完成后,可以删除dev分支
$ git branch -d dev

因为创建合并删除分支非常块,而且更安全,所以推荐使用分支完成某个任务,合并后再删掉分支。

//还有其他的命令可以完成这个切换行为
$ git switch -c dev    //创建并切换到dev分支
$ git switch master   //直接切换到已经有的master分支

分支管理策略
通常,合并分支的时候,git会用fast forward,但是这种模式删掉分支后,会丢失分支信息。

$ git switch -c dev //创建分支
$ git add readme.txt
$ git commit -m "new change"
$ git switch master //回到主干
$ git merge --no-ff -m "merge without delete" dev //禁用fast forward
//我们查看分支历史
$ git log  //分支就如下图所示

一篇文章入门Git
所以我们有分支策略:最好不要在master上干活,在dev上干活就好。

bug分支
Git提供了一个stash功能,可以把当前工作现场储藏起来,等以后恢复后继续工作。

$ git stash //把自己的工作进程保存下来,后面可以进行bug的修改
//修改完成后
$ git switch dev 
$ git status 
$ git stash list   //Git把stash存在某个地方了,需要恢复
$ git stash pop   //恢复的同事把stash内容也删掉了

你在主分支上修改的bug,在这时并没有同样在dev上修改,所以我们需要把对应bug修复的提交到dev分支

$ git branch
$ git cherry-pick 4c8053e2  //bug对应的commit_id

自定义Git

忽略特殊文件
.gitignore文件,把想要忽略的文件名填进去,Git就会自动忽略这些文件。忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
相关标签: Git github