Web/00-前端工具/02-Git的使用.md
2021-08-31 21:36:08 +08:00

254 lines
7.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 02-Git的使用
publish: true
---
<ArticleTopAd></ArticleTopAd>
## 常见操作
### 全局配置用户信息
```
git config --global user.name "smyhvae"
git config --global user.email "smyhvae@163.com"
```
## 分支的合并
### 场景基于master分支的代码开发一个新的特性
如果你直接在master分支上开发这个新特性是不好的万一你在开发`特性1`的时候领导突然又要叫你去开发`特性2`就不好处理了难道开发的两个特性都提交到master一会儿提交特性1的commit一会儿提交特性2的commit这会导致commit记录很混乱
所以我给你的建议做法是给每个特性都单独建一个的新的分支
比如说我专门给`特性1`建一个分支`feature_item_recommend`具体做法如下
1基于master分支创建一个新的分支起名为`feature_item_recommend`
```
$ git checkout -b feature_item_recommend
Switched to a new branch 'feature_item_recommend'
```
上面这行命令相当于
```bash
$ git branch feature_item_recommend // 创建新的分支
$ git checkout feature_item_recommend //切换到新的分支
```
2在新的分支`feature_item_recommend`完成开发工作 commit push
3将分支`feature_item_recommend`上的开发进度**合并**到master分支
```bash
$ git checkout master //切换到master分支
$ git merge feature_item_recommend //将分支 feature_item_recommend 的开发进度合并到 master 分支
```
合并之后`master`分支和`feature_item_recommend`分支会指向同一个位置
3删除分支`feature_item_recommend`
> 既然 特性1 开发完了也放心地提交到master了那我们就可以将这个分支删除了
```
git branch -d feature_item_recommend
```
注意我们当前是处于`master`分支的位置来删除`feature_item_recommend`分支如果当前是处于`feature_item_recommend`分支是没办法删除它自己的
同理当我转身去开发`特性2`的时候也是采用同样的步骤
### 合并分支时如果存在分叉
![](http://img.smyhvae.com/20180610_1650.png)
比如说上面这张图中最早的时候master分支是位于`C2`节点我基于`C2`节点new出一个新的分支`iss53`我在`iss53`上提交了好几个commit
现在我准备把`iss53`上的几个commit合并到master上此时发现master分支已经前进到C4了那该怎么合并呢
合并的命令仍然是
```bash
$ git checkout master
$ git merge iss53
```
**解释**
这次合并的实现并不同于简单的并入方式这一次我的开发历史是从更早的地方开始分叉的
由于当前 master 分支所指向的commit (C4)并非想要并入分支iss53的直接祖先Git 不得不进行一些处理就此例而言Git 会用两个分支的末端C4 和C5和它们的共同祖先C2进行一次简单的三方合并计算
Git 没有简单地把分支指针右移而是对三方合并的结果作一新的快照并自动创建一个指向它的commitC6如下图所示我们把这个特殊的commit 称作合并提交mergecommit因为它的祖先不止一个
值得一提的是Git 可以自己裁决哪个共同祖先才是最佳合并基础这和CVS 或Subversion1.5 以后的版本不同它们需要开发者手工指定合并基础所以此特性让Git 的合并操作比其他系统都要简单不少
![](http://img.smyhvae.com/20180610_1710.png)
### 解决合并时发生的冲突
![](http://img.smyhvae.com/20180610_1740.png)
如果 feature1和feature2修改的是同一个文件中**代码的同一个位置**那么把feature1合并到feature2时就会产生冲突这个冲突需要人工解决步骤如下
1手动修改文件手动修改冲突的那个文件决定到底要用哪个分支的代码
2git add解决好冲突后输入`git status`会提示`Unmerged paths`这个时候输入`git add`即可表示**修改冲突成功加入暂存区**
3git commit 提交
然后我们可以继续把 feature1 分支合并到 master分支最后删除feature1feature2
**注意**两个分支的同一个文件的不同地方合并时git会自动合并不会产生冲突
比如分支feture1对index.html原来的第二行之前加入了一段代码
分支feature2对index.html在原来的最后一行的后面加入了一段代码
这个时候在对两个分支合并git不会产生冲突因为两个分支是修改同一文件的不同位置
git自动合并成功不管是git自动合并成功还是在人工解决冲突下合并成功提交之前都要对代码进行测试
## 日常操作积累
### 修改密码曲线救国
> 网上查了很久没找到答案最终在cld童鞋的提示下采取如下方式进行曲线救国
```bash
# 设置当前仓库的用户名为空
git config user.name ""
```
然后当我们再输入`git pull`等命令行时就会被要求重新输入*新的*账号密码此时密码就可以修改成功了最后我们还要输入如下命令还原当前仓库的用户名
```
git config user.name "smyhvae"
```
### 修改已经push的某次commit的作者信息
已经push的记录如果要修改作者信息的话只能 通过--force命令我反正是查了很久但最终还是不敢用公司的仓库尝试
参考链接
- [git 修改已提交的某一次的邮箱和用户信息](https://segmentfault.com/q/1010000006999861)
看最后一条答案
- [修改 git repo 历史提交的 author](http://baurine.github.io/2015/08/22/git_update_author.html)
### `branch1`的某个`commit1`合并到`branch2`当中
切换到branch2中然后执行如下命令
```
git cherry-pick commit1
```
### 20190118-修改GitHub已提交的用户名和邮箱
参考链接亲测有效
- [修改Git全部Commit提交记录的用户名Name和邮箱Email](https://cloud.tencent.com/developer/article/1352623)
- [Mac 运行sh文件也就是传说中的shell脚本](https://blog.csdn.net/yusufolu9/article/details/53706269)
在执行`./email.sh`如果出现`permission denied`的错误可以先执行`chmod 777 email.sh`修改文件的权限
### 20200520-将Git 项目迁移到另一个仓库
我们假设旧仓库的项目名称叫`old-repository`新仓库的项目名称叫`new-repository`操作如下
1创建旧仓库的裸克隆
```bash
git clone --bare https://github.com/exampleuser/old-repository.git
```
执行上述命令后会在本地生成一个名叫 `old-repository.git`的文件夹
2迁移到新仓库
```bash
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
```
这样的话项目就已经迁移到新仓库了
注意我们**不需要**手动新建一个空的新仓库当我们执行上述命令之后新仓库就已经自动创建好了
参考链接
- [复制仓库](https://help.github.com/cn/github/creating-cloning-and-archiving-repositories/duplicating-a-repository)
- [Git 本地仓库和裸仓库](https://moelove.info/2016/12/04/Git-%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93%E5%92%8C%E8%A3%B8%E4%BB%93%E5%BA%93/)
## git客户端推荐
市面上的Git客户端我基本都用过了我最推荐的一款Git客户端是[Tower](https://www.git-tower.com) 或者 [Fork](https://git-fork.com)。
- GitUp<https://gitup.co/>
20180623网上看了下Git客户端的推荐排名
![](http://img.smyhvae.com/20180623_1210.png)
**SmartGit**
商业用途收费 个人用户免费
![](http://img.smyhvae.com/20180623_1305.png)
## 推荐书籍
- pro.git中文版
## 推荐连接
### 2018-06
- [聊下git pull --rebase](https://www.cnblogs.com/wangiqngpei557/p/6056624.html)