git学习笔记

集中式和分布式的区别

git是分布式版本控制。与分布式相对应的就是集中式,SVN就是集中式的管理。

集中式

集中式版本控制系统,版本库是集中存放在中央服务器的,要进行相应操作的时候,需要从中央服务器中获取最新的版本,结束相应的操作后再将自己所修改的代码推送到中央服务器。

集中式缺点:

  • 最大的缺点在于需要互联网才能进行工作

分布式

分布式版本控制没有“中央服务器”,每个电脑都是一个独立的版本库,这样你工作的时候就不需要互联网了,因为版本库就在你的电脑上,相当于就是你的本地文件了。

创建版本库

版本库又称为仓库,英文名repository,可以简单理解成一个目录,这个目录下所有的文件都将被git管理起来,每个文件的修改,删除,git都能进行跟踪。

初始化一个Git仓库,使用git init命令

添加文件到仓库,可以分成两步:
1.使用命令git add <file>。注意:可以使用多次,也就是可以添加多个文件。
2.使用命令git commit -m <message>,完成提交

查看仓库状态

git status命令可以让我们时刻掌握仓库当前的状态

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式

版本回退

版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

git log --pretty=oneline

上面打印出来的信息中commit id是比较重要的,版本回退的时候需要用到

怎么回退版本呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

然后可以使用git reset命令进行回退版本

git reset --hard HEAD^ 

如果回退完,又想回到之前的版本的话,也就是在git log没有办法查看到commit id 了。那么我们可以使用git reflog查看历史命令,以便确定回到未来的哪个版本

git reset --hard [版本号]

工作区和暂存区

工作区也就是你在电脑上能够看到的目录

版本库
工作区中有一个隐藏目录.git,这个不算工作区,而是git的版本库。

