Git-极简入门

Git应该是一个程序员必备的技能,但居然有人不会。最近在准备实习,在对自己的技术进行查漏补缺(女娲补天),有不少同学也跟我一样。因此前几天,一个同学问我你会Github吗?我说会啊!他用敬佩的眼神痴痴地看着我,我淡定的说其实挺简单的。

Git作为必备技能,为什么会有人不知道呢?我想大概这是个工具吧,所以学校里也不教,大家也就不学。想学的呢,网上看了一些教程,又非常的晦涩难懂,其实入门还是很简单的(我也只会一些基本操作,目前够用),于是今天我就翻开我的笔记本,把之前学习Git做的一点点笔记分享给大家。

Git是什么?

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.(官网复制来的)

Git是一个开源免费的版本控制器,不管是大项目还是小项目,都可以又快又准的把你治的服服贴贴。

这是linux之父的一周还是两周的一个作品,因为Linux内核开源后参与的人非常多,人工的合并代码很麻烦且容易出错,当时已有的版本控制库还想跟linux收保护费,于是就有了Git,具体来历自己去搜搜吧,我就不复制了。

那么版本控制是什么意思呢??

为什么我们平时用不到呢,因为我们在学校里写的代码,一共就一个版本,一般都是独立完成,项目还很小,写完以后作用就不大了。

但是大项目就不一样了,有许许多多的版本。比如说绝地求生

  1. 垃圾服务器天天维护,游戏天天出Bug,就得天天更新,所以把历史版本,变动记录下来是有意义的,万一哪天改完了发现游戏都进不去了,还可以切换到昨天的版本让玩家玩玩Bug版本。
  2. 一部分程序员得研究怎么防外挂,一部分要研究怎么出新地图,新玩法,那么两部分人怎么合作呢??

Git安装

Linux下:

sudo apt-get install git

Windows下:

百度

Google

安装之后配置一下个人信息:

git config --global user.name "wuyanzu"
git config --global user.email "xxxx@xx.xxx"

理解三个区域

理解Git如何工作首先要弄明白Git的三个区域,相当于三个不同的目录

  1. 工作目录
  2. 暂存区
  3. Git仓库

工作目录

工作目录就是我们保存代码的那个目录

暂存区

一个介于工作目录和Git仓库之间的目录,就当临时仓库吧

Git仓库

保存每个版本的仓库,每一个版本都完整保存,内部有一个HEAD指针

一般的工作流程

  1. 在工作区写代码,修改代码

  2. 将修改的代码放入暂存区

  3. 将暂存区的改动提交到Git仓库

一个完整流程遇到的命令介绍

Git是有图形操作界面的,但是一般都学命令操作,命令操作学会了图形自然而然就会了。

首先我们创建一个目录,用于放代码,并初始化Git仓库。

mkdir project_1
cd project_1
git init
# output: 初始化空的 Git 仓库于/home/chenfeikun/project_1/.git/

git init的作用是初始化,告诉Git这个目录以后要被控制,被记录,现在目录里会多出一个.git文件夹,是一个隐藏文件,这个文件夹以后会自动记录各种操作,不要动它就行。

然后在目录里开始创作,写了一个README和一个hello.py

chenfeikun@cfk-ubuntu:~/project_1$ ls
hello.py  README.md

执行git status查看文件变动情况

chenfeikun@cfk-ubuntu:~/project_1$ git status
位于分支 master

初始提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

    README.md
    hello.py

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

git发现我们添加了两个文件,还没有被追踪,可以用git add追踪。追踪呢就是让git一直注意着这个文件,任何改动都会被发现,git add就把文件放入我们之前提到的暂存区。

执行git add <file_name>或git add *

chenfeikun@cfk-ubuntu:~/project_1$ git add README.md hello.py 

这个没有提示,所以我们可以再用git status来查看一下现在的状态。

位于分支 master

初始提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)

    新文件:   README.md
    新文件:   hello.py

可以看到这两个文件已经提交到暂存区了,如果突然发现hello.py需要修改,或者是机密文件不能传出去,那么可以按提示里的命令取消暂存,或者修改hello.py后重新执行git add

一切OK后就需要提交到Git仓库了,提交到这里面就算保存了第一个版本了,后续的提交就算是新的版本了。

使用git commit -m 'xxx'提交至Git仓库

chenfeikun@cfk-ubuntu:~/project_1$ git commit -m 'add two new file'
[master (根提交) 7319582] add two new file
 2 files changed, 5 insertions(+)
 create mode 100644 README.md
 create mode 100644 hello.py

-m的作用就是在提交的时候附加一个提交的说明,这样以后找历史版本会方便一点, xxx就是附加的内容。

仔细看提交之后的输出,[]里有一串字符串7319582(不全是数字),这里显示的其实只是前面的一部分,完整的还很长。这个字符串是标识每一次提交的,也就是每一次提交都会生成一个唯一的字符串,在同一个仓库里这个字符串只会出现一次。这个字符串可以用于以后切换版本,只需要输入前面几位就行,不需要补全。记不住也没关系,有命令可以查询这个唯一标识。

回到过去

上面我们介绍了从工作目录到暂存区再到Git仓库的过程,那么如何反过来呢?

从Git仓库到暂存区

