git、github以及nodeJS的使用

基于开放的git、nodeJS以及github社区开发,是一个全新高效的世界。本手册不断更新|请密切关注...

git新生-开源软件之父的匠心之作

git诞生,离不开著名的开源软件之父linus(全名:Linus Benedict Torvalds,有一些文档也称其为Torvalds,实则指同一人),这也是他一生的第二个伟大作品(他的第一个伟大作品,就是linux内核的发明人)。

现代软件的研发,需要对软件版本进行管理,从而可以合理分工、回溯、备份、还原等操作,逾是大型软件研发逾显得重要,Linux开源社区同样如此。

2005年由于BitKeeper软件公司对Linux社区停止了免费使用权。Linus迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了。

目前使用Git作为版本控制的开源软件:Linux kernel,Android, jQuery, Ruby on Rails,Debian…

Eclipse上使用Git的项目数量也已经超过了使用排名第二的SVN仓库数。

Git优点

- 分布式,离线操作

- 每日工作备份

- 异地协同工作

- 现场版本控制

- 快

Git缺点

- 复杂的信息模型

- 抓狂的命令语法

- 让人费解的文档

- 新概念泛滥

- 保密性差

- 学习周期长

通过git命令克降一个库的经典语法:

git clone https://github.com/zoomla/cms2.git

github平台

2008年,美国人Tom Preston-Werner、ChrisWanstrath推出Github网站,使用Git作为版本控制软件创建了 http://Github.com,这是一个专门托管代码并且可以实现版本控制的网站。Tom之所以把网站叫做Github,是因为其核心部分版本控制是用Git来处理的。但是为什么有人回复调侃Github是全球最大男性交友网站呢?那是因为Github的注册用户大都是男生,而且彼此之间可以相互关注(类似于微博)。

2016年6月,微软以75亿美元的价格收购了它,此前该公司作为一家独立公司已经经营了近10年,依托微软技术可以更好的为用户提供服务,也依然坚守开源免费的策略

由此可见:github是网上仓库,你写的代码的各个版本都可以存在这个网站平台上。

结论:一般人们称github事实上是指github.com这个网站平台,而git则是最底层的命令和技术,相当于面粉和面之间的关系--面粉是基础,而面是面粉最后的形态之一。

git和github的区别,恐怕很多人都说不清楚。

用一句话形容这二者的关系:git是弓,你的代码是箭,github是靶子。

git是软件,它可在本地建立仓库,你写的代码的各个版本都可以储存在互联网上,而且不需要另外付费购买空间,可追溯、镜像、分享。

git创建并上传代码到远程仓库中

首先安装git支持,只要访问 https://git-scm.com/下载对应的版本,一路回车就可以完成安装,安装完成在命令行中运行git -v就能看到友好版本提示,即告安装成功。

第一步:接下来我们需要先创建一个本地的版本库(其实也就是一个文件夹)。

你可以直接右击新建文件夹,也可以右击打开Git bash命令行窗口通过命令来创建。

现在我通过命令行在桌面新建一个TEST文件夹(你也可以在其他任何地方创建这个文件夹),并且进入这个文件夹

创建git文件夹

第二步:接下来通过命令git init把这个文件夹变成Git可管理的仓库:

把这个文件夹变成Git可管理的仓库

这时你会发现TEST里面多了个.git文件夹,它是Git用来跟踪和管理版本库的。如果你看不到,是因为它默认是隐藏文件,那你就需要设置资源管理器参数,允许隐藏文件可见。

这时你会发现TEST里面多了个.git文件夹

第三步:这时候你就可以把你的项目粘贴到这个本地Git仓库里面(粘贴后你可以通过git status来查看你当前的状态),然后通过git add把项目添加到仓库(或git add .把该目录下的所有文件添加到仓库,注意点是用空格隔开的)。在这个过程中你其实可以一直使用git status来查看你当前的状态。

这时候你就可以把你的项目粘贴到这个本地Git仓库里面

这里提示你虽然把项目粘贴过来了,但还没有add到Git仓库上,然后我们通过git add .把刚才复制过来的项目全部添加到仓库上。

然后我们通过git add .把刚才复制过来的项目全部添加到仓库上

第四步:用git commit把项目提交到仓库。

把项目提交到仓库

