# git 使用记录
## 目录
> 一、 [git 安装](#一.git安装)<br>
> 二、 [标签](#二.标签)<br>
> 三、 [分支](#三.分支)<br>
> 四、 [储蓄](#四.储蓄)<br>
> 五、 [回退](#五.回退)<br>
> 六、 [检测版本](#六.检测版本)<br>
> 七、 [比较](#七.比较)<br>
> 八、 [打patch](#八.打patch)<br>
> 九、 [子模块](#九.子模块)<br>
> 十、 [兼容功能的patch](#十.兼容功能的patch)<br>
> 十一、 [打patch的技巧](#十一.打patch的技巧)<br>
> 十二、 [查看谁修改的](#十二.查看谁修改的)<br>
> 十三、 [git merge和git rebase区别](#十三、gitmerge和gitrebase区别)<br>
> 十四、 [git hot-fix](#十四.githot-fix)<br>
> 十五、 [解决冲突](#十五.解决冲突)<br>
> 十六、 [IDE中git使用](#IDE中git使用)<br>
> 十七、[在使用git时遇到的问题](#以下是在用git时遇到的问题)<br>
## 一.git安装
### 1. git下载
<https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git>
### 2. 创建工程
- 在gitlab或者github上创建一个工程
- 工程创建好后,会有快速设置步骤,如下所示:
<https://github.com/zcgithubgood/test>
### 3. 创建ssh key
ssh-keygen -t rsa -C "youremail@yourcompany.com"
### 4. 把.ssh/id_rsa.pub中内容拷贝到服务器上
### 5. 克隆一个本地库
git clone git@192.168.0.75:cell/switch2.git
### 6. 推送code
#### (1) git status
查看有变化的文件(一般有变化的文件会以红色显示出来)
#### (2) git add + 想要提交的文件名
#### (3) git commit -m "注释的一些信息"
如果在这一步出错的话:git reset --hard HEAD 回滚到add之前的状态
#### (4) git push
完成这一步,你的文件就已近提交到了分支上,别人通过git pull 命令就可以把你提交的
参考:
<http://www.bootcss.com/p/git-guide/>
## 二.标签
### 1. 列出git中现有标签
- git tag
### 2. 有签名的标签
- git tag -a v2.0.0 -m "v2.0.0 test OK"
### 3. 删除标签
- git tag -d v2.0.0
### 4. 删除远端tag
- git push origin :refs/tags/v2.0.0
### 5. 查看提交历史信息
- git log --pretty=oneline
### 6. 同步
- git push -u origin master v2.0.0 --tags
### 7. 删除
- git rm -r -n --cached file
- r:递归移除目录
- n:加上这个参数,查看服务器有没有对应的文件
## 三.分支
### 1. 查看分支
- git branch
### 2. 创建分支
- git branch name
### 3.切换分支
- git checkout name
### 4. 创建+切换分支
- git checkout -b name
### 5. 合并某分支到当前分支
- git merge name
### 6. 删除本地分支
- git branch -d na
### 7. 查看所有分支
- git branch -a
### 8. 同步分支
- git pull origin 分支名称
### 9. 测试步骤:
1. git branch smartboxzc
2. git checkout smartboxzc
3. git branch
4. git status
5. git add README.md
6. git add *
7. git commit -m 'init smartboxzc'
8. git push origin smartboxzc
### 10. 撤销对工作区修改
- git checkout -- 文件名称
## 四.储蓄
### 把当前工作现场“储藏”起来
- git stash
## 五.回退
### 1. git reset --hard HEAD~3
- 会将最新的3次提交全部重置,就像没有提交过一样
或者
- git reset —-hard 版本号
根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:
### 2. git reset –mixed
- 此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
### 3. git reset –soft
- 回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
### 4. git reset –hard
- 彻底回退到某个版本,本地的源码也会变为上一个版本的内容
## 六.检测版本
### git log --pretty=oneline
## 七.比较
### 查看简单的diff结果
- git diff --stat
## 八.打patch
### 1. 写commit
- git commit
在打开的文件中添加
```
Add module for testing compatibility of AWS S3
This adds a new module to encapsulate AWS S3 related operations, the later patches
will use it to add various tests against AWS S3 apis.
```
#### commit中填写的内容描述:
- 第一行是 title
- 第二行是空行
- 从第三行开始写message
### 2. 打patch
- git format-patch HEAD^
从最近的一个log开始打一个patch
- git format-patch HEAD^^
从最近的两个版本开始打两个patch
- git format-patch HEAD~4 --subject-prefix "qs-test"
从最近的四个log开始打四个patch,工程名称如下,打开生成的patch,工程名字显示如下所示:
```
Subject: [qs-test v1 1/4] Modify a function's parameter of "key.send_file"
```
- 加个cover letter
git format-patch HEAD~5 --subject-prefix "qs-test" --cover-letter -o test_s3_patches
cover-letter:会生成一个test_s3_patches文件夹,并生成一个0000-cover-letter.patch。
### 3. 修改patch中的subject-prefix
这一步不修改也可以
```
Subject: [qs-xxx]Add tests for compatibility of AWS S3
Add tests for compatibility of AWS S3
```
### 4. 发送邮件
- git send-email 0001-qs-test-AWS-S3-API.patch --to youremail@yourcompany.com --thread
把0001-qs-test-AWS-S3-API.patch发送到youremail@yourcompany.com
- git send-email -1 --to youremail@yourcompany.com --thread
把最近的1个patch发到youremail@yourcompany.com
- git send-email -6 --to youremail@yourcompany.com --thread
把最近的6个patch发到youremail@yourcompany.com
### 5. 应用patch
- git am 0001-Fix1.patch
## 九.子模块
### 在项目里的rack子目录下获得一个 Rack 项目
git submodule add git://github.com/chneukirchen/rack.git rack
### 本地创建一个子模块
- 1. vim .gitmodule
```
[submodule "my-submodule"]
path = my-submodule
url = git@xxxxxxxx/my-submodule.git
```
- 2. git submodule init
- 3. git submodule update staging
### 下载的工程带有submodule
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
git submodule update --init --recursive
## 十.兼容功能的patch
应用到你本地工程的方法:
- 1) git stash 你本地的所有改动(如果没有,可跳过这步)
- 2) git reset HEAD~1 --hard
- 3) git pull 到最新的代码
- 4) git am
- 5) git stash pop(如果没有进行第1步,可跳过此步)
## 十一.打 patch 的技巧
如果一个文件的改动要打成好几个 patch 怎么办:
- 1) 先把这个文件的所有变动 diff 出来
- 2) 人工把这个 diff 文件拆成几个 patch(不是 git patch,不需要有那些 commit log 信息)
- 3) 把文件 reset 到原始状态
- 4) 用 patch file < 001.patch 命令,一个个打到文件上,打一个 commit 一条
## 十二.查看谁修改的
- git blame src/handlers/objects.py
## 十三.gitmerge和gitrebase区别
- git merge是用来合并两个分支的。
- git merge b # 将b分支合并到当前分支
- git rebase b # 也是把 b分支合并到当前分支
## 十四.git hot-fix
<http://nvie.com/posts/a-successful-git-branching-model/>
只能merge --no--ff 需要发布的版本,这样比较容易看出多条线来。
## 十五.解决冲突
- 1. git merge
问题如下:
```
$ git merge dev-druid
自动合并 src/handlers/buckets.py
自动合并 src/error.py
冲突(内容):合并冲突于 src/error.py
自动合并 src/constants.py
自动合并失败,修正冲突然后提交修正的结果。
```
- 2. 如果发生(1),git status
```
双方修改: src/error.py
```
- 3. 用git log --graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit
参考:
<http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000>
## IDE中git使用
### idea编写java或者pycharm编写python是常用的命令所用的按键如下所示
- VCS --> Commit Changes
- VCS --> Git --> Merge Changes
- VCS --> Git --> Reset HEAD
- VCS --> Git --> Pull
- VCS --> Git --> Push
## 以下是在用git时遇到的问题:
### 1. error: src refspec master does not match any.
#### 方法如下:
```
引起该错误的原因是,目录中没有文件,空目录是不能提交上去的
```
### 2. 如下内容
```
fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
```
#### 方法如下:
```
缺少 git remote add origin git@192.168.0.75:druid/switch2_network.git
```
### 3. error: src refspec master does not match any. error: failed to push some refs to
#### 方法如下:
```
$ git add .
$ git commit -m "first commit"
$ git push -u origin master
```
### 4. git/rebase-apply still exists but mbox given
#### 方法如下:
```
在使用git-am之前, 你要首先git am –abort 一次,来放弃掉以前的am信息,这样才可以进行一次全新的am。
```
### 5. 补丁失败
```
补丁失败于 0001 Compatible with AWS S3 API
失败的补丁文件副本位于:
/home/druid/project/.git/rebase-apply/patch
```
#### 方法如下:
- 当您解决了此问题后,执行 "git am --continue"。
- 如果您想跳过此补丁,则执行 "git am --skip"。
- 要恢复原分支并停止打补丁,执行 "git am --abort"。
```
$ git apply PATCH --reject
$ edit edit edit
(译注:根据.rej文件手动解决所有冲突)
$ git add FIXED_FILES
$ git am --resolved
eg:
git apply 0001-Compatible-with-AWS-S3-API.v20160520.patch --reject
```