# **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
```