# Git服务器搭建与使用

## 系统

* Ubuntu/Centos

## Git服务器搭建

1. 安装Git（指服务器端）

   ```
   # ubuntu
   sudo apt-get install git
   # centos
   yum install -y git
   ```
2. 创建一个git用户组和用户，用来运行git服务（指服务器端）

   ```
   # 创建用户组，名称为git
   groupadd git
   # 在git用户组下创建git用户
   useradd git -g git
   ```

   tips:

   ```
   # 查看所有用户组
   cat /etc/group
   # 查看用户
   cat /etc/passwd
   ```
3. 创建证书登陆（添加密钥，省去反复输入密码，可省略）（指服务器端）

   ```
   # 以下目录或文件不存在的话自行新建即可
   # mkdir /home/git
   # mkdir /home/git/.ssh
   # touch /home/git/.ssh/authorized_keys
   cd /home/git/.ssh
   chmod 755 .ssh
   chmod 644 ./authorized_keys
   ```

   将所有需要登录的用户的公钥复制到authorized\_keys中，多个的话回车换行即可。

   ```
   # （以下指客户端）
   # 查看ubuntu下本地密钥（若无密钥，则生成密钥）
   cat ~/.ssh/id_rsa.pub 

   # 生成密钥
   ssh-keygen -t rsa -C "your_email@example.com"
   # 之后一路回车，就生成了
   # Ubuntu/Mac 按上述命令查看密钥，Win一般会生成密钥之时告诉你文件保存在哪
   ```
4. 初始化git仓库（指服务器端）

   ```
   cd /home/
   mkdir $your_object_dir
   # 修改文件夹所有者为git群组下的git用户
   chown git:git $your_object_dir
   cd $your_object_dir
   git init --bare $your_repositories.git
   # 修改仓库所有者
   chown -R git:git $your_repositories.git
   # 修改git用户密码（这个即git上传或者下载的密码，初始化git用户时一定记得修改密码）
   passwd git
   ```

## Git服务器使用

1. Git 安装

   [参考廖雪峰教程](https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496)
2. 将公钥复制到服务器端的authorized\_keys中（免去多次输密码过程，可以跳过这步）

   ```
   # 查看ubuntu下本地密钥（若无密钥，则生成密钥）
   cat ~/.ssh/id_rsa.pub 

   # ubuntu/mac/win 生成密钥
   ssh-keygen -t rsa -C "$your_email@example.com"
   # 之后一路回车，就生成了
   # Ubuntu/Mac 按上述命令查看密钥，Win一般会生成密钥之时告诉你文件保存在哪
   ```
3. Git 使用

   ```
   git clone git@$server_ip:/home/$your_object_dir/$your_repositories.git
   ```

   比如：

   ```
   git clone git@222.20.1.1:/home/hustgit/project_1.git
   password：$passwd
   ```

   * 推荐使用[sourcetree](https://www.sourcetreeapp.com)，支持windows\&mac，界面如图所示：
   * 现将常用部分进行简单介绍：
     * 文件状态：

       展示了当前分支下被修改的文件（已被暂存和未被暂存的文件）。将需要提交的未暂存文件打钩即可暂存，将已暂存的文件进行提交，即完成了本地的提交。提交信息一般为所提交内容的简介，建议使用如下格式：

       ```
       add : 新提交的文件或者新增加的功能
       modify : 修改某个功能
       fix : 修复某个bug
       ……
       ```
     * 历史：

       展示了各个分支修改的历史版本，这里可以看到本地和远程分支的所有历史记录，同一颜色的线表示某个分支的修改记录以及提交信息。双击某个节点即可切换到相应的版本。
     * 分支：

       展示了本地上的所有分支。双击分支名字，即可切换到对应的分支，后续修改以及提交，都将在所选分支上进行。初次协作开发项目时，建议新增一个本地分支，如：gaojunbin\_branch 新建分支时，需要选择基于哪个分支，即选择分支进行检出新的分支，在所选分支上进行自己的开发，当然后续开发完成后也可以将自己的分支合并到其他分支（如master分支上）。值得说明的是，mater分支一般为主分支，应该是相对稳定，可以发行的版本。一般先在dev分支或者个人分支上开发完成且经过测试无误后，合并到master分支。
     * 标签

       一般用作发行版本，如将master发布成V1.0.0版本等
     * 远端

       展示了远程分支（即服务器上已经存在或上传的分支）。初次建立本地新分之后，或者在某个分支上修改完成后，及时点击推送（push）到服务器端，这样别人在克隆（clone）或者拉取（pull）的时候才可以看到你的修改。
     * 关于分支的合并，以及拉取（pull）与抓取（fetch）的区别

       一般情况下，某个分支如果开发完成某个新的功能，需要合并到master分支上时，如果没有文件存在冲突，那么会直接合并成功。如果存在冲突文件，那么需要进行手动筛选具体保留的内容。而git pull和git fetch的区别就在这里，fetch从远程获取最新版本到本地，但不会自动merge，但是pull相当于从远程获取最新版本并merge到本地，在实际使用中，git fetch更安全一些，因为在merge之前，我们可以查看更新情况，然后再决定是否合并。
     * 关于gitigore取消对文件的追踪，见参考资料【4】
     * ……

## 参考资料

【1】<https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664>

【2】<https://www.runoob.com/git/git-server.html>

【3】<https://blog.csdn.net/jincheng_921/article/details/80882282>

【4】<https://www.liaoxuefeng.com/wiki/896043488029600/1317161920364578>

【5】<https://www.cnblogs.com/sxy370921/p/11734628.html>

【6】<https://blog.csdn.net/jincheng_921/article/details/80882282>

【7】<https://blog.csdn.net/u012564117/article/details/90218092>
