Git基础

A Brief Summary For Git Use


TTfish的第一篇比较正经的博客呢。简要讲一下非常重要的Git。一开始TTfish接触git的时候,TTfish是拒绝的,虽然现在已经离不开它了本文涉及Git的操作非常的浅,具体官方文档请移步 Git-scm 。TTfish写这篇文章只是想记录一下TTfish踩过的坑,并且起到学习巩固的作用 关于git的源码\协议\客户端hook 这里不进行讨论

本文包括以下内容:

  • 什么是Git
  • git的作用
  • 本地使用git
  • 设置远程git仓库
  • TTfish踩过的坑

What is Git

2005年Linus以GPL发布了一款分布式版本控制软件,取名为Git,该词源自英国俚语,意思是……目的是为了更好的管理Linux内核版本开发。emmmm,其实应该追溯到2002年以前,那时候以前全球对于Linux的版本(diff)开发都是由Linus本人进行手工修改的,随着工程量的增大,Linux逐渐Handle不了这么多版本修改了,于是Linus转向了(万恶的商业公司)BitMover公司慷慨的授权Linux社区免费使用Bitkeeper这个版本控制系统。然而…然而…在Linux社区里开发Samba的Andrew写了个程序,尝试连接BitKeeper的存储库,还被发现了。BitKeeper拥有者认为安德鲁·垂鸠破坏了使用协议,决定收回Linux社区无偿使用BitKeeper的授权。于是Linus做了一件大事,闭关两周(不到),用C语言写了一个Git出来。2008年Github上线成为全球最大同性交友网站(大雾)

以下是git十周年访谈时Linux接受采访的内容:

Torvalds:我从来没有想过去做版本控制软件,因为在我看来那是计算机世界里最无聊的事了(如果数据库除外的话 ;^),我天生就不喜欢 SCM。但是 BitKeeper 的诞生改变了我对版本控制的认识。BK 在大多数方面是正确的,在本地保存一个仓库的副本,分布式合并确实是一大创新。这个分布式版本控制的创新完美地解决了 SCM 的通病:“谁可以修改代码”的难题。BK 告诉我们,你只要给每个人一个仓库,问题就解决了。但是 BK 也存在一些问题,技术上的问题(例如重命名很麻烦)还不算什么,它最大的坏处是不开源,很多人因为这个不使用它。所以即使我们有几个核心维护者使用 BK——开源项目可以免费使用——但它也没有普及。虽然它帮助过我们开发内核,但依然有不少痛点没有解决。

当 Tridge 违反 BK 的使用协议反编译 BK 的时候,我们到达了紧急关头。我花了几个周(还是几个月来着?)试图调解 Tridge 和 Larry McVoy(注:他是 Bitkeeper 的 老大),最后也没有成功。我意识到我不能继续使用 BK 了,但我真的不想回到没有 BK 的黑暗时代。遗憾的是,我们想用其他 SCM 来代替它,却没有找到能在远程方面工作得好的。现有的软件不能满足我对远程方面的需求,我又担心整个流程和代码的完整性,所以最后我决定自己写一个。


Git的作用

Git是优秀的版本控制工具,采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,且速度极快。对于大型项目的分工开发有非常大的作用。Git提供的history 版本回退功能;merge request功能等等都给多线开发提供很大的便利

How to use Git

看文档只能帮助一小部分的学习,实地操作才能初步掌握了git的基本操作
明明是TTfish太菜
最简易的操作如下:

@Download Git

Download Git on official website for free. 自行安装即可

Msysgit

###@创建本地git仓库

首先在工程文件夹中运行终端,Windows可以选择右键git bash here || 摁住shift+右键 运行新的powershell窗口 || 运行cmd 或者wsl 都可以

在终端中,如果没有建立本地git仓库,运行git指令会报错:

1
fatal: Not a git repository (or any of the parent directories): .git

于是先创建git本地库:

1
$ git init

创建完git仓库以后 显示:

1
Initialized empty Git repository in C:/Users/***/****/****/.git/

会有一个隐藏文件夹 .git被创立,这就是本地git仓库

###@File Version Management

git仓库建立以后,就可以进行版本管理和分支操作了,首先默认进入的是master分支,如果是git bash打开的话那么在文件夹的右边会有显示当前分支,看一下git目前的状态:

1
$ git status

查看当前git仓库的状态,举一个简单的例子 ,当前文件夹C/中只有test.c一个文件,初始了git仓库以后应该将需要管理版本的文件add进仓库,于是在终端输入:

1
$ git add test.c

这样就成功将test.c添加到本地git仓库,现在可以轻松追踪管理这个文件的历史版本

这时再一次输入git status,就可以愉快的发现,git显示:Changed filesno commits yet 意思是”对文件有了修改,但是并没有确认修改” 于是我们应该 “commit change”,告诉git:我已经确定对该文件进行修改

1
$ git commit

这时候出现了一个vim窗口,具体vim的操作在这里不是很想赘述 Vim
Press ‘i’ 进入insert模式,然后在第一行输入本次commit的记录

1
add test.c

然后 press ESC 输入 :wq press Enter(表示vim使用完毕并且write+quit)

正常情况就成功添加了一个commit(一个History可回退的节点).