-m后面引号里面是本次提交的注释内容,最好写上,不然会报错。 到此,本地Git仓库创建完成,下面就到了连接远程仓库(即连接到Github)。

由于本地Git仓库和Github仓库之间的传输是通过SSH加密的,所以连接时需要设置一下.

第五步:创建SSH KEY。先看一下你C盘用户目录下有没有.ssh目录,有的话看下里面有没有id_rsa和id_rsa.pub这两个文件,有就跳到下一步,没有就通过下面命令创建:

ssh-keygen -t rsa -C "youremail@example.com"

然后一路回车。这时你就会在用户下的.ssh目录里找到id_rsaid_rsa.pub这两个文件

第六步:登录Github,找到右上角的图标,打开点进里面的Settings,再选中里面的SSH and GPG KEYS,点击右上角的New SSH key,然后Title里面随便填,再把刚才id_rsa.pub里面的内容复制到Title下面的Key内容框里面,最后点击Add SSH key,这样就完成了SSH Key的加密。具体步骤也可看下面:

github的ssh设置1

github的ssh设置2

github的ssh设置3

github的ssh设置4

第七步:在Github上创建一个Git仓库。

你可以直接点New repository来创建,比如我创建了一个TEST2的仓库(因为我里面已经有了一个test的仓库,所以不能再创建TEST仓库)。

第八步:在Github上创建好Git仓库之后我们就可以和本地仓库进行关联了,根据创建好的Git仓库页面的提示,可以在本地TEST仓库的命令行输入:

git remote add origin https://github.com/guyibang/TEST2.git

注意origin后面加的是你Github上创建好的仓库的地址。

第九步:关联好之后我们就可以把本地库的所有内容推送到远程仓库(也就是Github)上了,通过:

git push -u origin master

由于新建的远程仓库是空的,所以要加上-u这个参数,等远程仓库里面有了内容之后,下次再从本地库上传内容的时候只需下面这样就可以了:

git push origin master

上传过程中可能会验证您的用户权限,命令是:


git config --global user.email "邮箱"
git config --global user.name "名字"        
        

上传项目的过程可能需要等一段时间,完成之后界面会提示完成。

总结:对于一个关联好的Git项目,你需要执行以下三步完成提交:

git add .
git commit -m “提交信息的描述文字”
git push origin master

另外,这里有个坑需要注意一下,就是在上面第七步创建远程仓库的时候,如果你勾选了Initialize this repository with a README(就是创建仓库的时候自动给你创建一个README文件),那么到了第九步你将本地仓库内容推送到远程仓库的时候就会报一个failed to push some refs to  https://github.com/guyibang/TEST2.git的错。

这是由于你新创建的那个仓库里面的README文件不在本地仓库目录中,这时我们可以通过以下命令先将内容合并一下:

git pull --rebase origin master

有时系统会忽略node等配置,但如果你需要强制上传,则可以使用强制上传一个文件夹的方法:

git add -f public

这时你再push就能成功了。

总结:其实只需要进行下面几步就能把本地项目上传到Github

1、在本地创建一个版本库(即文件夹),通过git init把它变成Git仓库;

2、把项目复制到这个文件夹里面,再通过git add .把项目添加到仓库;

3、再通过git commit -m "注释内容"把项目提交到仓库;

4、在Github上设置好SSH密钥后,新建一个远程仓库,通过git remote add origin https://github.com/guyibang/TEST2.git将本地仓库和远程仓库进行关联;

5、最后通过git push -u origin master把本地仓库的项目推送到远程仓库(若新建远程仓库的时候自动创建了README文件会报错,需要先运行git pull同步再提交)。

这里只是总结了Git上传项目的一些基本操作,要想更好地使用Git还需更进一步的学习。

报错处理

重新建立git关联

1、git添加远程库的时候有可能出现如下的错误:

'fatal:remote origin already exists'

#删除本地库关联重新建立git关系:
git remote rm origin

2、github上git clone一个项目,在里面创建一个目录,然后git push的时候,出现报错”Everything up-to-date”

原因:
1)没有git add .
2)没有git commit -m “提交信息”
如果上面两个步骤都成功执行,还出现这个错误是因为创建的目录下是空的,目录下必须有文件才能git push上传成功。

3、git报错:Pull is not possible because you have unmerged files冲突解决方法

在git pull的过程中,如果有冲突,那么除了冲突的文件之外,其它的文件都会做为staged区的文件保存起来。

