ローカルにGitサーバーを作りVSから直接操作する手順（自分用メモ）

## １．Gitローカルリポジトリの作成

### (1) Gitを管理するフォルダを決める
* 複数人で共有する場合、当然ネットワークドライブにする

| ネットワークドライブのGit用ディレクトリ | 
|:-----------|
| /srv/git/myproject.git |

```bash
mkdir -p /srv/git/myproject.git
cd /srv/git/myproject.git
git init --bare
```

### (2) Gitで管理したいVSのソリューションに .gitignore を追加
* .vs や obj など、Gitでは管理したくないフォルダやファイルを無視するために最初に必要
* .gitignore を .slnと同じ階層に保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/d4d376ca-33c4-4367-b5cd-5519adae2b33.png)

* 最低限の .gitignore
```
.vs/
bin/
obj/
*.user
*.suo
```

* 一般的な .gitignore の参考
https://github.com/masayahak/WinFormsMenuDemo/blob/master/.gitignore

### (3) VSで作成したソリューションを登録

① VSのソースフォルダでGit初期化（作業ツリーあり）

| VSのソースフォルダ | 
|:-----------|
| D:\Dev\WinFormsApp1 |

```bash
cd D:\Dev\WinFormsApp1
git init
git add .
git commit -m "初回コミット"
```
git add . の "."を忘れずに

② bareリポジトリをリモートとして登録

```bash
git remote add origin /srv/git/myproject.git
```

③ 初回プッシュ

```bash
git push -u origin master
```

④ 念のために初回プル

```bash
git pull --rebase origin master
```

## ２． 別の利用者からのGitリポジトリ共有方法

| 別の利用者のローカルなVSのソースフォルダ | 
|:-----------|
| D:\MyFolder\WinFormsApp1 |

```bash
git clone /srv/git/myproject.git D:\MyFolder\WinFormsApp1
```
クローンが作成される

## ３．VSからのGit利用

### (1) これまでの手順でオリジナル、別の利用者ともに自動でGit管理される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/2afaed59-b029-41c3-a4a6-a29370280925.png)

### (2) ソースを修正したらコミット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/74fda6a5-2949-4894-ba80-23bdbf82ffca.png)

### (3) サーバーと同期
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/86b73e26-4fab-4e79-bc5e-6998a1b2228a.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/be75f7dd-19ff-4d70-bfa3-f757d06b1e7a.png)

## ４．Gitリポジトリのバックアップ
* 別のファイルサーバーへ履歴も含め完全コピーする

```bash
robocopy "\\srv01\GitRepos\MyApp.git" "\\自社NAS\GitBackup\MyApp.git" /MIR /Z /R:1 /W:1
```

| オプション | 意味 |
|------------|------|
| `/MIR`     | ミラーリング：コピー元と同じ構造にする（※削除も反映） |
| `/Z`       | 再起動後でも再開できる「中断可能なコピー」モード |
| `/R:1`     | コピー失敗時のリトライ回数（1回だけ再試行） |
| `/W:1`     | リトライ時の待機秒数（1秒） |


## ５．修正が競合したらどうなるか？

### (1) あえて同じファイルを修正します。

```C#
public partial class Form1 : Form
{
    private string _name = "GitTest1111111111111";

    public Form1()
    {
        InitializeComponent();
    }
}
```

```C#
public partial class Form1 : Form
{
    private string _name = "GitTest22222222222";

    public Form1()
    {
        InitializeComponent();
    }
}
```

### (2) 先にGitTest1111111111111をコミットしてサーバーと同期

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/68ecbb6b-f362-4b09-9993-d388a844f76e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/cd30b138-2459-4190-9f9a-b86ae5ec3856.png)

### (3) つづいてGitTest22222222222をコミットしてサーバーと同期

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/f7e4d016-3cca-42e7-aa57-c4a8e4a3e131.png)

:::note alert
サーバーと同期したタイミングで競合が検出される
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/50fe2d68-d528-4ce8-946e-73ec03af4d7f.png)

### (4) 人間が判断してマージエディターで競合を修正

マージエディターを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/6c805446-5d93-414a-ae09-b70737de839a.png)

:::note
一例として、GitTest22222222222側を優先し「マージを許可」
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/0b5ccf45-b220-47d5-8f67-e9a90a747722.png)

### (5) 許可したマージをコミットしサーバーと同期

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/57f8722d-bb19-471b-bb77-4df2141388b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/db1bb965-3ee3-48b0-85f1-b35f62cc0265.png)

:::note
これで競合は解決！
:::


## ６．Sourcetreeを利用しプッシュの履歴を確認する

### (1) Sourcetreeにリポジトリを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/5e23816a-af26-4421-af98-c91ef92d33bd.png)

### (2) リポジトリを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/38e0bb27-adf8-4685-88b7-53403e510e92.png)

### (3) historyが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546646/3b87bc69-b409-44a2-8f20-6ae2aba5eb28.png)



## Ｘ．おまけ（Gitの最新をSVNへ同期する方法）

### (1) Gitの最新版をワークツリーにチェックアウト

```bash
@echo off
REM 一時作業用フォルダ
set WORK=C:\GitTemp\MyApp
set REPO=\\srv01\GitRepos\MyApp.git

if exist %WORK% rd /s /q %WORK%
git clone %REPO% %WORK%
```

### (2) SVNの作業コピーを更新

```bash
set SVNWC=C:\SVNWork\MyApp
set SVNR=https://svn-server/repos/MyApp

if not exist %SVNWC% (
    svn checkout %SVNR% %SVNWC%
)

xcopy /E /Y /Q %WORK%\* %SVNWC%\
```

### (3) SVNコミット（差分のみ）

```bash
cd %SVNWC%
svn add * --force
svn commit -m "Git最新版をデイリー同期"
```