Git学习笔记

集中式VS分布式

CVS及SVN都是集中式的版本控制系统,版本库是集中存放在中央服务器,你开始一个项目时要先从中央服务器取得最新的版本,然后开始修改代码,修改之后再把自己的代码推送到中央服务器。

Git是分布式版本控制系统,没有“中央服务器”,每个人的电脑上都是一个完整的版本库,没有主次之分,工作的时候,不需要联网,因为版本库就在自己的电脑上。

你在自己电脑上改了文件A,你同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务的作用仅仅是用来方便“交换”大家的修改,没有这个服务器也能正常工作。

安全性:分布式版本控制系统的安全性跟高,因为每个人电脑里都有完整的代码库,一个人的电脑坏了,随便从他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,就无法继续正常工作了。

Git安装

在Linux上安装Git

可以使用安装包管理工具(apt-get、yum 等)进行安装,或者源码安装…不赘述

我们使用的测试服务器上已经统一安装好了git,通过git --version可以看到当前版本

在Windows上安装Git(Mac平台上安装…略)

在Windows上使用Git,可以从Git官网:https://git-scm.com/downloads直接下载安装程序,然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,跳出一个类似命令行窗口的东西,就说明Git安装成功!

Git工作原理

工作区(Working Directory)

dengjie01@YWQSH-L1115 MINGW64 /     是个工作区,就是在电脑里能看到的目录

暂存区(stage, 或index)

一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)

版本库(Repository)

工作区有一个隐藏目录.git(ls –a可以看到)是Git的版本库。

比如d盘下的xuexi文件夹,通过git init把这个目录变成git可以管理的仓库,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

Git会自动创建第一个分支master,以及指向master的一个指针HEAD

把文件往git版本库里添加有两步:

第一步是用git add把文件添加进去,可以分步把多个文件添加,实际上就是把文件添加到暂存区

第二步是用git commit提交更改,git commit -m ‘修改了啥玩意’,实际上就是把暂存区的所有内容提交到当前HEAD指向的分支。-m 后面输入的是本次提交的说明,方便从历史记录里找到改动记录。

比如在xuexi下修改了readme.txt,并且新添加LICENSE,此时工作区的状态:

 

readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked

使用命令git add readme.txt LICENSE之后,用git status再查看一下:

所以git add就是把所有把要提交的所有修改放到暂存区

最后执行git commit就可以一次性把暂存区的所有修改提交到当前分支

Git常用命令

文件本身

git status  可以查看工作区的状态

git diff file  可以看出某文件修改的内容

git log  显示从最近到最远的提交日志    加上--pretty=oneline   可以一行行简单显示

git rest --hard commit_id   回退到某个版本

回退到上一个版本 //git rest --hard HEAD^   回退到上上个版本 //git rest --hard HEAD^^

git relog  查看命令历史

git checkout -- file   //放弃工作区的修改,有两种情况:1.文件修改后没有放到暂存区,撤销修改就回到和版本库一样的状态   2.文件已经放到暂存区,又作了修改,撤销修改就回到添加到暂存区后的状态

git reset HEAD file   //把暂存区的修改撤销,重新放回工作区

git rm file   //用于删除某文件

Git分支管理

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>     git branch -D <name> 强行删除                  

Git把每次提交串成一条线,这条线就是主干分支,master指向最新的提交,HEAD指向master,就能确定当前分支,以及当前分支的提交点。

若新建一个分支dev, 此时相当于新建一个指针叫dev,指向和master相同的提交,再把HEAD指向dev,表示在当前分支dev上。

之后,对工作区的修改和提交就是在dev上

比如新提交一次后,dev指针往前移动一步,而master指针不变

dev分支工作完成了,把dev合并到master分支。切换到master分支,HEAD此时指向master,使用命令git merge dev,直接把master指向dev的最新提交,完成合并。

这是快速合并模式,删除dev分支后,看不出哪些提交是通过分支完成的

非快速合并模式,使用命令git merge --no-ff -m "普通模式合并" dev    -m添加本次分支合并的描述

 

若合并分支时有冲突,即master分支和当前分支都对某文件都有提交,需要手动解决冲突,再合并。

git log --graph   //可以看到分支合并图

远程仓库的默认名称是origin,查看远程库信息:git remote -v  (可以看到fetch和push的origin地址)

在本地创建和远程分支对应的分支:git checkout -b branch-name origin/branch-name

推送分支:git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交

抓取远程分支:git pull   (pull=fetch+merge)

如果git pull失败,原因是没有指定本地dev分支与远程origin/dev分支的链接,使用git branch --set-upstream branch-name origin/branch-name

如果git pull有冲突,需要手动解决,解决后,提交,再push

git pull origin branch-name   拉取指定分支代码合并到当前分支

Git pull冲突主要情况:

1.本地分支文件被自己在测试环境修改了,和远端分支文件不一致    git checkout -- file 放弃自己在工作区的修改,再 git pull

2.本地分支和远端分支都对同一个文件进行了   不知道怎么改代码解决冲突,只能git reset --hard oringin/branch-name  将本地HEAD指向最新下载的分支(这个在完全舍弃本地的情况下是万能的)

要及时用git status分析报错冲突的原因是啥

Git远程库

如果你想通过 Git 分享你的代码或者与其他人合作。 你就需要将数据放到一台其他人也能够连接的服务器上。Github就是这样一个免费存放的服务,当然也可以自己在linux系统上搭建一个git服务器,然后配置好相关配置文件…(自行百度)

Github网站是提供Git仓库托管服务的,只要注册一个Github账号,就能免费获得Git远程仓库。

本地Git仓库和Github仓库之间传输是通过SSH加密,如何连接?

第1步:创建SSH Key。打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C youremail@example.com   (Github注册邮箱)

在用户主目录下,会生成.ssh目录,下有id_rsa(私钥)和id_rsa.pub(公钥)这两个文件

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。(允许添加多个Key)

为了验证是否成功,输入以下命令:$ ssh -T git@github.com

下图说明已经成功连上Github

1.先有本地库,后建远程库与之关联

新init一个本地仓库xuexi,下面有11.txt文件

然后登陆GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库xuexi

将这两个仓库进行关联起来,就能进行远程同步了。远程库是空的,加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,之后的推送操作就可以不用加-u

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:

之后,只要本地做了修改提交,就可以通过命令:git push origin mster,把本地master分支的最新修改推送至GitHub远端库

2.先有远程库,再克隆到本地

假设研发在Github上新建了一个远程库mushroom,远程库准备好了,下一步是用命令git clone克隆一个本地库

可以使用git clone git@github.com:Derdai/mushroom.git 后面接需要存放的路径

执行成功后,cd mushroom目录,可以看到远端库的内容   

实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https协议。所以还可以git clone https://github.com/Derdai/mushroom.git 同样能把远端库克隆下来

 

公司内部可能只开放http端口,无法使用ssh,所以一般我们在测试环境克隆远程mushroom node库的命令是:

git clone http://xxx:xxx@xxxx/game_mushroom.git

SoureTree客户端拥有可视化界面和完整的git功能,可从官网下载:https://www.sourcetreeapp.com/ 使用体验

测试常用的,拉取远端仓库下来方便查看整个项目代码,有更新可以及时拉取

点击new tab,再点击Clone,填写远程库地址:

http://xxx:xxx@xxxx/game_mushroom.git(自动识别是git仓库),填写本地存放路径,克隆成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值