git reset --hard FETCH_HEAD
git pull
git reset --hard FETCH_HEAD git pull

同客户端切换用户报错

报you do not have permission to pull from the repository解决方法

git push 的时候,发现会报这个错误,界面如下:

git报错

原因是这台电脑以前使用过git,所以保存的账号和密码是其他人的,所以需要进行修改账号和密码:
(一)进入控制面板
(二)选择用户账户
(三)选择管理你的凭据
(四)选择Windows凭据
(五)选择git保存的用户信息
(六)选择编辑或者进行删除操作
(七)完成

第一步:

第一步

第二步:

第二步

第三步:

第三步

修改完成之后就OK了。

常用命令

管理大小

# 在当前git项目包根目录运行命令,查看本地git文件包大小
git count-objects -vH

结果如下所示:

D:\project1\repo1>git count-objects -vH
数量 count: 588
大小 size: 44.86 MiB
包内 in-pack: 0
包 packs: 0
大小包 size-pack: 0 bytes
可修剪包prune-packable: 0
垃圾 garbage: 0
垃圾文件 size-garbage: 0 bytes

本地包大小管理,与云端实际Github仓库大小是两个概念,如果你要查看远程仓库大小,需要进入Github官网-Settings-Repositories,可以看到各个仓库的大小,如果是刚刚上传的,可能会显示0M,系统过约半小时就能更新显示,直达:https://github.com/settings/repositories

强制提交

在提交时,会遇到:! [rejected] master -> master (fetch first),这是由于本地库和远程库不同步造成的,解决方案是使用git pull将本地库更新到与远程库一致的版本,但要注意本地库后来做的修改可能被覆盖,最好使用git fetch(不会自动合并),查看更新情况再有选择合并,或先将本地库修改过的文件备份,git pull后再重新修改。

如果你想强制合并,则可以用这个命令:

#强制本地库提交覆盖远程
git push -f origin master
#强制本地库提交覆盖远程完整语法
 git push origin master --force

忽略文件或文件夹进行git提交

使用git提交,有时需要忽略不必要的文件或文件夹,只保留一些关键文件。只要在当前项目文件包中,找到.gitignore文件编辑它:

##ignore this file下面是忽略文件夹与文件设置##
/target/
.classpath
.project
.settings

编辑完成,再执行git就能忽略public提交了。

撤销已经加入暂存区的文件

在git add 命令后 如何撤销已经加入到暂存区的文件呢?

git reset HEAD -- . 		#撤销所有
git reset HEAD -- filename  #撤销特定目标
git rm -cached filepath 	#将文件从缓存中删除

我们还可以清空git缓存,cached是暂存区,一个是工作的目录,工作目录的东西做出修改时,会和缓存区进行对比,因此git status时,会显示出差异,因此为了使.gitignore中的内容生效,那么就删除掉暂存区,然后将所有本地文件追踪一下,就得到最新的暂存区文件,命令:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

git log方法

在使用git log查询日志时,退出当前命令,只要输入键盘q

如果你只要查看最近20条的提交记录,并输出详细信息,则可以使用:

#查询最近20条日志
git --no-pager log --decorate=short --pretty=oneline -n20

编辑完成,再执行git就能忽略public提交了。

快速提交到gitee码云

先将仓库clone到本地,修改后再push到码云的仓库仓库:

git clone https://gitee.com/用户个性地址/HelloGitee.git #将远程仓库克隆到本地

配置本地的git配置信息,执行git config命令预先配置好相关的用户信息,配置执行如下:

git config --global user.name "你的名字或昵称"
git config --global user.email "你的邮箱"

修改代码后,在仓库目录下执行下面命令:

git add . #将当前目录所有文件添加到git暂存区
git commit -m "my first commit" #提交并备注提交信息
git push origin master #将本地提交推送到远程仓库

码云多用户协同与SSH公钥生成

作为仓库创建者,你已经提交成功了,但不要得意,如果非仓库管理者,在码云上要提交成功,还查行几步操作,否则会遇到诸如"You do not have permission to push to protection branch 'master'"的错:

第一步:在gitee码云中,管理项目,设置保护分支,即允许特定的人才能push。

码云保护分支

第二步:在windows上右键打开Git Bash工具,输入ssh-keygen -t rsa -C "你的邮箱地址",默认状态下三次回车之后就可以生成密钥对

