GIT 使用

# GIT和GITHUB

## 版本控制

Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 最近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。
## 什么是git
GIT
Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。

GitHub等
GitHub、GitCafe、BitBucket和GitLab等是基于Git版本控制的远程文件托管平台。

使用场景:
- 无远程:在本地 .git 文件夹内维护历时文件
- 有远程:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库

PS:
集中式:远程服务器保存所有版本,用户客户端有某个版本
分布式:远程服务器保存所有版本,用户客户端有所有版本


# git基本使用

![](http://images2017.cnblogs.com/blog/425762/201708/425762-20170807083504955-80084580.png)

**基本使用**
```
git init // 初始化文件

git status // 查看状态

git config --global user.name "<NAME>" // 配置用户

git config --global user.email "<EMAiL>" // 配置邮

git add 文件名

git commit -m "提交信息"

git ls-tree head //查看版本中所有文件

git ls-files -s //查看暂存区和版本中所有文件
```

**stash**

```
git stash // 将当前做过的修改,临时保存

git stash pop // 临时修改放回工作区(有可能出现冲突)
```

**branch分支**
通常情况下,主分支master用于上线,dev分支用于开发。

```
git branch dev // 创建分支branch

git branch // 查看当前分支

git checkout dev // 切换分支

git merge bug // 合并bug分支到当前分支

git branch -d bug // 删除分支bug

```

# 远程仓库

常见的公共远程仓库有[GitHub](https://github.com/)和[码云](https://git.oschina.net/)

公司搭建的常见的有gitlab。

**远程仓库使用流程**

```
1.创建代码仓库

2.添加代码仓库
git remote add origin https://github.com/zouruncheng/s4blogs.com

3.上传代码
git push origin master

3.从远程下载代码
git clone <github仓库地址>

4. 写代码

5.上传代码
git push origin master

```

**错误:**refusing to merge unrelated histories

```Shell
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef
```

**解决**

`git pull --allow-unrelated-histories origin master`

# 协同开发

**协同开发的工作模式**

1. 首先,可以试图用`git push origin branch-name`推送自己的修改;
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用`git pull`试图合并;
3. 如果合并有冲突,则解决冲突,并在本地提交;
4. 没有冲突或者解决掉冲突后,再用`git push origin branch-name`推送就能成功!

当你从远程仓库克隆时,实际上Git自动把本地的`master`分支和远程的`master`分支对应起来了,并且,远程仓库的默认名称是`origin`。

要查看远程库的信息,用`git remote`:

```
$ git remote

origin

```

**推送分支**

```
git push origin master // 推送主分支

git push origin dev //推送dev分支
```

* `master`分支是主分支,因此要时刻与远程同步;
* `dev`分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
* bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
* feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

**常见错误**

```
error: failed to push some refs to 'git@github.com:triaquae/gitskills.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again. #提示你了,先把远程最新的拉下来再提交你的
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

多人协作时,当2个开发者同时向远程push代码时,后push的一方会出现错误,解决办法也很简单,Git已经提示我们,先用`git pull`把最新的提交从`origin/dev`抓下来,然后,在本地合并,解决冲突,再推。

# 忽略特殊文件

在Git工作区的根目录下创建一个特殊的`.gitignore`文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写`.gitignore`文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:[https://github.com/github/gitignore](https://github.com/github/gitignore)

忽略文件的原则是:

1. 忽略操作系统自动生成的文件,比如缩略图等;
2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的`.class`文件;
3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

原文地址:https://www.cnblogs.com/zouruncheng/p/6534957.html