# service-projects **Repository Path**: teamworkr/service-related ## Basic Information - **Project Name**: service-projects - **Description**: 服务端相关的知识汇总 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-22 - **Last Updated**: 2024-07-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: 服务端, Nodejs, Nginx, Linux, MySQL ## README | 工作区(Working Directory) | 暂存区(Stage/Index) | 版本库(commit History) | | :-----------------------: | :---------------------------: | :------------------------: | | 写代码的地方 | 暂时存放 git add 后数据的区域 | 存放 git commit 提交的数据 | `vim`: 后面提到的进入vim模式的命令都会用vim代替; > vim编辑模式都是如此:按 i 进入编辑模式 — 修改信息 — ESC(退出编辑模式) — :(输入) — wq(保存并退出); 或者 q(不保存强制退出) ##### 初始化仓库 1. git init (**初始化git仓库**) 2. git config `--global` user.name "Jelly" 3. git config `--global` user.email "958306134@qq.com" 4. 系统不懂回车符报错的解决: __1. 提交时转换为LF,检出时不转换__ git config `--global` core.autocrlf input __2. 提交包含混合换行符的文件, 只警告,不报错__ git config `--global` core.safecrlf warn __3. 针对报错: refusing to merge unrelated histories__ git pull origin master --allow-unrelated-history 5. git clone xxxx // 克隆项目 > git config --global --unset user.name // 取消配置的name > > git config --global --unset user.email // 取消配置的email > > --global: 表示全局下配置,省事,设置后所有的项目都不需要配置; > > --local: 当前git仓库下生效,适合本地多个仓库且配置不同时; ##### 提交代码基本步骤 1. git status (-s) // 查看当前分支状态, -s 精简打印的信息 2. git add file1 file2 // . -> 全部提交, file1 -> 具体提交某个文件 3. git commit -m “信息” // 把更改提交到暂存区 4. git pull // 更新本地代码 5. git push // 推送到远程仓库 6. git log (--oneline) // 查看提交记录,--oneline 精简查看提交记录 > git commit -a // vim模式 > > <=> git commit -am “提交信息“ > > 特点:省略修改代码的 git add 步骤,直接 commit ; > > 注意:新增的文件不会被commit,仍需要add; ##### 撤销某个文件的修改 ``` 方法1:git restore file1 file2 ... 方法2:git checkout -- file // 丢弃当前file文件所有的修改 ``` ##### 撤销add —— git add 是添加对文件的追踪 ``` 方法1:git restore --staged file1 file2 ... 方法2:git reset HEAD^ file1 file2 ... <=> git reset --mixed HEAD^ file1 file2 ... 注意:git reset 默认是 --mixed,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变(也就是保留内容的修改)。 ``` ##### 撤销commit -- git commit 是将修改添加到暂存区(staged) ``` 方法1:git reset --soft HEAD^ 方法2:git reset --hard HEAD~1 注意:HEAD <=> HEAD~0, HEAD^ <=> HEAD~1, HEAD^^ <=> HEAD~2, ...; HEAD: 当前版本,HEAD^:上一个版本 注意:这里reset是回退版本的方式撤销commit记录,把当前分支切换到指定版本; ``` ##### 修改提交记录 —— amend 会进入编辑模式 ``` git commit -m “提交信息” // 本地已经commit 方法1:git commit --amend // vim模式,修改提交信息 方法2:如果忘记了某些文件的修改,则需要 git add file1 file2 ... git commit --amend // vim模式,修改提交信息 优点: 只会有一个提交记录,第二次提交将替换第一次提交的结果; ``` ##### 合并提交记录 —— rebase -i ``` 1. git rebase -i HEAD~3 || git rebase -i HEAD^^^ || git rebase -i fe8ec4d 2. 进入vim模式 pick 新增文件file - message1 // 以此类推,这是倒数第二次提交信息 pick 修改文件file - message2 // 这是倒数第二次提交信息 pick 修改文件file2 - message3 // 这是最新的一次提交信息 3. 修改需要合并的分支:pick 修改为 s || f; s:squash合并提交信息到上一次的提交信息,比如 message2 的 pick 改为 s,message2将被合并到message1里面; f:舍弃该次提交信息,比如 message2 的 pick 改为 f,message2 将被删除; 4. 接下来进入确认信息的vim模式,此时可以修改上面整合后的提交信息,然后 :wq(保存退出)或者直接 :q(退出); 5. git push -f // 强制推送,不加 -f 会报错,说本地分支落后什么的,不用管; ``` ##### 删除文件 —— git rm 是删除工作区文件,并且将这次删除放入暂存区 ``` 注意:要删除的文件是没有修改过的,就是说和当前版本库文件的内容相同; *如果要删除的文件已经修改过,就是说和当前版本库文件的内容不同: 1. 文件修改过还没 git add 到暂存区; 2. 文件修改过已经 git add 到暂存区; git rm file 命令删除都会报错,那么就要使用 git rm -f file; rm --cache 删除暂存区文件,但保留工作区的文件,并且将这次删除放入暂存区; 场景: rm:当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用; rm --cache:当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用; ``` ##### 变基rebase —— 当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面 ``` 变基:可抽象为如下实际工作场景:张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。 ———————————————— 使用:git rebase master // 当前分支feature,意思是合并master到feature 步骤: 无冲突,直接 git rebase --continue // vim模式 有冲突, 1. 解决冲突文件; 2. git add 冲突文件 或者 git rm 冲突文件 3. git rebase --continue // vim模式 注意:在git rebase --continue之前任何时候都可以中止rebase,使用git rebase --abort。 一般来说,master或者main主分支不提倡使用rebase,会扰乱提交日志; 本地分支更适合用rebase,协同开发时查看提交记录更清晰。 ———————————————— 场景: 1. 拉公共分支最新代码的时候使用rebase,也就是git pull -r或git pull --rebase。这样的好处很明显,我用rebase拉代码下来,但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛。 2. 往公共分支上合代码的时候,使用merge。如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了。举个例子解释下,比如张三和李四从共同的节点拉出来开发,张三先开发完提交了两次然后merge上去了,李四后来开发完如果rebase上去(注意李四需要切换到自己本地的主分支,假设先pull了张三的最新改动下来,然后执行,然后再git push到远端),则李四的新提交变成了张三的新提交的新基底,本来李四的提交是最新的,结果最新的提交显示反而是张三的,就乱套了。 ``` [![rebase图解](https://img-blog.csdnimg.cn/36efc2704d174acab598c4b9addd3694.png "rebase图解")详细请查阅该地址](''https://blog.csdn.net/weixin_42310154/article/details/119004977') ##### 分支branch的使用 * git branch // 查看当前分支 * git branch test // 创建分支 test * git checkout test // 切换到test分支 * git branch -d test // 删除本地分支 * git push origin -d // test 删除远程分支 * git checkout -b test // 在本地创建test分支,同时切到test * git branch -a // 查看所有的分支 * git branch -vv // 查看所有分支的关联情况 * git push --set-upstream origin test // 新建的分支, 推送需要关联远程仓库对应分支(不存在会自动创建) * git checkout -b 20191031 origin 20191031 // 拉取远程分支 --- ##### 标签tag的使用 1. git tag v2.0.0 2. git tag -a v2.0.0 -m "附加信息" 9fbc3d0 // 给指定的commit打tag 3. git show v2.0.0 // 查看tag详细 4. git tag -d v2.0.0 //删除本地tag 5. git push origin v2.0.0 // 将tag提交到远程仓库 6. git push origin --tags // 一次性推送全部尚未推送到远程的本地标签 7. git push origin --delete tag v2.0.0 // 删除远程仓库的tag 8. git push origin :refs/tags/v2.0.0 // 删除远程仓库的tag --- ##### 其他命令 1. gitk // 快速打开GitUI面板 2. git fetch // 更新项目 3. git branch --set-upstream-to=origin/master master // 关联远程仓库 4. git stash (**保存当前分支的修改, 场景: 1.当前分支有修改,同时需切换分支去开发; 2.当前分支合并分支前使用,避免合并的时候冲突(但合并过来后,恢复缓存的修改后可能会有冲突);**) 5. git stash pop (**恢复缓存的修改并且移除缓存记录, 等价于git stash apply stash@{0} + git stash drop stash@{0}**) `注意: git stash apply 默认应用最近一次的stash内容` --- ##### 本地如何同时使用SSH关联 github 和 gitlab ```nginx # 生成SSH,默认路径 C:\Users\用户名\.ssh # 生成 github 的 SSH ssh-keygen -t rsa -C “111@qq.com” # 生成 gitlab 的 SSH,-f ~/.ssh/id_gitlab_rsa 自定义路径和ssh文件名 ssh-keygen -t rsa -f ~/.ssh/id_gitlab_rsa -C “222@qq.com” # 生成 其他 的SSH ssh-keygen -t ed25519 -C "sunzj@xxx.com" -f ~/.ssh/id_ed25519_xxx # 创建config文件 touch ~/.ssh/config # 配置 config 文件 #### gitlab Host *gitlab.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_gitlab_rsa User Jelly #### github Host *github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa User Jelly #### gitee Host *gitee.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_ed25519.gitee User Jelly #### 公司的gitlab Host gitlab.xxx.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_ed25519_xxx User sunzj # 验证是否配置成功 ssh -T git@github.com ssh -T git@gitlab.com ssh -T git@gitlab.datacanvas.com ``` ##### Git配置 commit 模板 1. 新建文件,如: commit_template; 内容如下: > 任务ID: > 任务描述: > ...等等 > **命令如下:** > git config (--global) commit.template commit_template #### git常见报错 * Failed to connect to github.com port 443 after 21098 ms: Timed out:连接超时 解决:git config --global http.sslVerify "false" *