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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://junbin.gitbook.io/studynotes/git-fu-wu-qi-da-jian-yu-shi-yong.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
