git
svn:
之前用svn管理项目,svn是集中式管理,客户端只保存最新的版本,不保存历史记录,而中央服务器会保存
所以若中央服务器卡掉,则项目的历史记录就得不到了,项目就不能回滚到以前。
存储的是版本之间的差异,所以回滚到某个版本就慢
git:
简单操作:
git clone http://xxxx/xxxx.git:从远程下载到本地
改动....
git add .:提交的修改到暂存区;
git commit:提交暂存区的所有修改到分支;
git branch -M main:命名分支为mian;
git remote add origin https://github.com/tanzhouxing/medical_static_app_pku.git:给远端的仓库取名为origin
git push origin main : 把 main 分支push到远程主机 origin
第二次用:
git pull origin:把远程的东西更新到本地
服务器和客户端都存有历史记录,github就是远端仓库,能把项目放上去让别人操作
存储的是所有版本的完整快照,回滚快
安装,再一直点下一步
打开:
清屏:clear
查看版本:
新建文件夹,假定为项目文件夹,用git管理,在里面右击:
快捷键:
ctrl+a:光标回到起始
用户名邮箱设置,这样在提交时,会记录到log里面,每个commit都对应一个用户名和邮箱(global是给整个计算机一次性设置):
git config --global user.name 'aaa2222339'
git config --global user.email '734331516@qq.com'
删掉全局用户名和邮箱:
git config --global --unset user.name
git config --global --unset user.email
git config --list :查看已有的配置
删除邮箱账号(若为local):
工作区:当前代码所在目录和文件;缓存区:从工作区提交到此,相当于代码修改后的草稿;版本库:从缓存区提交到此,存储最终的版本
git init:建立.git文件夹,里面的不同文件夹代表不同的功能,其中object文件夹即版本库,用于存储
echo 'asd' > a.txt:把内容输入到a.txt
vim后,:set nu能够显示行号,:q!强制退出
下图是单纯地生成git对象:
--stdin:读取管道过来的东西
-w:把test content作为value,把它的哈希作为key,以(key,value)的形式存储到.git/object里面,此处的(key,value)被称为git对象
如果没有-w,则不会存储到文件里面,只会返回一个key而已:
下图:
通过文件路径找到文件,把文件作为value,它的哈希作为key,-w:则把(key,value)存储进去
查看git对象,参数是文件哈希:
下图update-index将git对象放到暂存区并给它个名字:
add:将文件放入暂存区,若缓存区已经有记录了,则不用add了
--cacheinfo:去当前数据库(object文件夹)中去找文件;给哈希对应一个文件名
将暂存区的所有东西以树对象的形式写到数据库中,不过暂存区还有内容,不会清空掉,然后-t查看对象类型:
git对象(blob对象)代表文件的一次版本,树对象代表项目的一次版本
将2个文件add到缓存区,然后生成树对象并写入到数据库中:
-p看内容,查看树对象:
根据树对象生成对应的提交对象(树对象+一些信息),此时就能附加一些信息,下面-t是查看类型,-p是查看内容:
生成第二个提交对象,此时要指定第二个树对象,和前一个提交对象
一个提交对象对应一个项目版本
git add ./:将当前目录所有修改了的文件生成一个个的git对象,然后放到版本库,最后在放到暂存区
将缓存区的东西生成一个树对象和一个提交对象,并存储到库中:
未跟踪的文件修改,根本不会被统计到git status里面
git status:查看文件所处状态
staged:已暂存
先git add之后的文件,如果修改了,还需要再git add进去,才能把最新的暂存起来
git diff:工作区的文件和暂存区的文件相比较,显示差异
git diff --staged:暂存区的文件与提交后的相比较,显示差异
changes to be commited:绿色字体:暂存好了但是未提交状态,接下来要commit
changes not staged for commit红色字体:没有把修改暂存起来,接下要需要add暂存
untracked files:红色字体:未跟踪状态(未暂存),接下来需要add
git commit后进入一个vim页面,可以写很多message后,接着提交
git commit -a -m 'asdasd':跳过暂存阶段,直接提交(前提是跟踪后的文件才行)
rm 文件后,再 git add,再提交:仅仅是对当前没有该文件的状态做了一个新版本,之前有该文件的那个版本还在
git log:查看所有历史提交对象(项目版本);git log --oneline:简洁形式
git rm 文件:把文件删掉,然后将修改添加到暂存区(git add),后续需要自己commit
分支是指向最新提交对象的指针
git branch 分支名字:创建一个分支
git checkout 分支:切换到新的分支,head是一个活动指针,始终=当前分支
git branch:得到所有分支的列表,前面有*的是当前分支
git branch -D 分支名:强制删除分支,但是在删除前需要先切换到别的分支,比如切换到master
查看所有分支图:
给上面这个命令起个别名:
git branch -v:查看每个分支的最后一次提交对象
git branch 分支名 提交对象的哈希:针对历史记录中的一个提交对象,新建一个分支指向它,这样再切换分支过去后就能回滚了
切换分支后,工作目录就会改掉
git checkout -b aaa:创建一个aaa分支,且切换过去
在切换分支之前,要确保git status是干净的,不存在未跟踪的文件且全部提交了
工作流程:
正在工作时,需要增加一个功能,确保git status 干净后(如果不干净则commit),另开一个分支并切换过去:
git checkout -b iss53
此时又需要解决主分支一个问题,确保干净后切换到主分支:
git checkout master
接下来需要另外建立一个分支来解决问题:
git checkout -b hotfix
解决完之后add ,后commit,然后切换到主分支后,合并hotfix分支
该合并叫做快进合并(2个分支都在一条线上,把master越过几个版本与前面的合并),此时iss53分支在master后面,因此iss53还有master的bug
合并之后就可以把hotfix分支删掉:git branch -d hotfix
接下来切回iss53再工作,随后切出来,将它与master分支合并(典型合并:2条线上的合并),此时可能产生冲突
接着看看冲突文件,然后再git add,再commit,最后再删掉iss53分支
工作时,新建分支,写完一个功能就合并删除,然后再新建分支。。
.git/refs/heads保存所有分支,分支就是最新的提交对象的哈希
.git/HEAD:保存可变指针,它总指向当前的提交对象
若在b1分支上做了改动,此时又要切换到别的分支,但是又不想提交,则可以先把改动存到栈中:git stash,然后git status就OK了,然后就可以切过去
git stash list:看看栈上有哪些保存
返回b1分支后,需要从栈上拿回东西:git stash apply,然后再删掉栈顶:git stash drop stash@{0},或者直接:git stash pop:拿回并删除栈顶
后悔操作:
若在工作区改动了而没有暂存,若撤回对某个文件的修改则:git checkout -- 文件名
若已经暂存了但是未提交,想撤回不要暂存:git reset 【HEAD】 文件
git reflog:查看最完整的日志,只要HEAD有动,就会记录进去;git log --oneline:只查看主要日志
若已经提交,但是注释写错了,且暂存区都已经提交,则git commit --amend:可以修改注释;若暂存区还有未提交的,则又能改注释,又能改动之前的提交
git commit --amend:本质上head和分支统一退一格指向前一个提交对象,然后再新建一个提交对象,并指向该对象;然而切换分支的时候是只动head
git reset --soft HEAD~:将HEAD和它所指向的分支向后移动一个,但是不会改动工作区和暂存区;将~改为提交对象的哈希,则指向到那个提交对象。
若把上面的soft改成mixed或者去掉soft,则还要改动暂存区;若把soft改成hard,则工作区和暂存区都会变,此时就和checkout很像了,只是分支也动了
一个提交对象对1个树对象,1个树对象对应多个git对象,一个git对象对应1个文件
如果丢失了几个提交对象,可以通过git reflog找到对应的提交对象,然后新建一个分支指向它:git branch 分支名 提交对象哈希
git tag:列出所有的taggit git
git tag 名字(v1.0):给最新的提交对象打一个tag,该tag就不再动了
git show tag名字:查看某个tag
git tag -d tag名字:删除标签
git tag tag名字 提交对象哈希:给特定的提交对象
git checkout tag名字,再git checkout -b 分支名:切换到某个tag上,同时在tag上建立一个分支
Eslint是一个工具,检测js文件语法是否正确
使用:先在某个文件夹下:npm init(初始化一个简单的package.json文件),然后安装npm install eslint --save-dev
(其中npm -g是全局安装,只是安装包位置不同而已:把模块安装到了C:\Users\Jary\AppData\Roaming\npm\node_modules\
该路径可以通过npm config list中的prefix查看,由于该路径被path指向,所以若npm install -g webpack
则能直接使用webpack命令,若直接c:\123>npm install xxx
则将会安装到当前目录下:c:\123\node_modules\xxx
--save-dev:仅在开发环境中需要,会将模块写入:devDependencies
--save:开发和生产环境都需要,写入:dependencies
npm uninstall 模块:删除模块,但不删除模块留在package.json中的对应信息
npm uninstall 模块 --save 删除模块,同时删除模块留在package.json中dependencies下的对应信息
npm uninstall 模块 --save-dev删除模块,同时删除模块留在package.json中devDependencies下的对应信息
)
为了能用npm run,则配置package.json文件:
npm run lint:create生成一个文件,用于提供编码规则,其中:
随后在src文件夹下新建一个js文件,并写入一些js语句,然后npm run lint来检测
只要在暂存区的东西, 都提前记录到版本库了
git branch --merged:查看合并到当前分支的分支列表,若有,则需要删掉它们
git branch --no-merged:查看没有合并过来的分支
只要本地分支和远程跟踪分支建立了联系,就能直接git push上去,也能git pull下来;
clone :下载master分支,所有远程跟踪分支,并将master与远程跟踪分支建立联系
模拟2人合作git:
github可以创建远程仓库,可以删除
新建远程仓库:
因为要用自己的.git文件,所以不要点readme初始化
先创建好本地仓库后,然后git remote为远程仓库在本地取个别名,再查看别名,该别名拥有2个地址:
把master分支推到远程仓库上(push和pull只针对单个分支的操作):
git push 远程仓库别名 master(无需去跟踪),而且push后就会生成远程跟踪分支(红色分支)
项目经理邀请成员加入(另一个号是:zhuiguangzhewudi):
复制给成员邀请链接:
成员登录github后,浏览器访问邀请链接就可以了(或者成员那边也有邮箱提示)
成员下载远程仓库到本地:git clone 远程仓库url,此时连.git文件夹也有了,有了master分支,所有远程跟踪分支(由于别名是origin,所以以origin打头)
也将master与远程跟踪分支origin/master建立了联系
接着对master分支做一些改动,commit后再push上去:
git push
然后项目经理更新远程仓库到本地master:
先与远程跟踪分支建立联系:git branch -u 别名/master,然后git pull
新建一个分支b1,改动一下再push上去(git push 别名 b1)
此时产生跟踪分支,然后和跟踪分支建立联系:
git branch -u 别名/b1
下次修改就能直接git push上去了
若不小心删掉b2分支上东西,想通过远程来更新b2:
则删除已有的b2分支,然后新建一个b2分支且切换过去,并与远程跟踪分支建立联系:
git branch -D b2
git checkout --track 别名/b2
删除远程仓库:
到setting里面,然后:
git branch -vv:查看所有跟踪分支
若A用户push了,B用户不能直接push,得先pull到本地,动一动可能的冲突文件,再add,commit,然后就能push了
若远程仓库已经被更改了,则不能直接push上去,得先自己pull下来,然后才能push上去
fork可以把别人GitHub仓库复制一份到自己的远程:
然后在本地clone过来改一改,再push过去
在自己的GitHub里面给对方留言:
别人一登录就会在这个项目里看到:
别人也能在此留言:
自己登陆时,可以看到别人的评论:
别人可以将其合并:
合并的结果是最后的版本
.gitignore:
*:匹配任意多个字符
?:匹配任意一个字符
https和ssh是2个协议,使用https时,每次提交都要去看windows凭证来验证用户
ssh:
往GitHub上某个账户添加多个公私钥对(账户),随后这些账户就能无需登录直接访问这个账户了。随后clone的话也是用ssh地址
然后复制id_rsa.pub里面的内容,然后