此时再次输入git status检查状态 可以发现在终端显示:

1
2
On branch master
nothing to commit,working tree clean

对于一个文件的操作基本就是这样了

*补 充

  • 一般会使用git add .来表示将文件夹中所有文件( 写入gitignore的文件除外)加入git仓库
  • 使用git commit -a来作为git commit --all的操作
    (git有许许多多的命令和参数 参考官方文档可以获得最佳体验)

###@Branch Management

一般在上线的工程中,master分支并不是被直接被修改的(防止push a lot of bugs的事情发生),于是创建分支(branch)十分的必要,在修改代码的时候在分支中修改,需要上线的修改可以使用merge这强大功能实现

1
$ git checkout -b TTfish

终端会显示:

1
Switched to a new branch 'TTfish'

这个命令是在master分支创建一个TTfish分支,checkout有许多黑魔法,比如可以远程链接track设定的remote git仓库(详见下文),还可以在history中找回文件(即使被rm - rf了的)
如果想回到master分支 就输入:

1
$ git checkout master

这样在branch里操作更改代码后,可以merge到主干分支中,也可以在一群commits里git rebase -i一下,而git fetch则是保持和主干的一致 这里不多讲了 当然,要是想删除过去的黑历史,可以使用reset HEAD~X(不推荐使用…直接去github的history去找commit不就好了)

关于本地的git就讲这么多,具体还是多看官方文档 Git

TTfish都写完了 忽然断了网 远程仓库以后的都要重写一遍 真的是 无语了…

Remote git

这部分是TTfish踩坑最多的地方,稍有不慎就掉进去了,虽然现在回顾一下也不是很烦,但是踩坑确实花了我一周左右(Linus都快写完一个git了)本地文件为了能和别人分享,于是需要将git push到远程仓库,这样就实现了共享 并为分布工作提供便利

@Simple git config

1
$ git remote -v

查看远程git状态,当然什么都不设置的话是什么都不会显示的 于是先配置一下用户名和邮箱 以便git管理commit的时候可以知道是谁进行的操作(这个其实应该是刚下载的时候就要配置的吧)

1
2
$ git config --global user.name "****"
$ git config --global user.email ****@****.com

@ Set remote git

首先配置remote 接口 TTfish花了一整天才理解命令的意义:
举GitHub的例子进行设置最简易的remote git仓库
打开GitHub 新建respository 点击Clone or Downloads
就可以查看SSHHTTPS的两个地址 先讲简单的HTTPS
打开本地文件夹 运行终端

1
$ git remote add origin https://github.com/***/***.git

这里的意思是 设置远程github的git respository的本地接口 origin为远程的分支(TTfish理解为接口) 对于远程的操作 需要通过origin进行操作 origin可以替换为任意字符串

1
$ git push -u origin master

这里的意思是 将本地的分支push到远程的master分支(-u的意思是如果没有则创建分支)
当然 masterorigin都可以自己设置 origin必须和之前设置的字符串相同
这样就成功push上去了 -f这个暴力的指令最好少用 虽然TTfish经常用…

这里有一个坑 就是GitHub的新建respository可以选择是否新建README.md 如果新建的话 就需要先git pull origin(****) master(****)把README.md合并到本地 不然的话 会因为两个仓库完全不同而拒绝push请求

至于解决方法 有很多:

1、友好型 :

1
$ git pull origin master

将远程的文件先并入本地git仓库 然后commit以后进行正确操作

2、暴力型 :

1
$ git push -f origin master

这个TTfish经常使用(逃)但是缺点是 远程的文件会被覆盖(一般是一个README.md,TTfish不是很在意)
其他例如clone下来并commit·push的操作就不多说了

至于set upstream的操作 就是为了方便之后的操作而设定的一个默认配置

@ Remote operate

对于远程仓库的操作还有许多:

1
2
3
4
git remote rename <name>
git fetch <filename>
git remote show origin
git remote rm origin(****)

以上分别是:
重命名 得到文件 显示远程仓库详细知识 删除远程仓库链接(*常用)

好累 有什么要补的下次再说吧
最重要的命令还有一个:

1
$ git clone ********.git

下载别人或者自己的git文件(完整的) 别忘记clone下来的js文件需要npm install 最近一直健忘…

好像没什么了 看完了这篇文章 最简易的远程仓库建立应该没有问题了 网上的博客看了很多 但是在我入门的时候确实没有很能见清楚(搞得好像你讲的很清楚一样….)希望能帮到自己和别人 咔咔

最后的官方链接: https://git-scm.com

对于.gitignore的补充

如果在面临一个大项目 使用了webpack或者安装了新的依赖以后 git的commit提示栏会瞬间飙上去 或者 。
我们并不希望将一些测试时的依赖包打包在我们写好的文件中 一般会创建一个.gitignore文件 在文件中填入不希望放入git监视的文件 在commit和push的时候 会自动忽略


1
2
3
$ vim .gitignore

> node_modules

这样就是将当前目录的node_modules给ignore了 .gitignore支持正则搜索

另外 对于已经存在于git仓库中的文件 如果再在.gitignore中添加 并不能删除原版本 需要输入

1
$ git rm --cached *** // 删除git仓库中的***

ps.下次写blog 再也不要忘记即时保存!!!!

Share