git(仓库合作)
git:分布式版本控制系统(方便协同工作) vs svn(集中式)
分布式相比集中式的好处:1.不怕中央服务器单点故障、2.速度快、3.支持离线工作
git仓库可上传到GitHub做托管
git config --global/Local(省略) 第一次使用配置用户名和邮箱
git credential.helper store保存配置信息;git config --global --list查看保存好的配置信息
一些基本命令行操作
- mkdir:新建
- cd:进入文件夹 cd …:退出文件夹
- dir -force:查看当前目录下的文件(win) ls -a(linux)
- ls:查看当前目录下的所有文件
- git ls-files:查看当前版本中暂存区中和已提交的文件名
- vi:修改文件,修改暂存区中的文件会被自动移至工作区,需要重新git add
- cat 文件名.文件类型:查看文件内容
- cp:复制
- alias xxx=yyyyyyyy:用xxx替换yyyyyyyy的功能
- #:注释
- 创建仓库 git init(本地新建) or git clone(从远程服务器,如github克隆)
git默认不会将空文件夹添加到仓库中
一些区域名词
- 仓库:也可以理解为目录,其中所有的文件都可以被git管理起来,每个文件的任何一次修改或操作都能被跟踪到以便追踪历史或还原
- 工作区 (车间):.git所在目录 工作目录
- 暂存区 .git/index (货车):将修改后的工作区的文件添加过来(git add)
- 本地仓库 .git/objects 即通过git init创建的仓库 (仓库):将暂存区的修改内容提交到本地仓库(git commit(提交)) 存储版本信息和代码的主要位置。
git中文件的状态
—>>向前(即该markdown中的向下)<<—向后(即该markdown中的向上)
未跟踪
新创建的、未被git管理的文件 —>>git add
未修改
已被管理、但文件内容还没变化 —>>修改 <<–git rm
已修改
已被管理、文件内容已变化 —>>git add <<–git checkout
已暂存 <<–git commit 至未修改(相当于版本确认更新,对于更新后的文件就是未修改的状态)
修改后、暂存区内的文件 <<–git reset回退版本
git中有关文件的命令
HEAD默认指向最新的提交节点
添加文件:vscode/vim/linux的echo命令 echo “内容” > 文件名.文件类型
>>表示追加到当前文件的最后
- git status:查看仓库的状态
- git add 直接加文件名.文件类型:跟踪文件,将文件移交至暂存区,等待后续的提交操作
- git add *.txt:把所有txt文件都上传到暂存区
-匹配 *;通配符 ?;匹配单个字符 []列表中单个字符 (任意中间目录 [a-z]任意一位小写字母) ;!取反 - git add .:把当前目录所有文件都上传到暂存区 .==》当前目录
- git rm 直接加文件名.文件类型:git add的反操作,即在工作区和暂存区中同时删除指定文件 注意:rm不是git命令,单独的rm是linux删除工作区文件的命令,但是还需要git add 文件,在暂存区中同步删除。
- git rm --cached 文件:暂存区中删除指定文件,保留在当前工作区中
- git rm -r*:递归删除某个目录下的所有子目录和文件
注意不管哪种方式删除后还需要再提交到仓库,不然仓库中还保留着当前文件 - git commit -m参数指定提交的信息,如“这是第一次提交”,这个信息会被计入到仓库中。不需要指定文件,因为会提交全部暂存区中的文件
若不使用 -m 参数,则会自动进入到一个交互界面,默认vim则i进入编辑,输入提交信息,:wq保存退出即可; 默认notepad,则直接编辑记事本,保存后退出(关闭记事本)即可
真正保管文件,只会提交暂存区的文件,不会提交工作区中的其他文件 - git log:查看提交记录 每次提交都能看到一个唯一的16进制的id字符串以及提交的作者和邮箱和时间和注释信息
git log --oneline:仅查看简洁的提交记录,即只看id和注释信息 - git reset 后跟版本id:修改内容或回退至原先的某一个版本,提交历史也会抹去相应的记录,就相当于没有做之后的提交commit
git reset --soft 后跟版本id:回退到某一个版本并且保留工作区和暂存区的所有修改内容
git reset --hard 后跟版本id hard这种方式谨慎使用:回退到某一个版本并且丢弃工作区和暂存区的所有修改内容,即未提交的内容全部消失
git reset --mixed后跟版本id reset默认参数,相比soft,需要将修改的内容重新添加至暂存区 回退到某一个版本,并且只保留工作区的修改内容并丢弃暂存区的修改内容 - 回溯 ==》git reflog:找到误修改之前的版本号,再git reset到那个版本即可
- git diff:查看区、库之间文件的差异;不同版本之间的差异;不同分支之间的差异,默认比较工作区和暂存区,会显示发生更改的文件和更改的详细信息,红色是删除的内容,绿色是新增的内容;没有任何输出代表工作区和暂存区的内容是相同的
git diff HEAD:比较工作区和仓库(版本库)
git diff --cached:比较暂存区和仓库(版本库)
git diff id1 id2:比较两个版本,这里其中一个id也可以换成HEAD
HEAD~ or HEAD^表示提交最新版本的上一个版本;HEAD~2表示提交之前的第二个版本
git diff id1 id2 file3.txt:只会查看file3.txt的差异内容
git diff 分支名1 分支名2:查看两个分支之间的差异
git status和git diff也能知道冲突的内容
Github、代码云等在线代码托管、协作平台中的操作
- .gitignore 自己设置的一个特殊文件,忽略掉一些不应该加入到版本库中的文件(系统自动生成的文件、临时文件、编译生成的中间文件、可执行文件、日志文件、缓存文件、.env等敏感信息文件、压缩文件…)。这是个文件类型使用方式:直接echo文件 > .gitignore,这样再git status就看不到被ignore的文件了,只能看到.gitignore。.gitignore中的内容是被忽略掉的文件的文件名,可以编辑.gitignore的内容(即修改哪些文件被忽视)。.gitignore对已经添加到版本库中的文件是没作用的,需要先使用git rm*按行、从上到下进行规则匹配。
- git clone +地址远程链接,本地就会多一个文件夹,配置ssh密钥:" #cd回用户根目录 #cd .ssh进入ssh目录 #ssh-keygen生成密钥 -t rsa指定协议为rsa -b 4096指定大小" 第一次直接回车即可,但若之前已经配置过,为避免覆盖,需要在当前输入一个新的文件名,然后在输入要设置的密码,会生成两个文件,xxx私钥文件、xxx.pub公钥文件(上传到github 头像 setting ssh配置) 第一次到这里即可,若生成新的ssh需创建一个config文件,指定使用当前密钥,在命令行中键入命令“tail -5 config”,#github Host github.com Hostname github.com PreferredAuthentications publickey IdentityFile ~/.ssh/(新文件名)
- 进入remote文件夹后操作和本地一样, 但git commit后远程仓库还是空的。因为git是分布式,git和本地的git clone是相互独立的。
- git push:把本地仓库的修改推送给远程仓库
- git pull git pull<远程仓库名><远程分支名>:<本地分支名> 名称省略默认拉取main分支:把远程仓库的修改拉取到本地仓库,并合并,在合并的过程中就有可能产生冲突。
- git remote -v:查看远程仓库中的内容(地址)
- git fetch:获取远程仓库的修改内容
- git remote add origin git@github.com:… (origin:在远程仓库中的别名,可随意指定): 关联本地仓库和远程空的新仓库,git branch -M main指定分支为main git push -u origin main:main (前一个main:远程仓库的main分支,后一个main:本地仓库的分支名)
gitee码云:面向国内 gitlab极狐:私有化部署服务器(可使用docker部署在本地)
在vscode中,“源代码管理”项即可实现这一套完整操作(编辑、add、commit、同步推送到远程默认仓库默认位置)
分支
分支 可以看作是代码库中的不同版本,可独立存在并由自己的提交记录
分支命名 feat(feature):一般表示开发某个功能的分支
- git branch:查看分支,不同分支在同一个文件夹下,分支是并行的:即同一个文件在不同分支中编辑的内容在合并等操作前是互相不可见的
- git branch <分支名>:创建分支
- git checkout <分支名>:切换分支,也会用来恢复意外修改的文件或目录到之前的某个状态 git checkout命令默认切换分支
- git switch <分支名>:专门用来切换分支
- git log --graph --oneline --decorate --all:展示分支
- git merge <要被合并的分支>:将分支合并到当前分支,分支被合并后还是存在的,若这个分支不需要了需要手动删除
- git merge --abort:中断合并
- git rebase <分支名>:找到两个分支提交记录最晚的共同祖先,把当前分支移动到rebase的分支的最后
merge vs rebase:是否改变为线性的提交历史(是否有分支的记录) - git branch -d <分支名>:删除已经完成合并的分支
合并时冲突:若两个分支修改了同一个文件同一行代码,git就不知道保留哪个分支的内容,就需手动合并
手动合并:根据git diff的信息,手动vi修改文件
一个项目的主要分支:
1. gitflow模型:
- main(最新版本可发布的稳定代码,不能直接修改,只能通过合并分支,主、次、修订版本)
- hotfix(问题修复分支,来自main分支)
- develop(开发分支,来自main,也是核心分支)
- feature(功能分支,来自develop,并会合并回develop)
- release(预发布分支,发布前的测试和验证,来自develop,会合并至main或develop)cherry pick:挑一些好的
2. github flow模型:
- main(最新版本可发布的稳定代码,会设置分支保护)
- feature(Add、Commit,pull request, review, deploy, Merge to main)