git初基本用法总结

git是一个分布式版本控制系统git

所谓的分布式管理控制系统就是不存在中央服务器,每个电脑都有一个完整的版本库,不须要联网就能够工做。github

分布式版本控制系统一般也有一台充当“中央服务器”的电脑,但这个服务器的做用仅仅是做为方便你们的修改。没有他,你们同样能够干活,只不过方便了交换而已安全

 

下面说下git的版本库,也能够说是git的仓库,英文repository,其实就是一个能够被git管理起来的目录而已。每个文件的修改,删除git均可以追踪,以便git能够还原每个历史的文件服务器

建立一个版本库很是的简单,选择一个合适的地方app

 

mkdir yangleiPro框架

cd yangleiProssh

pwd分布式

 

pwd命令是显示当前的目录,经过git init命令,把这个目录变成git能够管理的目录。工具

如上,git仓库就搞定,能够看到目录下面多了一个.git的东东。学习

 

有了repository,固然须要往咱们的repository里添加项目文件,能够新建,也能够复制到yangleiPro目录下

用git add命令添加。

若是没有任何显示,就表明你添加成功了

添加完了文件,就能够提交文件了,把文件提交到仓库中。

用git commit命令。

 

一般咱们能够

 

git commit -m "study git"

 

-m后面是对本次提交的说明性文件。

 

学习了建立版本库,add和commit文件。下面来讲下git的操做

 

status命令和diff命令

git status命令可让咱们时刻的知道git的状态,好比一个文件被修改过,或者一个文件没有提交之类的

git diff命令顾名思义就是查看difference,也就是说git diff能够查看咱们所修改的内容

 

版本回退

当咱们提交了不少次文件后,想看看历史版本都有哪些,咱们能够运行git log命令

git log命令用于现实从近到远的提交日志。

若是嫌输出的信息太多,能够用git log --pretty=oneline,此时你看到的一大串相似3628164...882e1e0的是commit id(版本号)。

每次咱们提交一个版本,git就自动把他们串成一个时间线

回到某一个版本

首先git知道当前是哪个版本,在git中用HEAD表示当前版本,上一个版本就是HEAD^,上上个版本就是HEAD^^,固然往上100个版本写100个^比较容易数不过来,因此写成HEAD~100。

git reset --hard HEAD^

 

若是想再从新恢复以前的版本,能够指定commit的id git log --pretty=oneline能够看到,

git reset --hard 3628164

ID那么长,不须要写全的,git会自动去找。

Git的版本回退速度很是快,由于Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

 

注意,咱们从这两节中能够了解到:

 

HEAD指向的版本就是当前版本,所以,Git容许咱们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

穿梭前,用git log能够查看提交历史,以便肯定要回退到哪一个版本。

要重返将来,用git reflog查看命令历史,以便肯定要回到将来的哪一个版本。

 

下面说下git的基本概念

工做区:这个简单,其实就是你电脑上的那个目录

版本库:工做区终有一个.git的文件,这个不属于工做去的,而是git的版本库

暂存区:stage或index,一半存在.git目录下的index文件中,因此咱们把暂存区也叫作索引index

 

git的版本库中有不少东西,其中最重要的称为stage,也叫index,暂存区,还有git为咱们自动建立的第一个分支,master,以及指向第一个分支的指针HEAD。

咱们往git版本库中添加文件的时候一般分为两步

第一步:git add ,其实是把文件添加到暂存区

第二步:git commit 其实是把stage中全部的文件提交到当前的分支上。

由于咱们建立版本库的时候,git会帮咱们建立一个惟一的分支,因此如今咱们提交到的分支就是git帮咱们建立的master分支上。

 

固然,咱们能够这么理解:须要提交的文件统统的放在stage暂存区中,而后一并提交到分支上。并且一提交后暂存区就没有任何内容了,而commit的内容也是从工做去中add到的stage中的内容

 

撤销修改

git checkout -- file能够丢弃工做区的修改

git checkout -- readme.txt的意思就是把其在工做去的修改所有撤销掉

这里有两种状况:

 

一种是readme.txt自修改后尚未被放到暂存区,如今,撤销修改就回到和版本库如出一辙的状态;

一种是readme.txt已经添加到暂存区后,又做了修改,如今,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态

 

删除文件

在git中删除其实也是一种对文件的修改

通常状况下,你一般直接在文件管理器中把没用的文件删了,或者用rm命令删了

rm readme.txt

这个时候git知道你把文件给删了,由于工做区和版本库不一致了,用git status会告诉你哪些文件被删除了

因此如今你有两条路能够选择:

一、肯定删除这些东西:git rm readme.txt

二、刚刚删除错了,须要恢复以前的工做区内容,git checkout -- readme.txt

命令git rm用于删除一个文件。若是一个文件已经被提交到版本库,那么你永远不用担忧误删,可是要当心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

 

下面说下git的远程仓库,其实所谓的远程仓库就是借用Github提供的git仓库托管服务

关于在Github上创建远程仓库这里就很少说了,百度也都是有不少的,并且通常咱们的项目也是创建好的

简单介绍下把本地仓库的东东推送到远程仓库的作法吧

本地库的全部内容推送到远程库上

git push -u origin master

把本地库的内容推送到远程,用git push命令,其实是把当前分支master推送到远程

因为远程库是空的,咱们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在之后的推送或者拉取时就能够简化命令。

而后用命令git push origin master就能够了

注意:要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;关联后,使用命令git push -u origin master第一次推送master分支的全部内容;此后,每次本地提交后,只要有必要,就可使用命令git push origin master推送最新修改

 

当你第一次使用Git的clone或者push命令链接GitHub时,会获得一个警告:

 

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.

