切换至深色主题
Git分布式版本控制系统
基本概况
Git 是Linus Torvalds为了帮助管理Linux内核开发而使用C语言开发的一个开源分布式版本控制系统,旨在处理从小型到 快速高效的超大型项目,Git 易于学习,占用空间小,性能快如闪电。 它超越了 Subversion、CVS、Perforce 和 ClearCase 等 SCM 工具 具有 cheap local branching、 方便的暂存区域和多个工作流程。
Git文档:https://git-scm.com/docs
Donwload:https://git-scm.com/download/linux
GitHub:https://github.com/
阿里云效:https://codeup.aliyun.com | 13718647330
window配置
安装后注意需要配置环境变量。
# 此电脑 -> 右键"属性" -> 高级系统设置 -> 环境变量
D:\software\Git\binLinux配置git
> yum -y install git-core
# 忽略版本冲突
npm install --legacy-peer-deps
# 强制安装
npm install --force
# 查看版本
> git --version生成SSH Key
> ssh-keygen -t rsa -C "ysungod@163.com" # 邮箱
# 查看密钥 Mac
ls -al ~/.ssh拷贝
# Mac | /Users/[apple]/.ssh | /Users/[apple]/.ssh/id_rsa.pub
> pbcopy < ~/.ssh/id_rsa.pub
# Linux复制
cat ~/.ssh/id_rsa.pub
# windows | 只能手动复制
cd ~/.ssh | C:\Users\Eshen\.ssh | C:\Users\Administrator\.ssh
C:\Users\Eshen\.ssh\id_rsa
C:\Users\Eshen\.ssh\id_rsa.pub
C:\Users\Eshen\.ssh\known_hosts
C:\Users\Eshen\.ssh\known_hosts.old配置Coding等代码协同平台
> 复制id_rsa.pub公钥
> 个人账户设置 > SSH公玥 > 新增公玥配置基本信息
> git config --global user.name '709992523' # 姓名
> git config --global user.email 'ysungod@163.com' # 电子邮箱
> git config -l # 确定是否修改成功
# 永久存储(明文保存)
> git config --global credential.helper store # 设置记住git账号和密码
git config pull.rebase false
# 更新了Git账号密码
> git config --global --unset credential.helper # 清除当前凭证配置
# 重新设置
> git config --global credential.helper store # 设置记住git账号和密码Git仓库
# 查看当前本地分支的修改状态
> git status
# 查看提交历史
git log
git log --oneline --graph --decorate --all
# 或者使用更详细的日志查看合并提交
git log --merges --oneline
# 查看变更细节
> git diffGit工作区:Changes
工作区就是项目工程的目录文件,在VSCode中呈现树状结构分布。
└─ SOURCE CONTROL
└─ Changes
├─ file_1.ts
└─ file_2.css撤销工作区的修改代码
# 撤销单个文件工作区修改
git restore 文件名
# 撤销所有工作区改动
git restore .
# ⚠️ 谨慎,这将直接永久删除已经修改的暂存区、工作区所有代码
> git reset --hard将工作区的修改代码提交到暂存区
# 提交单个文件
> git add file_name
> git add package.json
# 提交多个文件
> git add .Git暂存区:Staged Changes
暂存区是一个临时存储区域,它包含了即将被提交到版本库中的文件快照,在提交之前,你可以选择性地将工作区中的修改添加到暂存区。
└─ SOURCE CONTROL
└─ Staged Changes
├─ file_1.ts
└─ file_2.css撤销暂存区的修改代码
# 撤销单个文件,但更改仍保留在工作区中
> git reset HEAD <file>
# 撤销所有文件,但更改仍保留在工作区中
> git reset HEAD .
# ⚠️ 谨慎,这将直接永久删除已经修改的暂存区、工作区所有代码
> git reset --hard将暂存区的修改代码提交到本地版本库
# 步骤一: 提交到本地版本库
> git commit -m "提交信息"本地版本库
撤销本地版本库的修改代码
# 软撤销上一次从暂存区提交的修改代码,即撤销的修改代码恢复到暂存区
git reset --soft HEAD~1
# 指定回退到某个commit
git reset --soft <commit-id>
# ⚠️ 撤销最后一次提交,如果当前本地版本库不存在从暂存区提交的修改代码,则直接撤销本地版本库的历史修改代码,谨慎,这将直接永久删除已经修改的本地版本库、暂存区、工作区所有代码
> git reset --hard HEAD~1将本地版本库的修改代码提交到远程版本库
# 推送到远程版本库
git push远程版本库
撤销远程版本库的修改代码
在已经提交的基础上,添加新的更改或修改提交信息
# 你已经向远程版本库提交了一次
> build:们是伟大时代的引领者-是的
# 案例一
# 只是想修改最后一次提交的提交信息
> git commit --amend # 这将打开默认的文本编辑器,让你编辑提交信息。
# 强制推送
> git push --force
# 案例二
# 添加新更改,并将新更改将会被包含在上一个提交中
> git add <file> # 暂存新的更改
> git commit --amend 3 可以更新提交信息
# 强制推送
> git push --force
# 案例三
# 只想添加更改而不修改提交信息
> git add <file> # 暂存新的更改
> git commit --amend --no-edit
# 强制推送
> git push --force修改版本
基础版本号:"version": "1.0.0"
npm version patch [1.0.1] # 当要发补丁版时可运行命令
npm version minor [1.1.0] # 当要发小版本时可运行命令
npm version major [2.0.0] # 当要发大版本时可运行命令
npm version prepatch --preid=alpha [1.0.1-alpha.0] # 如果是修复小bug
npm version prerelease --preid=rc [1.0.1-rc.0] # 已经发布,仅更新
npm version preminor --preid=alpha [1.1.0-alpha.0] # 如果是新增或更新功能
npm version premajor --preid=alpha [2.0.0-alpha.0] # 破坏性的更新仅仅修改版本数字
npm version [1.0.1] | npm version [1.0.1-alpha.1]查看提交记录
> 上次提交后修改状态:git status <-s | 输出简短结果>
> 查看提交记录:git log <--oneline | 简洁显示> <--graph | 分支合并历史时间> <--reverse | 逆向显示> <--author | 指定用户提交记录>
git branch --set-upstream-to=origin/<branch> origin/feature_0306error: Your local changes to the following files would be overwritten by checkout
> git stash # 解决方案紧急操作 | 如果其他开发人员不小心把自己的不完整代码提交到仓库覆盖掉,那么其他分支的开发人员可执行如下操作。
# 当前分支
> git push --force
# 指定分支
> git push --force origin master
--force: 无条件覆盖远程分支
--force-with-lease: 只有在远程分支没有其他人推送新提交时才覆盖(更安全)
# 在一个github仓库上,如何强制将分支wang推送覆盖到分支devot,不需要考虑冲突与覆盖问题,仅仅需要能够直接强制覆盖替换。
git push origin wang:devot --force
git push origin point-module:master --forcegit reset 参数详解
> --soft:撤销git commit, 不撤销 git add
> --mixed:不删除工作区已改动代码,仅撤销git commit与git add . | git reset --mixed
> :删除工作区已改动代码,同时撤销git commit与git add .
# 回滚 | 撤销操作 git merge
> git reset <--soft> <--mixed> <--hard>
# 步骤一:回退到指定版本号, SHA通过git log查看
> git reset --hard [commit SHA]
# 步骤二: 然后推到远程
>:git push origin HEAD --forcemaster回撤后重新合并失效
在开发分支origin/devpt上开发,合并到主支origin/master,然后因为发现问题而回撤合并,之后又在开发分支上新增代码,再次合并时发现之前回撤的代码没有重新合并进来。
- Git 的版本追踪机制:当你在 origin/master上回撤了 origin/devpt的合并提交时,Git 将其视为一次“撤销操作”,后续再合并 origin/devpt时,Git 会认为被回撤的代码“已存在且被废弃”,因此只合并新提交。
- 当使用revert撤销了某个提交后,再次合并时Git会认为这些更改已经存在于历史中(尽管被撤销了),所以不会重新应用这些更改。解决方法是对之前的revert操作再进行一次revert(即反撤销)。
# 步骤:从 主支master 拷贝 新建 分支master-revert
# 步骤:本地切换到 分支master-revert
# 步骤:git revert取master分支操作记录Revert提交记录[commit SHA] Revert "优化需求2.8"
git revert -m 1 [commit SHA]
# 步骤:推送到远程
git push
# 将 分支origin/devpt 再次合并到 分支master-revert
# 将 分支master-revert 合并到 主支master
# 在Github上有一个主支main,现在基于主支main新建两个分支devpt与zhangsan,在分支devpt开发了一个功能代码,然后将分支devpt合到主支main,后续在分支zhangsan上又开发新的功能,并将分支zhangsan的新代码合到主支main,但是后来发现分支devpt合进来的功能有问题,需要把分支devpt合进来的代码撤回,但是不能把分支zhangsan的功能代码撤掉,需要保留。
# 使用 git revert来撤销这个合并提交,但保留后续的提交
git revert -m 1 <merge-commit-hash>
# 如果撤销过程中出现冲突,先解决冲突
git revert --continue使用 git revert来撤销这个合并提交,但保留后续的提交
# 假设提交历史如下
A---B---C---M1(devpt合并到main)---D---E---M2(zhangsan合并到main)
# 1. 确保在 main 分支
git checkout main
git pull origin main
# 2. 找到 M1 的提交哈希(假设为 abc123)
git log --oneline --graph
# 3. 撤销 devpt 的合并
git revert -m 1 abc123
# 4. 提交撤销
git commit -m "Revert merge of devpt branch"
# 5. 推送到远程
git push origin main预提交钩子
分支管理
本地分支操作 | 基准远程分支:origin/feature/guider
> git branch [列出本地分支]
# 本地当前分支
git rev-parse --abbrev-ref HEAD
> git branch -a [查看本地所有分支]
> git branch -d <branch_name> | -d | --delete [删除本地分支]
> git branch -D <feature/guider> | -D | --delete --force [强行删除]
# [删除除了master分支外的本地所有分支] 本地没有合并的更改也会删除
git branch | grep -v "master" | xargs git branch -D
# 避免删除有未合并内容的本地分支
git branch | grep -v "master" | xargs git branch -d远程分支操作 | 基准远程分支:origin/feature/guider
git fetch # 从本地更新远程所有分支
git remote -v # 查看所有远程仓库 [gone]远程分支已经不存在
git remote show origin # 查看远程仓库基础信息
git branch -r # 查看远程所有分支
git remote prune origin # 删除远程仓库已经不存在的分支
git push origin --delete <branch_name> # 删除远程分支
git remote add [repository_name] [url] # 创建远程仓库
git push origin :[branch_name] # 推送一个空分支到远程分支相当于清空该分支,即置空管理分支 | 基准远程分支:origin/feature/guider
> 创建本地分支并提交到远程,从而创建分支:git push origin [test]:[test]
> git branch --set-upstream-to=origin/[branch_name] [branch_name]
> 将本地分支推送到远程[远程没有改分支] git push origin [feature/guider]基于某个远程分支创建新分支 | 基准远程分支:origin/feature/guider
git checkout -b <是否立即切换到该分支> # 本地分支存在
git checkout -b wangjun origin/wangjun # 本地分支不存在
git checkout [wangjun] # origin/wangjun 本地分支已存在
# 放弃当前分支修改,强制切换至目标分支
git checkout -f [wangjun] # 方法一
git switch -f [wangjun] # # 方法二 Git 2.23+创建本地新分支并同步到远程仓库 | 基准远程分支:origin/feature/guider
> 创建本地新分支并切换到新分支:git checkout -b [name]
> 查看:git branch
> 提交该分支到远程仓库:git push origin dev分支管理 | 基准远程分支:origin/feature/guider
> git diff; // 查看修改内容的冲突
> git merge <BRANCH_NAME>; // 将某个分支代码合到当前分支上
> git checkout <BRANCH_NAME>; // 切换分支 [origin/name] | 可以
> git checkout <BRANCH_NAME>; // 切换分支 [name] | 本地分支 | 如果本地分支已经存在就这样操作[name]
> git merge origin/master; // 合并分支- merge
> git merge --no-ff [master]
> git merge --continue // 检查是否存在中断的合并,避免合并之后,再次提交还会存在冲突
> 从本地分支合:git merge wang_dev
> 从远程分支合:git merge origin/wang_dev
# 将分支 black 的所有提交合并为一条,然后合并到 main 分支
# 1. 切换到 main 分支
git checkout main
# 2. 拉取最新代码
git pull origin main
# 3. 将 black 分支的所有提交合并为一条(squash 合并)
git merge --squash black
# 4. 提交合并结果
git commit -m "feat: 合并 black 分支的所有更改"
# 5. 推送到远程仓库
git push origin maingit rebase操作示例
> git rebase origin/master; // 合并分支- rebase
> git rebase --abort // 放弃当前git rebase操作
> git rebase --continuegit rebase与git merge之间的区别?
GitFlow工作流程
> master分支:最为稳定功能比较完整的随时可发布的代码
> develop分支:开发分支
> feature分支:用来开发新的功能
> release分支:用于发布准备的专门分支
> hotfix分支:用于修复线上代码的bug拉取指定文件夹代码
> git init [folder]; // 创建一个空的本地仓库,可以自定义文件夹
> git remote add -f origin https://github.com/mrdoob/three.js.git // 连接远程仓库GitHub
> git config core.sparsecheckout true // 开启sparse checkout 模式指定需要下载的文件夹或文件, 设置要克隆的仓库的子目录路径, ""是通配符,"examples/**/",!"是反选,"!docs"
> echo [file_list | file_name] >> .git/info/sparse-checkout
> git pull origin master //开始拉取切换Git仓库地址
> cd .git/config
> url = git@e.coding.net:eshen/server.git# 恢复误删除分支 | 有人删除了远程分支代码,而本地该分支还存在,然后可以把本地分支强制推到远程恢复当前分支
> git log -g:查找需要恢复的分支commit ID
> git branch fixbug/#1029470 7800abd8ba0bf4d3d95695ea856c209776a64139
> 切换到该分支,查看代码是否存在。windows 安装相关配置选项
Configuring the line ending conversions
Checkout Windows-style,commit Unix-style line endings:在检出文本文件时,Git会将LF转换为CRLF。当提交文本文件时,CRLF将转换为LF。 对于跨平台项目,这是Windows上推荐的设置(“core.autocrlf”设置为“true”) Checkout as-is , commit Unix-style line endings:在检出文本文件时,Git不会执行任何转换。 提交文本文件时,CRLF将转换为LF。 对于跨平台项目,这是Unix上的推荐设置 (“core.autocrlf”设置为“input”) Checkout as-is,commit as-is:在检出或提交文本文件时,Git不会执行任何转换。对于跨平台项目,不推荐使用此选项(“core.autocrlf”设置为“false”)
升级最新Git版本
CentOS默认的的yum仓库中的Git默认版本很低
> 查看版本:git --version
> 依赖库安装:yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
> 卸载旧版本:yum remove git
# 安装 centos6 WANDisco 仓库
> yum install http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
# 安装 centos7 WANDisco 仓库
> yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
> 安装 Git:yum -y install git
> 查看版本:git --versionGIT分支管理规范
GIT分支版本号规范
GIT提交信息规范
- feat: 新增任务与功能
- fix: 修复BUG
- perf: 性能
- optimize: 优化
- conf:更新配置
- test:测试用例,包括单元测试、集成测试等
- revert: 回滚到上一个版本
gallery:
.gitignore文件
# 基础目录
node_modules
dist
dist-ssr
.history
yarn*
stats.html
.temp
.cache
# local env files
*.local
# Log files
*.log
*.log*
# Editor directories and files
.DS_Store
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?lint-staged
在提交代码到远程仓库前进行代码预审检查,对于不符合代码共识的内容进行提交约束。
> npm install --save-dev lint-staged常见问题与释疑
Git | Git Bash | Git FAQs | Git GUI | Git Release Notes
CRLF LF CR
> CRLF: Carriage-Return Line-Feed的缩写,意思是回车换行,即\r\n;
> LF: Line-Feed的缩写,意思是换行,即\n;
> CR: Carriage-Return的缩写,回车,即\r;error: Your local changes to the following files would be overwritten by checkout
git stash // 暂存当前工作区已修改未提交的内容 git stash list // 列出所有暂存记录 git stash stop // 将暂存的文件从存储的栈中取出来,并从栈中删除暂存的记录。
当我们敲击回车键(Enter)时,操作系统会插入不可见的字符表示换行,不同的操作系统插入不同
Windows: 插入\r\n,回车换行; Linux\Unix: 插入\n,换行; MacOS: 插入\r,回车;
husky + lint - staged + prettier
git config --list // 检索git配置项列表 vim ~/.gitconfig // 修改配置文件
LF、CRLF在不同系统上的各种问题
Linux系统和windows系统下的换行符不一样Linux是"\n"既LF,windows下面确实"\r\n"既CRLF git的默认设置是push的时候会把CRLF转换成LF而pull的时候会把LF转换成CRLF
如果在部分平台git clone https://e.coding.net/eshen/server.git 出现error: invalid path的问题,部分文件名称带有中文字符串或特殊字符等,相关解决方案如下:
> git config --global core.protectNTFS false # 忽略路径中的转义字符
> git config --global core.autocrlf false # 忽略换行符转换
> git config --global core.quotepath false # 忽略中文文件名或乱码等AutoCRLF
git config -–global core.autocrlf true # 提交push时转换为LF,检出pull时转换为CRLF [windows默认]
git config -–global core.autocrlf false # 设置git在push和pull的时候不会进行转换
git config -–global core.autocrlf input # 设置git在push的时候将lf转换成crlf,pull的时候并不会把crlf转换成crlfSafeCRLF
git config --global core.safecrlf true # 拒绝提交包含混合换行符的文件
git config --global core.safecrlf false # 允许提交包含混合换行符的文件
git config --global core.safecrlf warn # 提交包含混合换行符的文件时给出警告