#author("2026-05-14T23:14:36+09:00","default:okazaki","okazaki") #author("2026-06-11T16:18:55+09:00","default:okazaki","okazaki") #menu(howto/MenuBar) * howto/git [#d8f48d6b] #contents ** 一行メモ [#z132462b] - gitコマンドの説明 https://orange.eit.hirosaki-u.ac.jp/pw151/index.php?howto/git-tips (いろいろな事を書いている) - GitHubで使われている実用英語コメント集 https://qiita.com/shikichee/items/a5f922a3ef3aa58a1839 -- &new{2022-07-03 (日) 11:07:40}; - git status -uno #untracked filesを表示しない -- &new{2026-06-11 (木) 16:18:55}; #comment * マニュアル・リンクなど [#cc60a283] - [[The entire Pro Git book>https://git-scm.com/book/ja/v2]]~ Pro Git book 2nd Edition(2014), 1-3,5章は必読 ([[ ここ >https://orange.eit.hirosaki-u.ac.jp/pw151/index.php?howto/git#se693a78]]に最新版ではないかもしれないが pdfを保存) - [[みんなでつかう - ベアリポジトリとクローン,リモートリポジトリ>https://github.com/Shinpeim/introduction-to-git/blob/master/09_clone.md]]~ gitのversionが古い - [[gitの使用方法メモ>http://d.hatena.ne.jp/teematsu/touch/20140104/1388848887]]~ detached HEAD の説明あり。このページ内でdetachedを検索せよ - [[サルでもわかるGit入門>http://www.backlog.jp/git-guide/]]~ WindowsのGUIアプリとしてのラッパーのようだ。コマンドも可能らしい。発展編と逆引きはコマンド等によるので参照できるかも。 - [[【GitHub超初心者入門】この前初めてGitHubを... - Qiita>http://qiita.com/nnahito/items/565f8755e70c51532459]]~ - [[GitHub 入門 - Qiita>http://qiita.com/ay3/items/8d758ebde41d256a32dc]]~ * はじめてのGit [#pcfc036e] git(ギット)はソフトウェアなどのバージョン管理をするツールである。 バイナリファイル以外は、ソフトウェアに限らず有効(差分とか見れる)に使える。 //以下の文章の古い版は word文章として [[ここ>https://orange.eit.hirosaki-u.ac.jp/nc2/html/htdocs/index.php?action=pages_view_main&active_action=cabinet_view_main_init&cabinet_id=9&folder_id=18&block_id=254#_254]] にある。 //-------------------------------------------------------------------------------- ** 予備知識 [#eeb8d222] *** リポジトリ [#r0f1daa5] 開発中のソースコードの版(バージョン)を蓄えているものをリポジトリという。&COLOR(,YELLOW){コミット};(保存する操作)された版が全て記録されている。 gitでは、版管理の対象はプログラムソースコードに限らず、ファイルであれば何でも良いが、 ファイルサイズが大きいものは動作が重くなるためやめたほうがよい。 *** 作業ディレクトリ [#jfecf5fb] 通常のディレクトリのように、開発中のソースコードを置いてあるディレクトリのことを&COLOR(,YELLOW){作業ディレクトリ};という。 これをgitで版管理している場合、この作業ディレクトリには ".git"というディレクトリがあり(リポジトリの本体)、 版管理に関する情報や全ての版が保存されている。 作業ディレクトリ内のファイルは、gitの版管理を意識せずに普通に修正等して構わない。 *** ローカルリポジトリ [#fedf11af] ログインしてシェルのプロンプトが出ており、カレントディレクトリが、版管理されている作業ディレクトリであるとする。 ここにあるリポジトリのことをローカルリポジトリと呼ぶ(単にリポジトリとも呼ばれる)。 開発作業はすべてローカルリポジトリがある作業ディレクトリで行います。 *** リモートリポジトリ [#kab028bf] ローカルリポジトリは、他の"&COLOR(,YELLOW){上流};"にあるリポジトリと結びついている場合がある(その場合が大多数)。 この上流のリポジトリのことを、リモートリポジトリと呼ぶ(これも単にリポジトリとも呼ばれたりする)。 上流のリポジトリは、版のデータを受け渡しすることに使われる。 *** ベアリポジトリ [#q135592e] 作業ディレクトリを持たないリポジトリ(".git"ディレクトリのみから成るようなもの)。 リモートリポジトリはふつうはベアリポジトリである。~ ~ 上流のリポジトリのポンチ絵~ #ref(upstream20231016.png,left,30%,nowrap) ** 新しい版のコミットまでの流れ [#o86b1ac9] 作業ディレクトリ上で、 (1) ファイルを新規作成したり、修正する。 (2) そのファイルを&COLOR(,YELLOW){ステージ};に載せる(ステージに登録、ステージングなどとも言われる。ステージのことを インデックスやキャッシュとも言われる)。 (3) コミット(commit)する。これでステージングされたファイルがリポジトリに記録され、半永久的に保存される。 ローカルリポジトリの内容をリモートリポジトリに送る(&COLOR(,YELLOW){push};と呼ぶ)ことで、自分の作業内容を他の人が利用できるようになる。 逆に他の人の作業内容をリモートリポジトリから取り込むこともできる(&COLOR(,YELLOW){pull};と呼ぶ)。 自分ひとりだけでリモートリポジトリと複数のローカルリポジトリを開発に利用することもできる。 *** もっと予備知識 [#ca5a461c] - 作業ディレクトリにあるファイルのうち、&COLOR(,YELLOW){追跡対象};として登録したものだけが版管理される。 - 版は分岐できる。木の枝のような一つ一つの分岐は、&COLOR(,YELLOW){ブランチ};という。 (デフォルトでは分岐はひとつのみであり、masterという名前が付いている。) 正確には、ブランチはひとつのコミットに紐づいている。 このコミットを修正してコミットすると、ブランチは修正されたコミットを表すようになる(下の下の図を参照)。 コミットをさかのぼって更新履歴を知ることはできるが、どれがどのブランチであったかの情報は残らない。 - ブランチは自由に作成でき、作業ディレクトリの内容をどれかのブランチに切り替えられる。 (例えば、リリース予定のブランチ、機能Aを追加中のブランチ、機能Bを追加中のブランチ、機能Cをデバッグ中のブランチ、など を作成し、切り替えて使える。) - コミットの記録をもとに、ありとあらゆる事を調べることが出来る。 - 作業ディレクトリにある追跡対象のファイルは、次のいずれかの状態である。~ 1) コミット済(版として登録されているファイルと同じ)~ 2) ステージ済(コミットする予定として登録したファイルと同じ)~ 3) 修正中(未コミット、未ステージングのファイル。ステージ登録後にコミットせずに修正されている場合もある)~ ~作業ディレクトリにあるファイルの状態のポンチ絵~ #ref(workingdir20231016.png,left,30%,nowrap) - リモートリポジトリ("上流"のリポジトリ)は、ローカルリポジトリが"追跡"しているリポジトリであり、 通常、複数の人が共通に使っているリポジトリである。これにより共同でソースコード開発が行える。 -- 正確には、リモートリポジトリのブランチを、ローカルリポジトリのブランチが 追跡している形である。 -- ローカルリポジトリに加えたコミットの内容を pushしたり、逆に pullしたりできる。 また、ローカルリポジトリは、複数のリモートリポジトリを利用できる。 リモートリポジトリをひとつだけ使っている場合には、ふつう &COLOR(,YELLOW){origin};という名前で上流のリポジトリのURLが登録されている。 - ブランチの追跡のポンチ絵 #ref(repository20231015.jpg,left,50%,nowrap) //-------------------------------------------------------------------------------- ** 基本的な操作(リポジトリの作成) [#u2d4ea69] 以下では、ファイル名、ディレクトリ名、注釈などはすべて英語とする(トラブル回避のため&COLOR(RED){日本語の使用を避ける};)。 *** 最初に一度だけする設定(マシン毎) [#g57a0948] $ git config --global user.name "名前" $ git config --global user.email "メールアドレス" $ git config --global core.editor emacs $ git config --global push.default simple *** 新規に、ローカルリポジトリを作る [#o599e6bc] 版管理したい作業ディレクトリに移動して、初期化する(.gitディレクトリを作る)。作業ディレクトリは空でも、ファイルがあっても構わない。 $ cd 作業ディレクトリ $ git init *** 新規に、リモートリポジトリ(ベアリポジトリ)を作って、利用する(スキップ((リモートリポジトリに関することはスキップして下さい。gitの扱いに慣れたら、この資料をみて自分で試してよい。))) [#z8adca47] マシン Aにベアリポジトリを作って、マシン Bにローカルリポジトリを作って利用する場合 マシン Aで $ mkdir ベアリポジトリのディレクトリ名.git $ cd ベアリポジトリのディレクトリ名.git #(*) $ git init --bare マシン Bで $ cd 作業ディレクトリ $ git init $ git remote add origin ベアリポジトリのURL #URLは上の(*)を示す「ssh://xxx@yyy:/~/ベアリポジトリのディレクトリ名.git」などを指定 // $ git add ファイルやディレクトリ #下記参照 // $ git commit -m "注釈" #下記参照 $ git push --set-upstream origin master なお、ディレクトリが異なれば、マシン A, Bは同じPCであっても構わない。 *** 既存のリモートリポジトリのコピー(クローン)をしてローカルリポジトリを作る(スキップ) [#cada80ec] $ git clone ベアリポジトリのURL 作業ディレクトリ名 ** 基本的な操作(日々の作業など) [#v2d91fad] *** ファイルをステージングし、ローカルリポジトリにコミットする [#b7dabfe9] $ git add ファイル #ファイル(ディレクトリも指定が可能)をステージングする。 #初めてaddされたファイルであれば、自動的にgitで版管理する追跡対象になる。 $ git commit -m "注釈" #ステージングされたファイルをローカルリポジトリにコミットする。 #注釈は英語で! *** ローカルリポジトリの更新内容をリモートリポジトリに送る(スキップ) [#fcd0a0f6] $ git push *** リモートリポジトリの更新内容を作業ディレクトリに取り込む(スキップ) [#i81875e9] $ git fetch #取り込むだけ $ git pull #取り込んで、作業ディレクトリのファイルにマージ(更新をファイルに適用)する *** 新しくローカルリポジトリにブランチを作る [#td385c85] $ git checkout -b ブランチ名 #ブランチを作成し、作成したブランチに切り替える *** 既存の別のブランチに切り替える [#wd20d618] $ git checkout ブランチ名 #既存のブランチに切り替える(未コミットなどがあればできない) *** 新しくローカルリポジトリにブランチを作り、リモートリポジトリにpushする(スキップ) [#se98d984] $ git checkout -b ブランチ名 #ブランチを作成し、作成したブランチに切り替える $ git push --set-upstream origin ブランチ名 #リモートリポジトリoriginにブランチをpushする(ブランチが作成される)とともに、ローカルリポジトリのブランチが #originに作成されたブランチを追跡するように設定する(--set-upstream)。 *** リモートリポジトリにあるブランチを追跡するように、ローカルリポジトリに同名のブランチを作成し、作成したブランチに切り替える(スキップ) [#adf47f68] $ git checkout --track origin/ブランチ名 *** 更新内容の表示など [#t7ff0cb8] $ git fetch #リモートリポジトリの更新内容を読み込む $ git remote -v ; git branch -vv #リモートリポジトリを表示;ブランチを表示 $ git status #作業ディレクトリの状態を表示 $ git log -15 --oneline --decorate --graph --all #コミットログを表示, スクロールなどの操作はviとほぼ同じ $ gitk --all #コミットログを表示(GUIによる) $ git branch -a #すべてのブランチを表示 $ git tag #すべてのタグを表示 //-------------------------------------------------------------------------------- ** 基本的な操作(複数のブランチ利用) [#s43bbca4] *** あるSHA1のコミットにタグを付ける [#u03cec1e] git tag tmp_hoge a5f38c9 #ローカルリポジトリでタグを付ける *** ブランチを削除する [#pdb18925] git branch -d hogehoge #ローカルリポジトリにあるブランチhogehogeを削除 git branch -d -r origin/hogehoge #ローカルリポジトリにあるブランチorigin/hogehogeを削除 git push origin --delete hogehoge #リモートリポジトリのブランチhogehogeを削除 git fetch --prune #リモートで削除済みの、ローカルの追跡ブランチを消す(未確認) *** 差分をみる [#uc6c610f] git diff --cached #親コミットとステージの差分 git diff master_20190603 HEAD nameless_pot.c #master_20190603タグと親コミットとの差分をnameless_pot.cについて表示 *** helpコマンド [#nfde4f15] git help rev-parse *** masterをマージする [#ed9c646f] git merge --no-commit --no-ff master #dry-run的なことがされるので確認後、マージをアボートか、コミットする #git merge --abort #git commit -m "merge branch master into hogehoge" *** 作業ディレクトリのファイルのうち、追跡対象になっていないファイルを確認 [#qfab92e0] git ls-files -o --exclude-standard gitlsfiles.py #python3環境のみ(~okazaki/util/com内) //-------------------------------------------------------------------------------- ** 練習 [#kd7bdc1b] マシンkalmiaに作成中のプログラムがあるディレクトリ ~/pracがあるとする。 *** 最初に一度だけする設定をせよ [#veaccf4c] git config --global user.name 'john smith' #SPCが含まれるのでクォートした git config --global user.email smith@kalmia #適当でよい git config --global core.editor emacs git config --global push.default simple git config -l #設定内容の確認 *** pracディレクトリを版管理するために、ローカルリポジトリを作成し、必要なファイルをステージングし、コミットせよ [#b96b2352] cd ~/prac git init gitk --all & #以下のコマンド実行前後で、gitkのメニューからupdateして表示内容がどう変わるかを確認する(X11環境が必要)。 #また git status も実行し、表示内容がどう変わるかも確認する。 git add *.c #メタキャラが使える。各自、自分の状況に合わせてファイルをaddする git add *.h git add makefile git add 他にもあれば追加 #大きなファイルは追加しない #コンパイルで生成されるものは追加しません git commit -m "the first commit" #SPCが含まれるのでクォートした gcc -o main.x main.c ./main.x (注1)コンパイル・リンクでできた実行ファイルは、ふつうリポジトリには入れません。~ (注2)gitkコマンドはXウィンドウシステムを介してGUIウィンドウを表示する。sshログインしたマシンで実行したプログラムの GUIウィンドウを表示するには、sshコマンドに -Y オプションを与えておく必要がある(ssh yourname@hostname -Y)。 もしくは DISPLAY環境変数を設定する必要がある。 *** 修正してコミットせよ(1回以上)。以下のよく使うコマンドも試せ [#d1888a54] emacs main.c #コメントを入れるとか、空行を追加するとかでよい gcc -o main.x main.c ./main.x git add main.c git commit -m "modify main.c" 作業ディレクトリの状態を確認するときによく使うコマンド、適当なタイミングで、必要に応じて試せ。 git remote -v ; git branch -vv #ブランチを表示 git status #作業ディレクトリの状態を表示 git log -15 --oneline --decorate --graph --all #コミット履歴を表示 gitk --all git diff #作業ディレクトリと親コミットとの差分表示 git diff --cached #ステージと親コミットとの差分表示 *** .gitignoreファイルを作り、不要な出力を抑止する [#l3e43fab] 作業ディレクトリに追跡対象ではないファイルがあると git statusで出力される。 出力させたくない場合、.gitignoreファイルにファイル名を記載する。 emacs .gitignore *~ #例えば、この2行を *.x #.gitignoreに記載する。 git add .gitignore git commit -m "add .gitignore" *** ベアリポジトリを作り、pushしてみよ(スキップ) [#gbd405af] cd ~ mkdir repgit; cd repgit mkdir prac.git; cd prac.git git init --bare #~/repgitディレクトリの中に prac.gitというベアリポジトリを作った。 cd ~/prac git remote add origin ssh://yourname@hostname:/home/yourname/repgit/prac.git #originに URLを登録 git push --set-upstream origin master #originのmasterブランチにpushするとともに、 #ローカルリポジトリのカレントブランチ(masterブランチ)が originのmasterを追跡するように設定 #yournameはログインID #hostnameはkalmia.eit.hirosaki-u.ac.jpなど *** ベアリポジトリからクローンしてみよ(スキップ) [#z1a61e67] cd ~ #kalmiaでなくて、VirtualBoxのubuntuで実行してもよい mkdir tmp; cd tmp git clone ssh://yourname@hostname:/home/yourname/repgit/prac.git prac2 *** クローンしたリポジトリの作業ディレクトリで、ファイルを修正してcommit, pushし、もともとの作業ディレクトリでpullしてみよ(スキップ) [#g04a3cdf] cd ~/tmp/prac2 emacs main.c git add main.c git commit -m "modify main.c in prac2" git push cd ~/prac git fetch git pull prac2とpracで更新内容などを見てみよ git remote -v ; git branch -vv git log -15 --oneline --decorate --graph --all ~/tmp/prac2はこのあと使わないので削除して構わない。 //--------------------------------------------------------------------------------