美文网首页
git学习笔记

git学习笔记

作者: Gopal | 来源:发表于2018-07-04 19:31 被阅读8次

集中式和分布式的区别

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

相关文章

  • 学习笔记| git深入浅出 Part1_快速操作指南

    Git专题 学习笔记| git深入浅出 Part1_快速操作指南 学习笔记| git深入浅出 Part2_Git...

  • git 入门

    git 入门学习笔记----3个入门命令:git init、git add、git commit -v 学习场景(...

  • git记录

    Git Magic图解gitgit 学习笔记git游戏(学习)1、消除文档路径中文乱码git config --g...

  • Git学习笔记--常用命令整理

    超实用Git学习笔记 Git全局配置git config --global user.name "用户名"git ...

  • Git常用命令与学习总结

    安装Git Git的下载地址:Git官网下载地址 学习网址 git 学习笔记- Book 在线练习地址 基础常用指...

  • git学习笔记(二)—— git的简单操作

    这是本系列学习笔记的第二篇git 学习笔记(一)—— 初识 git 前言 本篇文章将简要的介绍 Git 的一般操作...

  • 关于crlf

    Git学习笔记:Git设置CRLF(行尾换行符) git config --global core.autocrl...

  • GIT

    Git学习笔记 Git 与 Github对接: cd到当前文档 git init初始化git git add -A...

  • Git学习笔记

    git学习笔记 声明 本文是本人学习Git过程中所做的笔记,以便日后查阅,文中多有错漏之处,不建议用作学习材料,文...

  • Git学习笔记

    git 学习笔记 注册个人信息 git config --global user.name(你的用户名) git ...

网友评论

      本文标题:git学习笔记

      本文链接:https://www.haomeiwen.com/subject/tgsyuftx.html