Git使用教程

Git是什么?

Git是目前世界上最先进的分布式版本控制系统。工作原理 / 流程:



Workspace:工作区

Index / Stage:暂存区

Repository:仓库区(或本地仓库)

Remote:远程仓库

SVN与Git的最主要的区别

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

一、安装并配置

配置信息

$ git config --global user.name "username"

$ git config --global user.email "email@example.com"

git config --global color.ui true           //让Git显示颜色,会让命令输出看起来更醒目

二、创建版本库

1)创建一个空目录,作为本地git仓库

$ mkdir mymenu

$ cd mymenu

2)初始化仓库

git init命令把这个目录变成git可以管理的仓库

$ git init

初始化了一个空的仓库,目录下多了.git目录,系统自动创建了唯一一个master分支

版本控制系统只能跟踪文本文件的改动,且编码方式是utf-8

三、git基本操作

1)输入echo "This is a simple practise" > readme.txt,创建一个readme.txt文件。

2)输入git status查看当前版本库状态,会出现红色的readme.txt,代表此文件还未被Git所管理。

3)输入git add readme.txt,将该文件加入缓冲区,如果你确定所有的修改都需要提交,可以使用git add .来加入所有修改。现在用git status查看,将看到文件名变为绿色。

4) 输入git commit -m "This is my first commit!"提交修改,-m后面所带的参数是本次提交信息备注,用来记录本次提交的主要意图。

5)提交成功后,可以用git log查看历史提交记录。每个记录都会有提交id,作者和提交日期。

6)回退历史版本,git reset --hard HEAD^  回退到上个版本;git reset --hard HEAD^^  回退到上上个版本;git reset --hard HEAD~100  回退       到前100个版本 。

7)回退到最新版本q

 版本号,输入git reflog获取到所有版本号,git的版本号是用SHA1计算出来的一个16进制数

四、工作区和暂存区

1)工作区:指的是在电脑里能看到的目录,比如mymenu文件夹或者里面的readme.txt文件(.git隐藏目录版本库除外)就是一个工作区

2)版本库(Repository):.git目录,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。git add是把需要提交的文件添加到暂存区,git commit是把暂存区的所有内容提交到当前分支。

git diff HEAD -- readme.txt            //查看工作区和版本库里面readme.txt文件的区别(已经add过的)                     注意:--两边都有空格

git diff HEAD                  //查看工作区和版本库里面最新版本的区别

git diff  readme.txt     //查看工作区该文件修改前后的区别(还没有add过的)

五、撤销修改

1)丢弃工作区的修改git checkout -- file  (--很重要,没有--,就变成了“切换到另一个分支”的命令):

$ git checkout -- readme.txt                //注意--两边都有空格

git checkout -- .      //丢弃工作区的所有修改

命令git checkout -- readme.txt意思就是,把test.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

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

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

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

$ git reset HEAD readme.txt                    //等于是撤销git add readme.txt 命令

git reset HEAD         //撤销暂存区的所有提交

$ git reset --hard HEAD^ 回退到上个版本                                                                                                                                                                                                             $ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前                                                                                                                                             $ git reset --hard commit_id 退到/进到 指定commit的sha码 

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

六、删除文件

工作区中删除文件

$ rm readme.txt   

1)从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

$ git rm readme.txt   

$ git commit -m "删除文件"

2)如果删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- readme.txt        //用暂存区中的内容或者版本库中的内容覆盖掉工作区

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

PS: 手动删除文件,然后使用git rm <file>和git add<file>效果是一样的。

七、分支管理

1、创建与合并分支

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

1)创建分支 :git branch name(分支名) ; 切换分支:git checkout name(分支名)。

创建dev分支并切换到dev分支

$ git checkout -b dev

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev

$ git checkout dev

2)查看分支  git branch

$ git branch

* dev

  master

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对readme.txt   做个修改,再提交,dev分支的工作完成后,我们就可以切换回master分支:

$ git checkout master

切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变。

3)合并某个分支到当前分支  git merge <name>

$ git merge dev         //切换到master分支,执行合并分支命令

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

4)删除分支  git branch -d <name>

$ git branch -d dev

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。 

2、解决冲突

创建一个新的分支feature1并切换 ,git checkout -b feature1。

将readme.txt修改了一下,加上“AND Simple”,在feature1分支上提交。

切换到master分支。

在master分支上,将readme.txt的最后一行加上“& Simple”,提交。

在master分支上来合并feature1。

     git merge feature1

如果合并有冲突,查看冲突文件,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,在<<<<<<<,=======之间为自己的代码;=======,>>>>>>>之间为别人的代码。如果保留自己的代码,将别人的代码删掉即可。

冲突解决后需要add,commit。

八、远程服务器

Git 最强大的功能之一是可以有一个以上的远程服务器(另一个事实,你总是可以运行一个本地仓库)。你不一定总是需要写访问权限,你可以从多个服务器中读取(用于合并),然后写到另一个服务器中。添加一个远程服务器很简单:

git remote add origin(别名,根据爱好命名) git@github.com:bukas/bukas.git

如果你想查看远程服务器的相关信息,你可以这样做:

git remote -v

git remote show origin(别名)

git remote rm origin         //删除已有的远程库

下一步,就可以把本地库的所有内容推送到远程库上:

git push -u origin master

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

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

从现在起,只要本地作了提交,就可以通过命令把本地master分支的最新修改推送至GitHub:

git push origin master

git push <远程主机名> <本地分支名>:<远程分支名>

如果省略远程分支名,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样以后就可以不加任何参数使用git push。

git push -u <远程主机名> <本地分支名> 例如:git push -u origin master

当已经有一个远程库的时候,我们可以用命令git clone克隆一个本地库:

git clone git@github.com:test/testgit.git

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

九、多人合作流程

多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交(add => commit);

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

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

十、git比较本地仓库和远程仓库的差异

1.更新本地的远程分支

git fetch origin

2.本地与远程的差集:(显示远程有而本地没有的commit信息)

git log master..origin/master

3.统计文件的改动

示例: git diff <local branch> <remote>/<remote branch>

git diff --stat master origin/master

十一、git学习教程

https://www.liaoxuefeng.com/wiki/896043488029600                              //廖雪峰官网

https://git-scm.com/book/zh/v2                          //Git书

https://www.jianshu.com/p/92305d949c0e               //关于Git版本回退的问题

[修改git提交记录](https://blog.csdn.net/u013253075/article/details/104366073)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容