# **GIT**
## 下载安装Git客户端
## 安装教程
```
git config --global user.name "Your Name"
git config --global user.email "Your Email"
```
## 创建本地仓库
```
git init
```
## add
### 把文件添加到仓库:
##### 添加指定文件
```
git add readme.txt
```
##### 添加多个指定文件
```
git add readme.txt readme1.txt ...
```
##### 添加全都指定文件
```
git add .
```
## commit:
```
git commit -m "add readme"
```
#### 输入多行提交原因
```
git commit -m '第一行提交原因' -m '第二行提交原因'
```
#### 将工作区 修改 或 删除 的文件提交到本地版本库, 新增 的文件不会被提交
```
git commit -am '提交原因'
```
#### 修改最新一条提交记录的提交原因
```
git commit --amend -m '提交原因'
```
#### 将当前文件改动提交到 HEAD 或当前分支的历史ID
```
git commit -C HEAD
```
## log
#### 显示带提交差异对比的历史记录
```
git log -p
```
#### 显示 demo.html 文件的历史记录
```
git log demo.html
```
#### 显示2周前开始到现在的历史记录,其它时间可以类推
```
git log --since="2 weeks ago"
```
#### 显示截止到2周前的历史记录,其它时间可以类推
```
git log --before="2 weeks ago"
```
#### 显示最近10条历史记录
```
git log -10
```
#### 显示从提交ID f5f630a 到 HEAD 之间的记录,HEAD 可以为空或其它提交ID
```
git log f5f630a..HEAD
```
#### 在一行中输出简短的历史记录
```
git log --pretty=oneline
```
#### 格式化输出历史记录
```
git log --pretty=format:"%h"
```
#### Git 用各种 placeholder 来决定各种显示内容
标识 | 使用
---|---
%H | commit hash
%h | 缩短的commit hash
%T | tree hash
%t | 缩短的 tree hash
%P | parent hashes
%p | 缩短的 parent hashes
%an | 作者名字
%aN | mailmap的作者名
%ae | 作者邮箱
%ad | 日期 (--date= 制定的格式)
%ar | 日期, 相对格式(1 day ago)
%cn | 提交者名字
%ce | 提交者 email
%cd | 提交日期 (--date= 制定的格式)
%cr | 提交日期, 相对格式(1 day ago)
%d | ref名称
%s | commit信息标题
%b | commit信息内容
%n | 换行
### 关联远程仓库
```
git remote add origin [git@github.com:XXXXXXXX.git]
```
### 第一次推送时,我们要添加`-u` 之后我们可以这条命令
```
git push origin master
```
### 从github上下载到本地
```
git clone git@github.com:youngxhui/nuc_JavaLab.git
```
### 创建分支
```
git checkout -b dev
```
`-b` 参数表示创建并切换
### 用git branch命令查看当前分支
```
git branch
```
### 切换分支
```
git checkout master
```
### 合并分支 将dev合并到master(先切换到master)
```
git merge dev
```
### git 合并A分支的部分提交到B分支
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况:一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用**git cherry-pick**。
> 1. `git checkout` 到另一个分支(A分支),然后使用`git log`找到想要复制的`commit`的id,记录下来
> 2. 切换到自己分支(B分支),使用`git cherry-pick` [上面记录的`commit id`] 回车即可! 如果想要复制多个, 使用`git cherry-pick (commitid1..commitid100)`,commitid1为想复制的最老提交(不包括),commitid100为想复制的最新提交(包括) 如果想要包括commitid1,那么在commitid1后加^即可,即` git cherry-pick [commitid1^..commitid100]!`
> 3. git push到远端B分支,OK
### 删除本地分支
```
git branch -D [dev]
```
### 删除远程分支
```
git push origin --delete [dev]
```
# github
### 生成gitlab密钥并配置
> 电脑开始菜单中找到已安装的gitbash并打开,输入命令
```
ssh-keygen -t rsa -C "公司邮箱地址"
```
> 按回车,再按3次enter键,生成对应的gitlab密钥:id_rsa和id_rsa.pub
> ssh 存储位置(id_rsa.pub)
```
C:/Users/用户名/.ssh/
```
> 生成gitlab密钥并配置
```
ssh-keygen -t rsa -C "github邮箱地址" -f ~/.ssh/github_rsa
```
> 生成对应的github密钥:github_rsa和github_rsa.pub
> 将github公钥即github_rsa.pub中的内容配置到自己的github上
> 打开github,登录账户,点击头像,点击settings,点击SSH and GPG keys,点击new SSH key,添加title,考本本地生成的***_rsa.pub(本地记事本打开),粘贴到Key中,点击Add SSH key
> 验证是否设置成功
```
# 测试github
ssh -T git@github.com
# 测试gitlab(@符后面的为公司gitlab地址)
ssh -T git@gitlab.xxx.com
```
### 用户级别配置
* 在git中,我们使用git config
* 命令用来配置git的配置文件,git配置级别主要有以下3类:
1. 仓库级别 local 【优先级最高】
2. 用户级别 global【优先级次之】
3. 系统级别 system【优先级最低】
> 用户级别是配置公司gitlba账号还是自己github账号,可以自由选择。因为平常使用公司的代码频率较高,所以我选择将gitlab账号配置成用户级别。gitBath下执行如下命令:
```
git config --global user.name 'lfr' #公司账号名称
git config --global user.email 'lfr@company.com' #公司账号邮箱
```
> 查看全局配置
```
git config -l
```
> 仓库级别配置
> local(仓库级别)配置成github的账号。选择一个文件夹作为github的本地仓库,在该文件夹里鼠标右键打开Git Bash Here,执行命令:git init
> 再执行命令:
```
git config --local user.name 'username' #github账号名称
git config --local user.email 'username@gmail.com' #github账号邮箱
```
> 查看本地配置
```
git config --local -l
```
## 问题及解决办法
### Connection was reset, errno 10054
解决办法:
```
git config --global http.sslVerify "false"
```
### Permission to xxxx/xxxx.git denied to xxxxxxx1.
解决办法:
* 打开控制面板
* 点击用户账户
* 点击凭据管理器
* 找到 例如git:https://github.com
* 点击编辑,保证账户正确
### git每次提交都需要输入账户密码
解决办法:
执行以下代码
```
git config --global credential.helper store
```
<font color="#969696">注:如果是项目内部,不想影响全局可以将`--global`改为`--local`</font>
## 常用命令
### 在当前分支下,第一次`push`
```
git push --set-upstream origin [branch]
```
### 不在当前分支下
```
git push origin [branch]:[branch]
```
### 列出所有远程分支
```
git branch -r
```
### 列出所有本地分支和远程分支
```
git branch -a
```