0、基本概念

•Git是一个免费、开源的、分布式版本控制系统

•它使用一个特殊的叫做仓库的数据库来记录文件的变化

•仓库中的每个文件都有一个完整的版本历史记录

1)安装

sudo apt-update
sudo apt-get install git
git --version

2)工作流转

Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

你的本地仓库由 git 维护的三棵”树”组成。

  • 工作目录:它持有实际文件;
  • 暂存区(Index):它像个缓存区域,临时保存你的改动;
  • 本地仓库(Respository):可以把本地仓库理解成一个目录,这个目录中所有的文件都可以被Git管理起来每个文件的删除、修改、新增操作都可以被Git跟踪到

    以便任何时候,都可以追踪历史或者还原到之前的某一个版本

    HEAD,它指向你最后一次提交的结果图片

3)文件3种状态

对于任何一个文件,在 Git 内都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)

  • 已修改表示修改了某个文件,但还没有提交保存;
  • 已暂存表示把已修改的文件放在下次提交时要保存的清单中; add
  • 已提交表示该文件已经被安全地保存在本地数据库中了。commit

一、创建仓库并提交第1个commit

步骤1-4流程,参考下图流程会更清晰一些

图片

1、创建仓库

使用当前目录作为Git仓库,我们只需使它初始化。

git init

该命令执行完后会在当前目录生成一个 .git 目录。图片

2、新建本地文件

本地增加文件url.c、README.md

实用git status查看文件状态,红色部分,有2个未跟踪的在文件

图片

3、提交文件到暂存区git add

你可以提出更改(把它们添加到暂存区),使用如下命令:

git add <filename>
git add .      //添加所有文件
git add *.c    //添加所有c文件

执行下面操作:

git add *.c 
git add README.md

4、提交改动git commit

使用如下命令以实际提交改动:

git commit -m "代码提交信息"

或者

git commit

然后进入vim编辑器,添加提交信息

例如:

git commit -m '初始化项目版本'

以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。

图片

现在,刚才的改动已经提交到了 HEAD,但是还没到远端仓库。

可以使用git log查看所有的提交:图片

5、推送改动git push

刚才的改动现在已经在本地仓库的 HEAD 中了。

执行如下命令以将这些改动提交到远端仓库

git push origin master

可以把 master 换成你想要推送的任何分支

如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:

git remote add origin <server>

如此你就能够将你的改动推送到所添加的服务器上去了。

三、 分支操作

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是”默认的”分支

在其他分支上进行开发,完成后再将它们合并到主分支上。

0)查看分支

列出分支基本命令:

git branch

没有参数时,git branch 会列出你在本地的分支。图片

此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。 执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。 分支在本地完成,速度快。

1)创建分支

要创建一个新的分支,我们使用branch命令。

git branch test
图片

由上图所示:

  1. 多了一个分支test
  2. 当前分支为主分支master,前面*表示活动分支

2)切换分支

branch命令不会将我们带入分支,只是创建一个新分支。所以我们使用checkout命令来更改分支。

git checkout test

创建一个叫做”test”的分支,并切换过去:

git checkout -b test
图片

如上图所示:

  1. 分支test前面有*,所以当前活动分支为master

分支创建和切换参考下图:

图片

3)切回master分支并合并

在分支test上,修改文件url.c,然后commit

图片

切换回主分支并合并

git checkout master
git merge test
图片

由上图所示,git merge test后,主分支多了一个新的commit b9217

图片

注意:

对其他分支的更改不会反映在主分支上。如果想将更改提交到主分支,则需切换回master分支,然后使用合并。

4)删除分支

使用-d标识,把新建的分支删掉:

git branch -d test
git branch -D test
图片

如上图,我们删除了分支test图片

5)上传分支push

除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:

git push origin <branch>

四、替换本地改动git checkout

假如操作失误可以使用如下命令替换掉本地改动:

git checkout -- <filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件

已添加到暂存区的改动以及新文件都不会受到影响。

  • 步骤

修改文件url.c,增加信息

//this change will be delete by git checkout

然后再git checkout url.c图片

如上图所示,

执行下面命令后:

git checkout url.c

url.c修改的信息

//this change will be delete by git checkout

已经被删除了,此时工作区域文件还原到了commitb 9217状态

查看url.c:图片

图片

假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:

git fetch origin
git reset --hard origin/master

五、重置git reset

当我们不想要之前提交的修改时,就会用到这个命令。也许这是一个 错误的提交或者可能是引入了 bug 的提交,这时候就要执行 git reset。

git reset 能让我们不再使用当前台面上的文件,让我们可以控制 HEAD 应该指向的位置。