RSA key fingerprint is xx.xx.xx.xx.xx.

Are you sure you want to continue connecting (yes/no)?

  这是由于Git使用SSH链接,而SSH链接在第一次验证GitHub服务器的Key时,须要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车便可。

 

  Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

 

Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

  这个警告只会出现一次,后面的操做就不会有任何警告了。

 

下面说下git的clone,这是咱们如今作项目的第一步,都是从clone下来项目经理已经创建好的项目框架

可是若是你是创建远程库的人,从远程库克隆,就须要咱们先建立远程库,在github建立一个新的gitskills仓库,咱们勾选Initialize this repository with a README,这样GitHub会自动为咱们建立一个README.md文件。建立完毕后,能够看到README.md文件

 

真正的clone很简单,一个命令

git clone http://cloneurl

 

注意:要克隆一个仓库,首先必须知道仓库的地址,而后使用git clone命令克隆。Git支持多种协议,包括https,但经过ssh支持的原生git协议速度最快

 

下面说下分支的管理,这个多是咱们用的最多的地方了

 

看到这里,咱们已经知道,咱们的每一次提交,git都会把它串成一条时间线,这条时间线就是一条分支。目前来讲,咱们只说道一个分支,master。

HEADE严格来讲不是指向提交,而是指向master,master才是指向提交的,因此HEAD指向的应该是当前的分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能肯定当前分支,以及当前分支的提交点

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也愈来愈长,当咱们建立新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上,接着上面的说法,如今对工做区的修改和提交就是针对dev分支了,好比新提交一次后,dev指针往前移动一步,而master指针不变。假如咱们在dev上的工做完成了,就能够把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并,因此Git合并分支也很快!就改改指针,工做区内容也不变!和新建分支是同样同样的。

 

合并完分支后,甚至能够删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,咱们就剩下了一条master分支

 

上面说的是指令和git分支管理的原理,下面说下具体的实现和指令:

 

首先咱们建立一个分支,而后切换到这个分支上:

git branch yangleiDev

git checkout yangleiDev

固然这两句指令也能够直接写成一句:git checkout -b yangleiDev

 

而后咱们能够用git branch来查看目前全部的分支,而且能够看到你如今所在的分支上。

 

而后咱们能够在本身的分支上add,commit。。。各类操做

而后咱们切回master分支,查看下内容,我擦!你会发现刚刚的提交什么的都不在了。。。

莫慌!由于你刚刚提交的是在本身的分支上,yangleiDev,而你如今在的是master分支上,因此这个时候咱们须要作的就是把master指针移到本身新建的分支上,简单的说,就是分支的合并:git merge yangleiDev

git merge命令用于合并指定分支到当前分支

 

合并完成后就能够看到master分支上有了以前咱们提交在yangleiDev分支上的东西了,这个时候就能够删了yangleiDev分支了:git branch -d yangleiDev

由于建立、合并和删除分支很是快,因此Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工做效果是同样的,但过程更安全。

命令比较多昂,这里简单总结下:

 

查看分支:git branch

 

建立分支:git branch <name>

 

切换分支:git checkout <name>

 

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

 

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

 

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

 

其实这么来讲,通常操做就搞定了。。。可是!!!通常来讲,因为是多人合做,因此这里咱们通常都会遇到代码冲突

所谓的代码冲突就是不一样的分支上有了新的提交,致使git没法执行快速合并

 

用带参数的git log也能够看到分支的合并状况:

git log --graph --pretty=oneline --abbrev-commit

 

用git log --graph命令能够看到分支合并图。z

 

若是你有一个bug任务,你想建立一个分支issue-101来修复它,可是你当前正在dev上进行的工做尚未完成而不能提交,bug须要如今修复,因此如今你须要暂停dev上工做,Git提供了一个stash功能,能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做:$ git stash。

 

Git把stash内容存在某个地方了,可是须要恢复一下,有两个办法:

 

一是用git stash apply恢复,可是恢复后,stash内容并不删除,你须要用git stash drop来删除;

另外一种方式是用git stash pop,恢复的同时把stash内容也删了;

 

对了,这里的分支有时候有个地方仍是须要注意下的:

开发一个新feature,最好新建一个分支;若是要丢弃一个没有被合并过的分支,能够经过git branch -D <name>强行删除

 

下面介绍下关于分支的推送

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,而且远程仓库的默认名称是origin

 

这里说道的远程库,若是须要查看远程库的信息,能够用git remote 活着用 git remote -v 查看更详细的信息。

 

推送分支

就是把该分支上的全部本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上

git push origin yourBranchName

 

master分支是主分支,所以要时刻与远程同步;

dev分支是开发分支,团队全部成员都须要在上面工做,因此也须要与远程同步;

bug分支只用于在本地修复bug,就不必推到远程了,除非老板要看看你每周到底修复了几个bug;

feature分支是否推到远程,取决于你是否和你的小伙伴合做在上面开发。

 

在咱们如今的开发中,因为都是多人合做,因此一半的工做模式应该是这样子的:

 

首先,能够试图用git push origin branch-name推送本身的修改;

若是推送失败,则由于远程分支比你的本地更新,须要先用git pull试图合并;

若是合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

 

若是git pull提示“no tracking information”,则说明本地分支和远程分支的连接关系没有建立,用命令git branch --set-upstream branch-name origin/branch-name

 

其实说到这里就基本知足咱们的工做须要了。

虽然git只是一个工具,可是却实实在在的写了一本书,关于git的一些高级的应用,其实我也不是很清楚,后续在研究补充,相似于git的标签,自定义git等等等操做。

 

好吧!先记录到这里吧~

相关文章
相关标签/搜索