git的版本库中存放了很多东西,其中最重要的就是stage(或者叫做index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针——HEAD。

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

撤销修改

如果你进行了一些“傻逼操作”,你想想撤销的时候应该怎么做呢?可以使用(像如果误删了某个文件,也可以使用这个命令进行撤销,是不是很强)

git checkout -- file

远程仓库

git是分布式版本控制系统,同一个git仓库,可以分布到不同的机器上。如何进行分布呢?最早是有一台机器有一个原始版本库,此后,别的机器可以克隆这个原始版本库,而每台机器的版本库都是一样的,没有了主次之分。

为什么GitHub需要添加SSH key
因为GitHub需要确定识别出提交人是你,而不是别人冒充的,而git支持的是SSH协议,所以GitHub只要知道了你的公钥,就可以确定是你本人的操作了。当然你可以添加多个key,这样你可以在家办公,也可以在宿舍办公,只要这两台电脑的key都添加到了GitHub上,就都可以往GitHub上推送了。

添加远程仓库

我们可以在GitHub上新建一个远程的仓库,右上角找到“Create a new repo”按钮,创建一个新的仓库。

如何将远程仓库和本地的仓库关联起来呢?
可以在本地仓库目录下使用命令:

git remote add origin git@github.com:guangpingfeng/git学习笔记.git

特别注意的是:guangpingfeng记得替换成自己的GitHub账户名,否则你在本地关联的就是我的远程GitHub,关联是没有问题,但是你是没有办法进行推送的,因为你的SSH Key公钥不在我的GitHub列表中。

添加后,远程仓库的名称就是origin,这是git默认的叫法,也可以修改成别的。

然后就可以将本地的仓库推送到远程仓库了,第一次使用如下命令进行推送

git push -u origin master

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

git push origin master

分支管理

意义
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

创建和合并分支

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

(相关的图示,可以参考https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000

现在我们可以新建一个dev的分支,并将其切换到dev分支

git checkout -b dev

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

git branch dev // 创建
git checkout dev // 切换

使用git branch可以查看当前有哪些分支。

我们可以在当前分支上进行修改代码并提交,注意,这个时候我们修改的是dev分支上的代码,所以当你切换回去的时候,master分支的代码还是之前的。那么要怎么将其合并呢?

先切换回master分支

git checkout master

然后使用命令

git merge dev

合并完成之后,我们觉得dev分支没有用处了,那么我们可以删除dev分支了

git branch -d dev

PS:鼓励使用分支

解决冲突

Bug分支

当遇到bug的时候,我们可以选择新建一个bug分支进行解决问题,解决完成之后再切换回原来的分支

如果工作到一半,我们不想那么快提交的时候,我们可以使用git stash将当前的工作现场储藏起来,等以后再恢复现场并进行工作

我们可以通过git stash list进行查看
恢复的时候有两种方法,一种是:

git stash apply // 恢复
git stash drop // 删除

或者一步到位:

git stash pop // 恢复的同时将其删除

feature分支

在软件开发过程中,我们会不断的接收到功能的需求和功能,如果一个功能比较大的时候,我们一个好的做法是新建一个feature分支,在上面开发,完成后,合并,最后删除该分支。

但是有时候我们开发到一半的时候,该功能就不要了,那么我们可以直接使用以下命令进行删除,注意不是d,而是D。强行进行删除

git branch -D feature-vulcan

多人协作

查看远程库的状态,使用git remote
或者使用git remote -v查看比较详细的信息

推送分支
推送分支,就是将本地上该分支的所有提交推送到远程仓库。推送的时候,要制定本地分支,这样git就会将该分支推送到远程库对应的远程分支上

git push origin master // 推送master分支
git push origin dev // 推送dev分支

抓取分支
当你的代码推送到远程失败(因为你的小伙伴最新的推送和你试图推送的提交有冲突),可以先选择使用git pull将最新的提交拉取下来,在本地合并,解决冲突后,再进行推送。

注意:如果你没有指定本地dev分支和远程origin/dev分支的连接,设置两者的连接

git branch --set-upstream-to=origin/dev dev

rebase

一般都是要将master分支上的代码rebase到自己的分支上,通常的命令如下(注意当前的分支应该是自己的分支)

git rebase master

如果有冲突就解决冲突,解决完

git add .
git rebase --continue  # 加上--continue参数让rebase继续处理

标签管理

使用git tag <tagname>就可以打一个新的标签。

git tag v1.0

默认标签是打到最新提交的commit上的,但是有的时候,如果忘记打标签,我们可以根据commit_id进行添加

git tag v0.9 f52c633

如何查看标签?

git tag

具体某个标签的详细信息?

git show vo.9

如何对标签名进行说明?

git tag -a v0.1 -m "version 0.1 released" 1094adb

-a制定标签名,-m指定说明的文字

如何删除标签?

git tag -d v0.1

创建的标签都只是存储在本地,不会自动的推送到远程。所以打错的标签可以在本地进行安全删除。

如何推送标签到远程?
git push origin <tagname>

git push origin v1.0

命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

git push origin :refs/tags/v0.9

结束语

使用git进行代码版本控制已经成为程序员必不可少的技能之一,如何在团队协作高效的管理,遇到冲突怎么解决,以上做了一定的总结与归纳。以上内容主要参考廖雪峰的教程,内容比较基础,适合新手学习。

参考:
廖雪峰教程 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

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

推荐阅读更多精彩内容

  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,534评论 0 13
  • Git教程 一、Git简介 1.1. Git的诞生1.2.集中式的vs分布式 二、安装Git 三、创建版本库 四、...
    曹渊说创业阅读 951评论 0 2
  • 上次在报纸上,看到这样个问题,如果让你重新选择,你还会选择现在的对象吗?这是问那些结了婚的70 80。回到过去,重...
    凯心果阅读 725评论 0 0
  • 上面这一位就是七四年的健美冠军,雅兰教练。 三个标签 1.时间管理践行者 2.健身教练 3.健美运动员 雅兰教练从...
    张攀锋007er阅读 459评论 0 1
  • [cp]#艾养生##迎接夏天最hi的方式#俗话说:“冬养三九,夏养三伏”,一年中最热的三伏天暑湿之毒最凶,但同时也...
    蓝天_ab1a阅读 201评论 0 0