### 引言
作为一个初入职场的程序员👨🏻💻,想必大家都会面临的一个问题就是如何提交代码,Git操作说难也难,说易也易,面向百度也能搜出各式各样的教程,而笔者依然选择写一篇,当然是因为笔者发现在工作中用到的和网上现有的教程存在一些差异。
(Ps:可能有些小白也和当初的我一样并不知道PR是什么~,这里解答一下,就是`Pull Request`)
### 准备工作
- 首先你的电脑需要能够可以输入git命令(即:安装Git)[Git安装地址](http://git-scm.com/downloads)
- 检查是否电脑是否安装Git: 在`终端`输入 `git version`
- 理解Git 的工作区、暂存区、仓库区、远程仓库
- 工作区:即本地代码所存放的地方(电脑磁盘中)
- 暂存区:临时存放改动的文件的区域
- 仓库区:存放了所有版本的数据
- 远程仓库:即github、gitlab、gitee等代码托管平台
### fork
曾经使用gitlab作为远程仓库时,只需要直接clone即可,现在需要使用了github向开源项目提交pr之后,发现第一步是`fork`
- 在github中找到想参与的开源项目,例如KubeSphere
- 点击右上角` Fork`按钮!!
- 点开自己的github账号,发现自己的仓库中多了一个KubeSphere
- 进入当该项目中,点击`Clone or download`,然后复制https链接
### clone
打开`终端`进入一个你想存放代码的目录然后执行如下操作👇🏻
```
git clone https://github.com/***/***.git
// 后面的链接就是上一步骤中赋值的链接🔗
// 此时在master主分支
```
- 与上游分支建立连接
- 此时使用`git remote -v`可发现只与自己仓库建立连接,还需要与上游建立连接,这样才能将自己仓库中的项目的更改提交到开源项目中(只有origin 开头的两行代码)
```c
git remote add upstream [url]
// 这里的url为 开源项目的https url,例如https://github.com/kubesphere/kubesphere.git,
```
创建连接后可再次输入`git remote -v`发现多了upstream 开头的两行
### 创建分支
关于创建分支一定要注意,因为如果创建的位置不对,当你提交PR的时候,会发现PR中的改动文件比你需要的多,而多出来的那些是你曾经已经提过PR的文件
##### 分支创建要注意是以什么分支为基础创建(即输入 `git branch`显示分支为什么)
- 为什么要强调这一点呢,因为笔者就经常因为粗心导致创建的分支超前于主分支,因此提PR时多出了很多我不需要的文件
- 重点在于,这些差异往往只有在提PR之后检查文件变化才会发现,因为对于你当前分支的改动来说,那些多余的改动都是已经commit并且push了的部分,而这些部分对于上游仓库而言,又属于变动部分
说了那么多,似乎还没有讲解如何创建分支~
```c
// 创建分支的两种方式 以创建的分支名为 dev 为例
// 1. 直接创建分支并变基分支到该分支
git checkout -b dev(分支名)
// 2. 先创建分支再变基分支
git branch dev(分支名) --> 创建分支
git checkout dev(分支名) --> 变基分支
```
输入`git branch`可以查看所有分支,已经当前所在分支
**注意📢:**
每次提交完PR,需要修改新的代码时,要注意之前提的PR是否已经`merge`,如果没有merge,而你依然在该分支修改代码,那么你的PR会自动合并新的push。
- 这个时候则需要,基于master分支重新创建一个新的分支再进行后续的操作
### 修改代码
这一步骤,对于懂得人来说是最简单的,对于不懂的人来说是最难的,就不在该文章中做过多的赘述了~
**注意📢:** 在每次更改代码之前,记得先`git pull` 拉取代码,以免代码库已经产生变动,
### 暂存并提交代码
- 查看代码的状态
- ```c
git status // 查看代码状态
```
- 将代码添加到暂存区
```c
git add 文件路径/文件名 // 将指定文件添加到暂存区
```
- 文件路径和文件名可以通过git status 展示的提示编写
- `git add .`或 `git add * `可以将所有修改过的文件添加到暂存区
- 把修改的代码提交到<span style="color: red">当前分支</span>
```c
git commit -m"本次提交代码的说明"
```
- 这里需要注意自己参与的开源项目是否需要签名,如果需要的话,这一步骤应该为`git commit -s -m"本次提交代码的说明"`
`如果需要签名但commit使没有加上 -s,会导致提交PR之后check不通过`
- 变基
- ```c
git rebase master
// 在push 代码之前,要执行此命令,本质为给某个commit换一个父commit
```
- 推送该分支代码到远程仓库
- ```c
git push origin dev(分支名)
```
### 提交PR
说了那么多的步骤,终于到提交PR了
- 点开自己的代码仓库中的KubeSphere项目或者,该开源项目的远程仓库
- 点击Code,页面上方会显示多久前push了代码,点击进去,按照提示写好说明提交即可
**-注意📢:** 选择的分支要是自己刚刚更改的分支
### 回退版本
提交一次PR的操作还是很多的,指不定在哪一步就因为粗心大意写错了,但是没有发现,已经提交了PR,这个时候有两种解决方案:
- 方案一: 适用于代码写错,直接修改代码,重新执行提交代码的全过程即可
- 方案二:适用于类似遗漏掉 `commit` 中的`-s`的错误:
```c
git log --oneline --graph // 查看所有提交记录
找到刚刚所提交的代码的 前一份代码 的commit_id
// 这里注意需要输入 q 才能退出git log 状态
git reset --soft commit_id // 回退到 commit_id的版本
// 代码状态变回了,commit之前的状态
```
既然说到了`reset`那么就说一下 `—soft`和`--hard`的区别
`git reset —soft commit_id`:代码回退到某个版本,并不改变本地工作区的代码,变成(add之后,commit之前的状态)
`git reset —hard commit_id`:代码回退都某版本,本地工作区的代码也回退到该版本,会清空工作目录和暂存区的改动<span style="color:red">(有丢失代码的风险,谨慎操作)</span>
#### 善用开发工具VS code
不会还有人不知道VS code本身就可以执行git的操作吧~ 就在最左边的竖着的第三按钮~
### 其他常用命令
```
git config --global user.email "邮箱"// 配置用户邮箱
git config --global user.name "用户名"// 配置用户名
git reset HEAD 文件名 // 将暂存区的文件移除
git reset HEAD^ // 去掉上一次的提交,变成add之前的状态
git init 项目名//在当前目录新建一个Git代码库
```
### 结语
Git命令其实有很多,但是笔者在这篇文章里就只以向开源项目提PR为目的讲解了常用的Git操作,其他Git命令待笔者用到更多在进行扩展补充,如果有说的不太正确的地方,也请指出并轻喷,本人会虚心改正~