1)软重置

软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改!图片

图片

输入 git status 后,你会看到我们仍然可以访问在之前的提交上做过的所有修改。

这意味着我们可以修复这些文件的内容,之后再重新提交它们!

图片

2)硬重置

有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。

Git 应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。

我们重新add并commit,然后硬重置图片

可见我们所有提交的信息都已经被移除,

工作区域文件恢复到commit 7bb299状态。

打开文件,查看,添加信息已经不存在,图片

图片

六、还原git revert

另一种撤销修改的方法是执行 git revert。

通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交。

新创建文件peng.c并提交

图片

用git revert 撤销修改图片

由上图所示,执行git revert 209485之后,我们新增的文件peng.c被删除,并提交了1个新的commit 5b08d

此前添加peng.c文件的提交还在,这样就保留了该提交信息,提高了仓库的兼容性。

在撤销特定的提交时,git revert 非常有用,同时也不会修改分支的历史。图片

七、拣选git cherry-pick

当一个特定分支包含我们的活动分支需要的某个提交时,我们对那个提交执行 cherry-pick!

对一个提交执行 cherry-pick 时,我们会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。

创建切换到cherry分支,

git branch cherry
git checkout cherry 
图片
图片

在分支cherry上修改文件README.md提交几个节点图片

图片

切回master分支

git checkout master
图片

执行git cherry-pick b98fc77

图片

由上图所示,分支cherry的commit  b98fc77,被复制到分支master,并创建了1个新的提交2d995,

通过该命令我们就可以将其他分支,需要的提交,合并到主分支master。

图片
end

被隔绝的寺庙

跟噜噜外出游玩。只剩最后一间寺庙了,我们第一天来时匆匆经过,没能好好游览。明天即将离开了,抓紧最后的时间来看看。

寺里空荡荡的,没有游客,也不见僧人。我一个人在院子里欣赏,心下大喜。想来因为是周末,大家都去别的地方热闹了。

一面喊噜噜,以后就周末来就对了,你看,没人!一面端详一个香炉。香炉上钉有显眼的铭牌,写着捐赠人的姓名,那是对年轻的情侣。另一个香炉前供跪拜的石头上写着,请勿移动。前后揣摩着,嗯,这个角度拍照会美,一掏包却发现,相机没在身上。落在噜噜房里了吧,这下一整天都拍不成了,一时懊恼不堪。

噜噜闲闲的过来了。还要去哪里啊,她抱怨说,我可走不动了。我低头一看,她脚上一双黑色皮鞋(男式,半旧,低跟,磨脚)。不禁火大。明知出来玩,你穿皮鞋干吗啊!她没所谓的撇撇嘴。这家伙,当然是为了好看,虚荣。寺庙这么大,只怕这一处她都走不完。到底不是一路人,算了算了,哪儿也甭去了。

她转去内殿上香,我站在院内等。忽然,像被什么东西、或者时间本身触发,无人的寺庙启动了自动安保装置,雕花彩绘的木栏杆从两侧嘎嘎的伸出,把寺庙的主要部分全都拦了进去,只将我挡在外面。我急了,噜噜还在里面呢。喊她,然而重重阻隔,声音微弱,几不可闻。不过也知道,那装置只是将我们暂时分隔,其实并不会危害到她。(因她是人类,嗯?为什么有这种感觉。)

于是只好自己在外面等着。很快,心里开始有恐惧滋生。天色看起来比刚才昏暗。为什么寺庙会关掉,好像是想隔绝某些东西。是将有害的关在里面,还是要将它挡在外面?

注意到时,身边的游客已经多起来了。正奇怪,却发现其中一些人不大对劲。一个家伙样貌相当丑陋,大嘴咧至耳根,嘴唇外翻着,所有零件都像被融化的蜡,显得一脸凶相。还有个极矮小的家伙,仅到普通人膝盖高度,但却不是侏儒,或按正常人尺寸等比例的缩小版,而是……像被一脚踩扁的易拉罐。

我开始意识到,不断涌入的这些,不是人,是妖怪。它们多半自顾自的东张西望,无视我这个异类,可能是还未察觉。我惊恐的,努力不引起注意的,沿墙根小心往外溜。在转角处,想从一个着青衫的胖子身边捉空挤过去,却冲撞了他。他蓦地转身,对我怒目而视。我吓坏了,心想糟了糟了还是被发现了。好在他并不打算为难我,见我害怕,便轻蔑的转身,昂然去了。

我赶紧三步五步跑出庙门,往左边去。那里曾是供奉的地方,此时却有一大滩呕吐物,污秽不堪。我忽然意识到,那并非真正的人类呕吐物,而是因妖邪侵袭而滋生的丑恶。这世界正在变质,一切美好都不复存在,这就是寺庙将自己隔绝起来的原因。

