LoginSignup
9
9

More than 1 year has passed since last update.

VSSやTFSからGitへ移行したとき悩んだときに読んでほしいこと

Last updated at Posted at 2021-02-03

はじめに

VSS(Visual Source Safe)や TFS(Team Foundation Server)から Git へ移行すると、その考え方の違いを理解することに苦労する。

Gitを使い始めるにあたり、Git特有の用語や仕組みについて、すべてを最初から理解する必要はない。

必要なときに、その都度 覚えるのがよさそう。

ここでは、各フェーズでの理解の仕方をまとめる。

VSS / TFS

  • 中央集中型のVCS(Version Control System)
  • サーバのデータベースに対して、各クライアントが接続し、直接ファイルを変更するイメージ image.png

Git

  • 分散型のVCS
  • VSS/TFSと大きく異なるのは、各クライアントがローカルリポジトリというデータベースを持つところ

image.png

STEP1:VSS/TFSのように使う

まずは、VSS/TFS相当の使い方をおこなうステップ
細かいことは置いておいて、VSS/TFSと思って利用する場合は、この程度の理解で使い始めてOK
image.png

VSS/TFS Git
1. 最新バージョンの取得
2. チェックアウト
3. ファイルを変更
4. チェックイン
1. クローン
2. ファイルを変更する
3. コミット
4. プッシュ
  • クローン(clone)
    • VSS/TFSの最新バージョンの取得のように、サーバから最新のファイル群を取得する
  • コミット(commit)と プッシュ(push)
    • VSS/TFSのチェックインをするなら、コミット&プッシュの両方をするんだな 程度に覚えておく

STEP2:リポジトリを意識し始める

なんかローカルリポジトリに、リモートリポジトリにあるはずの履歴がないなぁ と疑問を感じ始めたら。
image.png

  • リポジトリ
    • 履歴の情報をすべて持っている
  • リモートリポジトリ
    • サーバにあるリポジトリ
  • ローカルリポジトリ
    • ローカルPCにあるリポジトリ
  • クローン(clone)
    • サーバからローカルリポジトリを作成。その後ローカルリポジトリから必要なファイル群が生成される
  • コミット(commit)
    • 変更したファイルをローカルリポジトリに入れる
  • プッシュ(push)
    • ローカルリポジトリにコミットされたものを、リモートリポジトリへ送る
  • フェッチ(fetch)
    • ローカルリポジトリにリモートリポジトリから履歴情報のみを取得する(ファイルは何も変化しないので、お気軽に)

STEP3:マージの登場

なんかプッシュするときにプルしろと怒られる。。。
VSS/TFSを使っているときはあり得ない状況なので、まずこれが理解できなかった。
そして、コンフリクト(衝突)もないのに、なぜマージという言葉が出てくるのか?

いろいろ難しいが、まずはこの状況でプルするときは、『リベース(rebase)』のマージをすると覚えておけばよいかと思う。
リベースにしておけば、履歴が1本で繋がる。
使っているGitクライアントによるが、基本的にリベースは標準無効なので、意識的に選択する必要がある。
これを忘れると、『なんか履歴の枝分かれが出たり出なかったりして見ずらい』となる。

STEP4:master/head

master

  • gitでリポジトリを作成すると、デフォルトで作成されるものをmasterブランチと呼ぶ
  • このmasterブランチを、プロジェクトの本流/マスターと位置づけることが多い

head

  • ローカルリポジトリでheadは現在いる場所(ブランチ)を示す
  • リモートリポジトリでのheadは、クローンしたときのデフォルトのブランチを示す。つまり、リモートリポジトリからクローンしたとき、何も指定がないと通常masterブランチがチェックアウトされるのはこのためである。gitコマンドで変更できるようだが試したことはない。(https://git-scm.com/docs/git-symbolic-ref

STEP5:ブランチのマージ

ブランチを作ってから作業完了するまでに、masterブランチに別の変更がコミットされている場合、何も考えずにコミットすると、履歴の分岐がブランチ作成から現在までになるが、できれば、masterブランチの最新から別れて戻るほうが後々分かりやすい。少し気を使った操作をしてあげないとこのような形にならないため、以下に手順の例を示す。

image.png
(M2の時点でBranchAを作成しB1,B2をコミット。その間masterブランチもM3,M4とコミットが進んでいる状態)

手順(GitクライアントアプリForkでの例)

リベースでmasterの最新コミットへbranchの根本を移動しマージ

  1. BranchAをmasterにrebase
    BranchAに移動した状態で、masterを選択し、BranchAをrebase
    image.png
    image.png
    image.png

  2. masterにBranchAをマージ (no fast forward)
    masterに移動する
    BranchAをmasterにmerge (no fast forward) する
    image.png
    image.png
    image.png

  3. masterをpush
    image.png
    image.png

不要なbranch(ローカル/リモート)を削除

image.png
image.png
image.png
image.png

STEP6:チェリーピック

リリースブランチ(BranchA)にmasterブランチの一部を取り込みたい場合があるが、そういうときは「チェリーピック」が利用できる。
以下、masterのM4のみをBranchAに入れるときの例。

image.png

image.png

image.png

image.png

STEP7:マージ(squash)

開発ブランチ(BranchA)から、masterブランチへマージする際に、ブランチでのコミット履歴を1つにまとめてコミットしたいことがある。その場合は、margeのsquashを利用できる。
以下、BranchAのB1,B2,B3コミットを、masterへ1つのコミットとして入れるときの例。

image.png

image.png

image.png
不要なブランチを削除すれば、下図のようになる(New Commit comment!!!と書いてある部分にはB1,B2,B3が含まれる)
image.png

9
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9