Git参加者の基本的なフローと操作

開発でGitを利用するにあたって、参加者が行う基本的な操作のまとめ。それぞれの運用で違いはあると思うが、だいたいこんな感じ。一応環境はWindowsで、PowershellでのCUI操作を想定している。

Git環境の準備

Git for windowsをインストールしたら、以下の環境設定を行う。

ユーザー情報の設定

登録ユーザーとメールアドレスを設定。ユーザIDとパスワードは初回アクセス時に聞かれる。

>git config --global user.name "〇〇〇〇"
>git config --global user.email "example@mail.com"

ページャとエディタの設定

デフォルトのページャは日本語が文字化けするので変更する。"cat"はPowershellでは"Get-Content"のエイリアス。lessのように行を読み進める形にはならないが、Powershellだと長いテキストもスクロールして読めるので問題ない。

>git config --global core.pager "cat"

コマンドから起動されるエディタも変更する。vimの操作はWindowsユーザには馴染みがない。慣れておいて損もないが、インストールしたままだとやはり日本語が化ける。こだわりが無ければメモ帳にしてしまえ。

>git config --global core.editor "notepad"

2019/08/05追記:git statusなどで日本語ファイル名が文字化けするのを避ける。

>git config --global core.quotepath false

開発フォルダのセットアップ

開発プロジェクトの作業フォルダを作ったら、リモートリポジトリをクローンする。

>git clone http://gitlab.example.com/project_path.git

クローン後、リソースファイル等のgit対象外のファイルを別途コピーする。他の人の開発フォルダの中身をコピーして、同じ名前のファイルはすべて「上書きしない」を選ぶのが手っ取り早いだろうか(.gitフォルダをコピーしないように注意)。

開発作業

ここからが開発作業になる。なおmasterブランチの下にdevelop等を切っている場合は適時読み替えて。

作業ブランチを切る

最新状態のmasterブランチから作業用のブランチを作成する。そして作業ブランチをカレントにする。

>git branch mywork
>git checkout mywork

ソースコードの更新

開発作業を行いソースコードを更新する。

登録・コミット

きりの良いところで更新を登録・コミットする。

>git add -A
>git commit -m "〇〇の機能追加"

リモートにプッシュ

作業ブランチをリモートにプッシュ(アップロード)する。

>git push origin mywork

プルリクエスト(マージリクエスト)

リポジトリの管理者にマージのリクエストを送る。これはGithubやGitlabのWeb画面から行う。

最新状態の取り込み

マージされたらリモートの最新状態をローカルに適用する。

>git checkout master
>git pull

作業ブランチの削除

マージ済みの作業ブランチを削除する。masterの更新を取り込んで継続してもいいが、一区切りごとにブランチを切り直す方が更新漏れなどが起きないので安牌かと思われる。

>git branch -d mywork

これを開発の1スパンとして、またこの章の最初から繰り返す。

コンフリクト(競合)の解消とマージ

プル(マージ)リクエストを送ったら、コンフリクト(別々に同じファイルを更新した)が検出されてマージできない!という場合にどうすれば良いか。

Web画面で解決する

GithubもしくはGitlabのリクエスト処理画面では、マージ前にコンフリクトの発生を検出してくれる。ここでResolve conflictsボタンを押すと編集画面に移動し、Web上でコンフリクトの解消ができる(画像はGitlab)。


リクエストの処理時に行うため、基本はmasterの管理者に解消してもらうことになる。

ローカルで解決する

ローカルで自分のブランチとmasterを統合してから再リクエストする方法。またリモートへの統合以外にも、開発中に他人の更新分を取り込みたいときも同じ手順になる。

以下は作業ブランチがカレントになっており、すべての更新がcommitされている状態とする。

リモート追跡ブランチの情報を更新する。

>git fetch

masterの更新分を作業ブランチに統合する。このときコンフリクトしたファイルがあると表示される。

>git merge origin/master
Auto-merging text.txt
CONFLICT (content): Merge conflict in text.txt
Automatic merge failed; fix conflicts and then commit the result.

またマージした後のgit statusではコンフリクトが解消されていないファイルが表示される。

>git status
Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   text.txt

コンフリクトしたファイルを開くと以下のような感じで、競合マーカーを付けた状態で結合されている。

Hello world!
Hello world!!
<<<<<<< HEAD
See you world!
=======
bye world
>>>>>>> origin/master
Hello world!!!!
Hello world!!!!!

これらは人力で判断し修正する必要がある。

ひとつずつ修正する

上の状態のファイルをテキストエディタなどで開いて修正する。ちなみに VS Code や Win merge といったツールで開くと、競合マーカーを読み取ってサポートしてくれる。


どちらかに合わせる

自分か相手のどちらか一方で上書きする場合は以下のコマンドで行える。

#自分側を採用
>git checkout --ours text.txt
#相手側を採用
>git checkout --theirs text.txt

大量にある場合

ファイルが多すぎて一つ一つ開いてられない場合は、泥臭いが次のようなやり方はどうだろう。

1)マージ前のフォルダをコピーしておく。
2)マージする。
3)「checkout --theirs .」で一度全て相手側の状態にする。
4)Win mergeなどの比較ツールでコピーしたフォルダと統合を行う。

もはやgitを使う段階ではないが。

その他よく使うコマンド

>git branch -a

ブランチを列挙する。-aでリモート追跡ブランチも表示される。

>git status

ファイルの状態を見る。未コミットの更新が列挙される。ステージングエリア未登録は赤、登録済みは緑の文字になる。

>git diff BRANCH_NAME --name-only

特定のブランチとファイルを比較して違いを表示する。--name-onlyを付けるとファイル名のみ列挙する。

>git log --oneline

カレントブランチのコミット記録を見る。--onelineを付けるとコミットコメントの1行目のみを列挙する。

>git checkout BRANCH_NAME FILE_NAME

ファイルを特定のブランチの状態に戻す。なお変更をコミット済みの場合、仮にファイルを前の状態にしてもコミット記録が消えるわけではない。一度変更した後にまた再修正した記録になるだけ。無用な変更はちゃんとコミットする前に戻そう。

>git commit --amend

前回のコミットに現在の更新を含めて再コミットする。コミットコメントも書き直せる。なおコミットIDは振りなおされるため、リモートにプッシュ済みの場合、再プッシュすると履歴の不整合を起こしエラーになる。

>git push -f origin BRANCH_NAME

上記の履歴の不整合を無視して強制的にプッシュする。くれぐれも他人と共有したブランチでやってはいけない。

>git remote prune origin

リモートで削除されたブランチの追跡ブランチを削除する。

コメント