夜半

做梦时,有个遥远的声音唤我,一声声,带着沉重的焦灼。我从黏黏糊糊的梦境中警醒,一时脑袋还在发木。浴室的灯亮着,他再叫我一遍,声音饱含痛苦。我把被子一掀,踩上拖鞋跑过去。

“不行了。拉肚子,疼得厉害。”一手撑在旁边的柜子上,他说。好像连说话都会加重疼痛,“赶紧,找药。”

“晚上吃了什么?”脑袋还是木的,站在门口问完又想起来,药,对,得赶紧吃药。把所有的灯都开了,在药箱里胡乱翻腾了半天,没有。

脑袋还是木的。药,药呢?再翻一遍,怎么会没有呢?真没用,关键时刻掉链子。

他一声不吭,弯着腰。半响才说,“晚上五点多吃了碗面,不是那个,不会这么晚才有反应。再说同事也都吃了。睡觉前喝了一口床头的水,那水你别倒,万一我有什么事儿,拿去医院化验。”

“那是前一天的茶,你喝它干吗啊!”

啊,之前出去玩,把应急的药都装在包里了,回来也没收拾。那……装药的包呢?

跑进卧室,在这里了。

“不行,我感觉要晕了。冲点白糖水,快。”

手忙脚乱弄了一杯热的白糖水,药倒了四粒,再看看说明书,哦,三粒——他要是晕了该怎么办啊。

把药放手心喂他吃了,又喂糖水,“扶着点儿,我手没劲儿,”他脸色煞白。

“擦一下汗,”他说。之后我烧了水,想绞一把热毛巾来着,但随即又放下去忙别的。取了热宝,给他捂在肚子上。化什么验啊,又不是下毒。怪我,睡前还看了一眼杯子,没收,想一个茶底子,不至于还喝吧,让他自己倒。

这么想的时候,已经是他说“好多了,”要我给他撕好手纸,自己擦完,颓然趴在被窝里之后了。期间喊冷,还盖了毯子,叮了热宝,喝了糖水,又穿了秋裤。消炎药,拉肚子吃什么消炎药,这会儿只有阿莫西林,不对症,别瞎吃了。

“我帮你擦一下你上床躺着吧。”的确是这么说的,而不是“要不要我帮你擦?”这家伙也真冷静,坐在马桶上还能沉着的发号施令,还说,“拿个盆来,我可能要吐。”坐在床边,隔着外套、毯子和被子,抚着他的背,想。

“没事了,你躺下吧。”

唔。借着床头灯的亮光,端详了他一会儿。
“要我关灯吗?”
“嗯。”

猫又喵喵的摸上床来。几分钟前它们还为这突如其来的大动干戈而兴奋不已,在屋子里追跑打闹。这会儿房间重新安静下来,好像被渡河人的双脚搅起的泥沙又慢慢沉回河底。他呼吸渐渐均匀了,猫把冰凉的鼻子贴过来。我渐渐松弛的放下心来,这才把耳朵塞塞好,睡了。

动物把守的路

往学校去的路上有野生动物把守,我口袋里有毛绒绒的小动物,第一条路不能去,狮子老虎瞪着真要命。旁边路上两头大象屁股冲外,正在闹脾气。两只胖熊猫一坐,把第三条路堵了个结实。最后一条只给老师走,我跟着混进去,看见黑猩猩正把一牙哈密瓜嗒嗒嗒嗒嗒切成薄片下油锅炸成哈密瓜薯片。

耶路撒冷

半只西瓜冻住覆香草冰淇淋呈上,跟松木阿子大吃。聊到她新出的各国游历的书,说真正的名画冰品是从墙上新鲜撬下整幅上桌;耶路撒冷的伊斯兰小学蓝色至简的墙上有粉笔写的誓言,挂着每个人的枪,必要时宁死明志。孩子们在砖屋里试验手榴弹,转瞬间红墙变碎砖。一男子持枪胁迫她,说着听不懂的话。

爱情电影

看电影。男女主角微醺的在房间追跑打闹,他从背后亲热的抱住她,她调皮的往下一出溜──人跑了,衣服没跑,瞬间坐在地上露着漂亮的bra ──哎哟好尴尬!互有爱意却从未表白,甚至自己都不曾真正意识到的两个人,接下去会如何发展呢?播到这儿突然开始卡了。

幸存

