WSL2-Ubuntu での Git の基本
Windows 10 Pro の WSL2 の Ubuntu 18.04LTS における Git の備忘録です.Linux の Git と同様ですが,エディタは Windows にインストールした Visual Studio code を使う等,Windowsとの連携を意識しています.
以前はWindowsのGit Bashを使っていましたが,Linuxで統一することにしました.
Visual Studio Code のセットアップ
公式サイトから Windows版を ダウンロードします.Sysmtem Installer を選択しました.
インストールオプション設定で,デスクトップ上にアイコンを作成する と PATHへの追加 にチェックを入れました.
左端のアクティビティバーの下端のアイコン(5つ目)をクリックすると拡張機能ビューが開き,拡張機能をインストールできます.
日本語化
日本語化するには拡張機能ビューの検索ボックスで japanese と入力し,おそらく一番上に現れる,Japanese Language Pack for Visual Studio Code の右に見える Install ボタンを押してインストールしましょう.
WSLで利用する準備
WSL で使用するため,拡張機能ビューで Remote-WSL をインストールします.
Ubuntu のターミナルから起動できます.
code .
しかし,なぜか path が通っておらず起動できませんでしたので,~/.bashrc
を開き,以下の通り path に加えました.
# Visual Studio Code
export PATH="/mnt/c/Program Files/Microsoft VS Code/bin:$PATH"
Gitの初期設定
Ubuntuのターミナルで初期設定を行います. user.name および user.email には GitLab や Github で登録したものと同じものがよいでしょう.この作業はインストール直後に一回だけ行います.
git config --global core.editor "code --wait"
git config --global user.name yourname
git config --global user.email your@email.com
git config --global core.quotepath false
設定を確認します.
git config --list
設定を削除する方法です.
git config --global --unset 設定項目名
あるいは再度設定すれば上書きされます.
ローカルリポジトリの作成
Gitで管理するディレクトリに移動し,以下を実行します.ディレクトリ .git
が作成されます.
git init
リモートリポジトリをローカルにクローン
Github等のリモートリポジトリをローカルにクローン(複製)するのがより一般的です.
git clone git@github.com:***.git
リモートリポジトリの確認
リモートリポジトリのurlを確認します.
git remote -v
Git管理ディレクトリ
Git管理ディレクトリは 作業ツリー,git add
による登録先の ステージングエリア(インデックスとも呼ばれます),git commit
による登録先の ローカルリポジトリ から構成されます.
Git の管理からファイルやディレクトリを除外
管理から外したいファイル等の情報を含むテキストファイル .gitignore を作成します..gitignoreは任意のディレクトリに置け,そのディレクトリをカレントディレクトリとする相対pathで内容を記述します.
/
を含まない行は .gitignore 以下のサブディレクトリ中を含むすべてが対象,末尾以外に /
を含む行はカレントディレクトリからの相対pathを意味し,末尾のみ /
を含む行はカレントディレクトリ以下の全サブディレクトリ中にある当該名を持つすべてのディレクトリを無視します.
# subdirという名前のディレクトリをすべて無視
subdir/
# fileという名前のファイルをすべて無視
file
# カレントディレクトリのfileを無視
/file
# 拡張子 mod のすべてのファイルを無視
*.mod
先頭の / はカレントディレクトリを意味し,末尾の / は当該ディレクトリを意味します(末尾の / を付けないと,カレントディレクトリ以下のサブディレクトリを含む任意の場所にあるディレクトリまたはファイルにマッチします).*はワイルドカードで正規表現が使えるようです. 詳細はこちらを参考ください.
Gitでの日常の作業
Git add
でステージングエリアへ登録
ファイル等をステージングエリアに登録します.
# カレントディレクトリ下の拡張子 F の全ファイル登録
git add *.F
# サブディレクトリsubdir以下のすべてを登録
git add subdir
# サブディレクトリsubdirにある makefile を登録
git add subdir/makefile
# すべてのサブディレクトリ内の .gitignore を登録
git add \*.gitignore
# バージョン管理されていて,変更されたファイルをすべて登録
git add -u
管理状況の確認
git status
差分の確認
ファイル編集前後の差分を確認します.
# 作業ツリーとステージングエリアの差分
git diff
# ステージングエリアと直前のコミット(リポジトリ)の差分
git diff --cached
行頭が -
で始まる赤文字が編集前,行頭が +
で始まる緑文字が編集後です.
末尾にコロン :
が現れたら,スペースキー で次画面,Enter で次行,q
で終了しプロンプトに戻ります.
ステージングエリアへの登録取り消し
git add
で登録したものを取り消します.
# fileの登録を取り消し
git reset HEAD file
# すべての登録を取り消し
git reset HEAD .
HEAD
はローカルリポジトリの最後のコミット状態です.fileにはファイル名またはディレクトリ名を指定できます.作業ツリーのファイルへの変更は維持され,ステージングエリアへの登録だけが取り消されます.作業ツリーのファイル変更もすべて取り消すには git checkout .
としますが,新規追加ファイルは維持されます.
作業ツリーの変更取り消し
作業ツリーでの変更をすべて取り消し,直前のコミットに戻します.
# 作業ツリーのfileの変更を取り消し
git checkout -- file
# git add したものは維持し,作業ツリーの変更をすべて取り消し
git checkout .
ローカルリポジトリにコミット
ステージングエリアの登録ファイルをローカルリポジトリにコミットします.
git commit
エディタ(Visual Studio Code)が開きますので,編集内容を説明するコミットメッセージを入力します.1行で書くか,または1行目に要約,1行空けて詳細を書き,エディタを閉じます.
コミットの取り消し
直前のコミットを取り消します.作業ツリーとステージングエリアは変更せず,コミットのみを取り消した状態となります.
git reset --soft HEAD^
作業ツリーとステージングエリアの変更も同時に取り消すには --hard
とします.この場合は一つ前のコミットの状態に戻るため,そのコミット後の作業がすべて消えます.
ファイルやディレクトリの削除
Git管理下のファイルやディレクトリを削除するには, rm
ではなく git rm
を用います.作業ツリーから削除され,その状態がステージングエリアに登録されます.
# ファイルfileを削除
git rm file
# ディレクトリsubdirを削除
git rm -r subdir
コミットの履歴を確認
git log
# 差分も合わせて表示
git log -p
リモートレポジトリに反映
git push
git pushの取り消し
誤って git push してしまい,元に戻したい場合の対処方です.まず,ローカルでの変更そのものを取り消します.
# 直前のコミットを取り消す
git reset --hard HEAD^
次に push します.
# 強制的にpushする
git push -f origin master
しかし,これですと,以下のようなエラーとなるかもしれません.
git push -f origin master
Total 0 (delta 0), reused 0 (delta 0)
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
To gitlab.com:username/projectname.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@gitlab.com:username/projectname.git'
これに対処するには,GitLab で Protected の状態を Unprotected にする必要があります.GitLabの当該リポジトリ(プロジェクト)において,左端メニューの下端にある,Settings の Repository をクリックし,Protected Branches を Expand し,さらに,Protected Branches を Expand します.そして,オレンジ色の Unprotected アイコンをクリックします.その後,上記の git push -f origin master を実行します.
ブランチの操作
作業ツリーにおけるブランチの操作をまとめます.
ブランチの一覧の取得
現在のブランチは先頭にアスタリスク * が付いたものです.
# ローカルブランチを取得
git branch
# ローカルとリモートのブランチを取得
git branch -a
新しいブランチを作成して切り替え
新しいブランチ devel
を作成し,そのブランチに切り替えます.
# ブランチを作成し,次に切り替え
git branch devel
git checkout devel
# または,-b で作成して切り替え
git checkout -b devel
作業ツリーやステージングエリアにまだコミットしていない変更がある状態で他のブランチへ切り替えを行うと,その変更内容は元のブランチから移動先のブランチに移動します.ただし,存在しているブランチに切り替える際で,同じファイルが既に変更されている場合は失敗します.
リベース
masterブランチをdevelブランチにリベースします.develブランチで実行します.
git rebase master
ローカルで新規作成したブランチをリモートへプッシュ
ローカルで new_branch を作成し,そのブランチをリモートにプッシュする方法です(リモートにこのブランチは存在しません).
git branch new_branch
git checkout new_branch
# 作業する
git push origin new_branch
git push
に失敗する場合
Gitlab への git push
に失敗することがありました.元々できていたはずなのですが.理由は分かりませんが,こちらの記事と全く同じ状況で,記事に従い解決できました.
GithubとGitlabの並行運用
追記:この方法は毎回UsernameとPasswordを入力する必要があり,止めました.HTTPSの代わりにSSHを指定する方法ではこの方法はうまくいきませんでした.結局,並行運用はあきらめました
GithubとGitlabのリモートリポジトリを同一にして運用する方法です.どちらかが落ちても代替がリポジトリがあるので安心です.例として,Gitlabで運用している状態にGithubを追加します.ただし,Githubは別のリポジトリで既に運用しており,接続できるものとします.こちらの記事を参考にしました.
現在のリモートリポジトリの状態を確認します.
$ git remote -v
origin git@gitlab.com:<username>/<repository>.git (fetch)
origin git@gitlab.com:<username>/<repository>.git (push)
ただし,<username>
と <repository>
にはそれぞれユーザ名とリポジトリ名が入ります.
Githubのリモートリポジトリを追加し(作成済みとします),確認します.
$ git remote set-url --add <remote name> <SSH name>
```bash
$ git remote set-url --add
$ git remote -v
origin git@gitlab.com:/.git (fetch)
origin git@gitlab.com:/.git (push)
origin (push)
ただし,`<remote name>` は 普通は `origin` です.`<repository url>` は Github の当該リポジトリの url をコピペするだけです.
`git push` を実行します.ローカルで新しいブランチ new_branch を作成し,それを Gitlab には上述の通りpushした状態で,以下を実行すると,Gitlab は `Everything up-tp-date` となり,Githubの方はpushが実行されました.
$ git push origin new_branch
初回はGithubの Username と Password の入力が求められました.
逆にリモートリポジトリのurlを削除する方法は以下です.
$ git remote set-url --delete