git reset --mixed HEAD
git reset --soft HEAD~
git reset --hard HEAD~~
git reset HEAD~3
git reset 7319582(指定版本的唯一标识串)

HEAD在Git仓库中指向的是最新版本,HEAD~是最新版本的上一个版本,HEAD~~是上两个版本,但是总不能写很多个~~~~~~,所以可以写成HEAD~N,N就是~的个数。

git reset就是把Git仓库中的版本,覆盖暂存区的版本,甚至覆盖工作区的版本(有危险的,你修改的内容可能全部丢失)。

mixed,soft,hard三个参数就是决定如何覆盖的,其中mixed是默认选项,也就是不输入参数时的选项。

git reset HEAD~举例说明三种参数各自情况

soft:移动HEAD指针指向上一个版本,暂存区,工作区无变化

mixed:移动HEAD指针指向上一个版本,并用HEAD当前指向的版本覆盖暂存区,工作区域不变(注意这时候使用git status会指出工作区变化了,那是因为工作区与最新的暂存区不一样了,本质是暂存区改变了)

hard:移动HEAD指针指向上一个版本,并用HEAD当前指向的版本覆盖暂存区和工作区(危险,工作区修改会丢失)

查询版本ID号

每一次提交到Git仓库都有一串哈希值,就叫它ID号吧。怎么查询呢,有两个命令git loggit relog

假设提交了四次,Git仓库内是这样的:A->B->C->D,HEAD->C。

因为HEAD指向了倒数第二次提交的C版本,那么使用git log只会显示出C之前的所有提交,使用git reflog才会把所有的提交都显示出来。

HEAD指向C: git reset a9a00d

reflog:

chenfeikun@cfk-ubuntu:~/project_1$ git reflog
a9a00d0 HEAD@{0}: reset: moving to a9a00d
d431515 HEAD@{1}: commit: commit D
a9a00d0 HEAD@{2}: commit: commit C
6890baf HEAD@{3}: commit: commit B
7319582 HEAD@{4}: commit (initial): add two new file

log:

chenfeikun@cfk-ubuntu:~/project_1$ git log
commit a9a00d07fb3a07bb880d7c9835dcfcd2c15ade04
Author: cfk1996 <297770449@qq.com>
Date:   Fri Mar 2 16:17:11 2018 +0800

    commit C

commit 6890baf18c283c60e9f29df4be7948fc248e91f0
Author: cfk1996 <297770449@qq.com>
Date:   Fri Mar 2 16:16:52 2018 +0800

    commit B

commit 731958281a1d63b552f90367dc8d68c1a17c632d
Author: cfk1996 <297770449@qq.com>
Date:   Fri Mar 2 15:42:48 2018 +0800

    add two new file

从暂存区到工作区

上面一小节的命令以及可以覆盖工作区了,但是那些都是Git仓库中的版本。有时候我们git add后,在还没有git commit之前,又在工作目录中修改了代码,觉得改的不好,想切换到没改之前的样貌,就可以把暂存区的内容复制到工作区。

git checkout --<filename>

总结一下三个目录

  1. 工作目录--git add-->暂存区--git commit-->Git仓库
  2. 工作目录<--git checkout--暂存区<--git reset--Git仓库

git分支

Git另外一个重要的功能就是分支了,分支可以多人合作开发以及开发新功能的需求。我目前没怎么用到过,所以就只是简单的介绍一下,主要还是搞懂三个分区的概念,其次就是弄懂Git仓库里各个版本是用指针连在一起的。所以分支就是在Git仓库中某个版本A复制一份A’,然后创建一个A->A'的指针,就可以互不干扰的在两处地发进行开发。

创建分支

git branch branch-name # 无提示

切换分支

git checkout branch-name

这个命令进行的操作就是将HEAD指针指向分支,且覆盖工作区文件。(切回原来的分支,还会覆盖一次,所以不丢失)

合并分支

git merge branch-name

在进入一个分支后,可以用这个命令与另外一个分支合并。但是合并可能失败,也就是发生冲突。即两个分支中存在同名文件,但是文件内容不一样,Git就不知道保留哪一个文件,这就需要我们手动修改冲突文件后再合并。

删除分支

git branch -d branch-name

查看修改细节

git diff # 比较工作区和暂存区
git diff id_1 id_2 # 比较两个历史版本
git diff id # 比较工作区与这个版本
git diff --cached id # 比较暂存区与这个版本

这个命令是不难,但是会输出很多的内容,内容就是两个版本比较后的差异,看起来比较麻烦。

Github

Github就是一个远程仓库,可以把我们刚才提到的Git仓库在他们那保存一份。这样的好处就是,不容易丢失,可以让更多的人参与进来。

所以会了Git以后Github的使用也就会了,它就是帮我们保存的,所以平时的操作就是两个:

  1. 把我的仓库放过去 git push

  2. 把远程的仓库拿过来 git clone

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

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,672评论 1 17
  • 《全班都零分》張世傑/寶瓶出版 面對我們的教育現狀,我最想問的問題是「你快樂嗎?」,學生快樂嗎?家長快樂嗎?老師快...
    人间行者高嘉佑阅读 211评论 0 0
  • 我想写一首吻的诗 带着38度的高温 膨胀的欲望 舌尖的香 带一些无水分的爱 然而它始终是甜的 爽朗到颤动的心房 听...
    斜杠先生的生活阅读 144评论 0 0