有个影子正持刀逼近。他知道你在梦中,梦中喊不出声音,你要使劲儿喊、尽力喊、拼命喊!他突然举起刀!你的意识紧绷,喉咙却松散着,救命…救命…嘶哑的,激不起周遭死寂的空气,他猛的挥刀!救命!你喊出声。醒了,还活着。又一次。

观影

顾不厌的《好小猫》拍了电影,在很偏僻的影院独家放映。门口洁白的沙地上,一圈用她画的小猫像烧制的彩色瓷砖,美极了。我蹲下去细细的看,心里真想偷拿它一块。

进影院之前,我站在电线杆下高高的水泥台上,忽然左边有匹小马探头来闻。那人说,骑马走吧。才刚抱住小马的脖子,L就喊,“驾!”“哎哎别啊!它这就跑起来了我怎么办!”我慌忙的吆喝着。他又按住小马的后颈,搞得它一直躲开我移动的方向,像是对我身体的重力有所感应似的。

动画片,一帧一帧都是她自己画的,胖美像靴子猫般佩了剑。可影院里都是从前工作认识的人,还有旧同学,他们走来走去,热情的相互寒暄,搞得我一个字也听不见。

不想被发现攀谈,悄悄离开。一边走,心里遗憾。不知道以后还有机会上映吗,或者,会有影片下载吗。

走出影院,外面仍有许多人向影院走来,忽然意识到,曾经的爱人D就在我身后。跟那个女孩一道,走着与我相反的方向。

意识到这一点时,被强烈的哀伤突然击痛。深恐被看到,一时裹紧了身上的长袍,低头快步离开。

她的房间

她的房间很暗。有一片红色的格子架,格子上挂满了风铃,叮当作响。角落的书架上方,一盆蟹爪兰正不断旋转着,八音盒的旋律空寂的流淌。叶子渐长了,一圈一圈的扫着墙壁。一种异样的暧昧感觉压迫着我,我忽然害怕极了,赶忙跑了出去。

打劫

教室的侧面是一排落地玻璃窗,我面向玻璃窗时,前门在我的左前方。正跟人闲聊,门口忽然闯进两个劫匪。班上的人都被堵在了教室里,任由他们挨个搜缴。

蓦地想起,口袋里还有一张五十两张一百的,趁他们还没走近,赶忙从衣兜掏出来,塞进裤子口袋,只留一张二十的,和几块零钱。

劫匪甲较阴沉凶悍,站在教室前面。劫匪乙走过来,我把那张二十的和零钱掏给他,做害怕状说,只有这些,早上刚买了电影票。还把买影票赠送的一叠券给他看。他扒拉一下,看到后面还有张二十的,就很好商量的把钱和一叠券收走了。

刚松口气,前排男生忽然情绪激动的大喊了句什么,情势急转,气氛紧张起来。劫匪甲疑心的走过来开始逼问劫匪乙,左一个耳光右一个耳光,打得他可怜。我躲在一边。被打后劫匪乙环视四周,目光落在了正战战兢兢躲在一边的我身上。忽然他掏出张卡,示意我来接。

他分明是带着绝望和不甘,想看他之前手下留情的善意会不会有回应。那张卡本身并没有什么意义,但我若敢上前,就是还有人肯同情他,站在他这边。

众目睽睽之下,我慢慢的走上前,小心接过来。一时全班噤声。但见我又转手将卡呈给劫匪甲,装出一脸单纯,快吓哭了的样子,表示我这样做只是出于同情,并非要反抗他。

劫匪甲沉沉的说,把你身上的钱,都掏出来。我吓坏了,这时再掏可就不是钱的问题了,我跟乙,都有隐瞒的大麻烦。我仍做老实吓哭状,不动,哀求的看着他。他忽然改主意说,你去帮我买支冰棒罢。那个XXX,今天是星期五,你记得啊。听他的意思,好像每天的口味都不一样,但我并不懂,只是拼命点头,心想,他一定是考验我,如果我这就走了,就代表身上还有钱,怎么办怎么办。但他接着便掏出钱来给我。我哆哆嗦嗦的挑了一张十二块的,得了他的允许,便赶紧走出去。

腿不听使唤,简直迈不动,我心里一再默念那冰棒的名字,XXX,XXX,短短一段路走了好久,心下焦急,怕他等久了要起疑心。不料前面又遇一伙劫匪,见我经过,就一步步逼上前来。

想到这钱若被劫了,回去恐怕更难交待,当场就崩溃了!忍无可忍之下突然爆发,举起拳头,向着劫匪喉头就是一记猛击。我竟会反抗,那家伙始料未及,一时懵了。我自知拳上没力,赶紧趁他还没回过神来,硬着头皮像超级玛丽般跳起连续猛击,一下一下一下一下,直至醒来。