第三步:输入cat ~/.ssh/id_rsa.pub 查看你的 public key(公钥),结果如下:

生成public key

第四步:把上图中从ssh-ras(包含)到最后面的邮箱地址(包含)复制一下。

第五步:打开码云 -> 设置 -> SSH公钥,就出现了下面的画面,把我们刚才复制的内容贴到提示区,最后点击左下角的确定即可。

gitee ssh设置

第六步:输入 ssh -T git@gitee.com,系统会提示你输入yes/no,输入yes,如果出现:You've successfully authenticated, but GitHub does not provide shell access. 就表示成功了。

最后一步:配置用户名密码

git config --global user.name "你的gitee账号"
git config --global user.email "你在gitee的邮箱地址"

设置完以上这些之后,再试试git push,是不是已经畅通:)

获取指定历史版本

git管理就在于可回溯,所以你可以回滚到任意存在的历史版本。

首先,你必须先用git clone url克隆当前最新版本的仓库,然后进入当前仓库地址。

接下来,执行git log命令,你就能获得当前仓库的历史版本(如果当前仓库已经回滚过一次,并不会显所有版本,你可能要执行git push -f origin master来强制更新。

git历史版本

最后,你只要执行接下来输入命令行:git checkout b74be8e78ff*****0a15d04967,就能回滚到定版本号了。

git check  [commit] #输入长长的历史版本字符串回滚

推送develop分支

任何版本库建立时,都有master和develop两个分支,首先是获取远程的develop分支,命令是:

git clone -b develop https://github.com/zoomla/xxxx.git #获取develop分支

提交时,前两项命令不变,最后一项命令则要指明develop分支

git add . #或指定README.md等特定文件
git commit -m "你的注释"   
git push origin develop

切换master/develop分支

1、遍历当前项目所有分支

# 遍历当前项目所有分支
git branch -a

2、查看当前项目所在的分支

# 查看当前使用分支(结果列表中前面标*号的表示当前使用分支)
git branch

3、切换分支

# 切换分支
git checkout 分支名

4、merge合并代码(不是所有项目都要merge)

# merge合并代码
git merge develop

注意:切换分支或合并后,提并需要重新执行git add .git commit ""再执行git push origin master经典三步曲完成提交。

合并分支时的Already up to date.问题

一般在进行git操作的时候出现Already up to date.问题有两种情况:

一、当前分支的文件和远程仓库的文件不统一,这时候就需要将远程仓库的文件同步到本地仓库后再merge

git pull origin 分支名         #  更新本地仓库数据
git merge 要合并的分支名    # 重新合并分支
git push origin 远程分支名      #  提交合并后的数据	

二、本地仓库有新增的文件没有add和commit

git add .           
git commit -m "描述信息"
git merge 要合并的分支名    # 重新合并分支
git push origin 远程分支名      #  提交合并后的数据	

在使用Git把当前分支合并到master提示“Already up-to-date”,但当前分支和 master 分支代码不同步。

假设当前分支是:develop,主分支是:master。

解决方法:

git checkout master;
git reset --hard develop;
git push --force origin master	

强制覆盖master分支

如果master和develop分支同时有了提交,就会产生冲突,git不会同时抹除,会平行保留,从而产生很多“<<<<<<< HEAD >>>>>>>>”代码,用来代表不同版本差异,这里你可能需要强制将develop分支强制覆盖到master分支:

# 用develop强制覆盖master分支
git push origin develop:master -f

注意:强制覆盖后,远程分支则做到了develop与master相同,而本地的master分支依然会有冲突,这时推荐你将本地文件删除,重新clon远程分支进行开发,避免冲突。

变更master分支为develop

# 将本地的旧分支 master 重置成 develop
git reset --hard develop

重置成功后,如果你需要用本地分支替换远程,则需要使用强制制命令,即:

# 将本地的 develop 分支强制推送到远程 master 分支并覆盖。
git reset --hard develop

项目保存到暂存区

在开发中,瞬息万变,有时写到一半,旧代码需要紧急维护,这时stash暂存功能就很重要了

# 存到暂存区
git add.
git stash 
# 取出的时候使用 
git stash pop

Git lfs大文件上传

1.什么是git lfs:
Git LFS(Large File Storage, 大文件存储)是可以把音乐、图片、视频等指定的任意文件存在 Git 仓库之外,而在 Git 仓库中用一个占用空间 1KB 不到的文本指针来代替的小工具。通过把大文件存储在 Git 仓库之外,可以减小 Git 仓库本身的体积,使克隆 Git 仓库的速度加快,也使得 Git 不会因为仓库中充满大文件而损失性能。

2.优点是什么:
git每次保存diff,一些大文件发生变化时,整个仓库就会增加很大的体积,导致clone和pull的数据量大增。对于git lfs来说,在使用git lfs track命令后,git push的时候,git lfs会截取要管理的大文件,并将其传至git lfs的服务器中,从而减小仓库的体积。

3.使用Git lfs

安装git lfs客户端,其下载地址: https://github.com/git-lfs/git-lfs/releases/tag/v2.11.0,安装后后,需要运行命令启用它:

# 初始化git lfs
git lfs install

使用 git lfs track 命令进行大文件追踪 例如 git lfs track "*.psd"追踪所有后缀为psd的文件

使用 git lfs track 查看现有的文件追踪模式

提交代码需要将 gitattributes 文件提交至仓库. 它保存了文件的追踪记录

提交后运行 git lfs ls-files 可以显示当前跟踪的文件列表

将代码 push 到远程仓库后,LFS 跟踪的文件会以『Git LFS』的形式显示:

clone 时 使用 git clonegit lfs clone 均可

你也可以采用目录跟踪: git lfs track "design/*"

4.完整提交命令:

# 提交大文件到git仓库
git add *.bak
git commit -m "add bak 大文件"
git push

5.macOS 上使用 Git LFS:

# 安装
brew install git-lfs

# 在项目目录初始化
cd a-git-project
git lfs install

# 让 lfs 追踪所有 PDF 文件
git lfs track "*.pdf"

# 追踪文件的配置信息保存在 .gitattributes 文件中, 它本身也需要被追踪
# 不过大可以直接追踪所有文件 
git add .gitattributes
git add .

# 接下来正常 commit、push 即可
git commit -m "Add pdf file"
git push origin master

6.克隆包含 Git LFS 文件的远程仓库: 使用 git lfs clone 命令 clone 包含『Git LFS』文件的远程仓库到本地。

安装和使用Grunt

前端项目一般分为两种类型:The first,纯静态页面,都是html,类似WebApp(当然也有很多动态页面的WEBAPP); The second,包含一些动态页面,如jsp、php、 asp.net 或者是一些别的web服务语言。 由于第二种类型的前端的项目居多,那么我们先从第二种类型的项目上入手,使用grunt来操作项目的部署。

安装grunt包和任务插件:

(1)安装grunt。

以管理员身份运行 如下命令
    npm install -g grunt-cli

(2)测试是否安装成功。

cmd,输入命令行 
    grunt -version
    显示版本号即成功.
    
    PS C:\Users\admin> grunt -version
    grunt-cli v1.3.2
 

    grunt包安装 : npm install grunt --save-dev
    合并插件:npm install grunt-contrib-concat --save-dev
    按照上面的插件的安装方式继续安装其它插件
    JS混淆压缩 :grunt-contrib-uglify
    CSS压缩:grunt-contrib-cssmin
    清除:grunt-contrib-clean
    添加指纹:grunt-rev
    替换页面中的静态资源引用 :grunt-contrib-levin-usemin

    或者根据已有的package.json文件中的devDependencies依赖项进行一次安装
    npm install
    
    

使用svn下载github子文件夹

此方法仅适用于Github仓库,客户端安装有svn时,可以使用“检出check out",检出github指定目录文件夹。

如:

https://github.com/zoomla/CMS-Source-code/tree/master/ZoomLa%E9%80%90%E6%B5%AACMS_1.0%E6%BA%90%E7%A0%81

https://github.com/zoomla/CMS-Source-code/trunk/ZoomLa%E9%80%90%E6%B5%AACMS_1.0%E6%BA%90%E7%A0%81

即:将链接中tree/master替换为trunk,即可顺利检出子文件夹。

使用svn下载github子文件夹1

使用svn下载github子文件夹2

使用svn下载github子文件夹3

使用svn下载github子文件夹4

使用svn下载github子文件夹5

当然,你还可以使用第三方工具,如通过DownGit下载链接为https://minhaskamal.github.io/DownGit/#/home,规则同上述。