#author("2024-10-23T12:54:01+09:00","default:okazaki","okazaki")
#author("2024-10-23T12:54:46+09:00","default:okazaki","okazaki")
#menu(howto/MenuBar)
* howto/git/forthefirsttime [#ja1835b8]
#contents
** 一行メモ [#cbf3edaa]
- gitコマンドの説明 https://orange.eit.hirosaki-u.ac.jp/pw151/index.php?howto/git (いろいろな事を書いている)
- GitHubで使われている実用英語コメント集 https://qiita.com/shikichee/items/a5f922a3ef3aa58a1839 --  &new{2022-07-03 (日) 11:07:40};

#comment


* マニュアル・リンクなど [#da0efa11]

- [[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 [#g1c0e11a]

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]] にある。


//--------------------------------------------------------------------------------

** 予備知識 [#o495f9e6]

*** リポジトリ [#z353909f]
開発中のソースコードの版(バージョン)を蓄えているものをリポジトリという。&COLOR(,YELLOW){コミット};(保存する操作)された版が全て記録されている。
gitでは、版管理の対象はプログラムソースコードに限らず、ファイルであれば何でも良いが、
ファイルサイズが大きいものは動作が重くなるためやめたほうがよい。

*** 作業ディレクトリ [#cc512af5]
通常のディレクトリのように、開発中のソースコードを置いてあるディレクトリのことを&COLOR(,YELLOW){作業ディレクトリ};という。
これをgitで版管理している場合、この作業ディレクトリには ".git"というディレクトリがあり(リポジトリの本体)、
版管理に関する情報や全ての版が保存されている。

作業ディレクトリ内のファイルは、gitの版管理を意識せずに普通に修正等して構わない。

*** ローカルリポジトリ [#uc5b9b64]
ログインしてシェルのプロンプトが出ており、カレントディレクトリが、版管理されている作業ディレクトリであるとする。
ここにあるリポジトリのことをローカルリポジトリと呼ぶ(単にリポジトリとも呼ばれる)。

開発作業はすべてローカルリポジトリがある作業ディレクトリで行います。

*** リモートリポジトリ [#h499dce8]
ローカルリポジトリは、他の"&COLOR(,YELLOW){上流};"にあるリポジトリと結びついている場合がある(その場合が大多数)。
この上流のリポジトリのことを、リモートリポジトリと呼ぶ(これも単にリポジトリとも呼ばれたりする)。
上流とは版のデータを受け渡しを行える。
上流とは版のデータを受け渡しできる。

*** ベアリポジトリ [#v02a1f73]
作業ディレクトリを持たないリポジトリ(".git"ディレクトリのみから成るようなもの)。
リモートリポジトリはふつうはベアリポジトリである。~
~
上流のリポジトリのポンチ絵~
#ref(upstream20231016.png,left,30%,nowrap)


** 新しい版のコミットまでの流れ [#ne4a8e27]
作業ディレクトリ上で、
(1) ファイルを新規作成したり、修正する。
(2) そのファイルを&COLOR(,YELLOW){ステージ};に載せる(ステージに登録、ステージングなどとも言われる。ステージのことを
インデックスやキャッシュとも言われる)。
(3) コミット(commit)する。これでステージングされたファイルがリポジトリに記録され、半永久的に保存される。

ローカルリポジトリの内容をリモートリポジトリに送る(&COLOR(,YELLOW){push};と呼ぶ)ことで、自分の作業内容を他の人が利用できるようになる。
逆に他の人の作業内容を取り込むこともできる(&COLOR(,YELLOW){pull};と呼ぶ)。
自分ひとりだけで複数のローカルリポジトリを開発に利用することもできる。

*** もっと予備知識 [#t43d56c5]
- 作業ディレクトリにあるファイルのうち、&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)


//--------------------------------------------------------------------------------

** 基本的な操作(リポジトリの作成) [#i31a4e96]

以下では、ファイル名、ディレクトリ名、注釈などはすべて英語とする(トラブル回避のため&COLOR(RED){日本語の使用を避ける};)。

*** 最初に一度だけする設定(マシン毎) [#w471c1f4]
 
  $ git config --global user.name     "名前"
  $ git config --global user.email    "メールアドレス"
  $ git config --global core.editor   emacs
  $ git config --global push.default  simple


*** 新規に、ローカルリポジトリを作る [#o45c9ab2]

版管理したい作業ディレクトリに移動して、初期化する(.gitディレクトリを作る)。作業ディレクトリは空でも、ファイルがあっても構わない。
 $ cd 作業ディレクトリ
 $ git init


*** 新規に、リモートリポジトリ(ベアリポジトリ)を作って、利用する(スキップ((リモートリポジトリに関することはスキップして下さい。gitの扱いに慣れたら、この資料をみて自分で試してよい。))) [#m8bd7f25]

マシン 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であっても構わない。


*** 既存のリモートリポジトリのコピー(クローン)をしてローカルリポジトリを作る(スキップ) [#o524a533]

 $ git clone ベアリポジトリのURL  作業ディレクトリ名


** 基本的な操作(日々の作業など) [#p3f2b03d]
 
*** ファイルをステージングし、ローカルリポジトリにコミットする [#oa4af105]
 
   $ git add ファイル  #ファイル(ディレクトリも指定が可能)をステージングする。
                       #初めてaddされたファイルであれば、自動的にgitで版管理する追跡対象になる。
  
   $ git commit -m "注釈"  #ステージングされたファイルをローカルリポジトリにコミットする。
                           #注釈は英語で!
 
*** ローカルリポジトリの更新内容をリモートリポジトリに送る(スキップ) [#c92898f2]
   $ git push
 
*** リモートリポジトリの更新内容を作業ディレクトリに取り込む(スキップ) [#mb2753d9]
   $ git fetch  #取り込むだけ
   $ git pull   #取り込んで、作業ディレクトリのファイルにマージ(更新をファイルに適用)する
 
*** 新しくローカルリポジトリにブランチを作る [#t7e124af]
   $ git checkout -b ブランチ名  #ブランチを作成し、作成したブランチに切り替える
 
*** 既存の別のブランチに切り替える [#a0c4ab3b]
   $ git checkout ブランチ名     #既存のブランチに切り替える(未コミットなどがあればできない)
 
*** 新しくローカルリポジトリにブランチを作り、リモートリポジトリにpushする(スキップ) [#b433ef6a]
   $ git checkout -b ブランチ名  #ブランチを作成し、作成したブランチに切り替える
   $ git push --set-upstream  origin ブランチ名
       #リモートリポジトリoriginにブランチをpushする(ブランチが作成される)とともに、ローカルリポジトリのブランチが
       #originに作成されたブランチを追跡するように設定する(--set-upstream)。
 
*** リモートリポジトリにあるブランチを追跡するように、ローカルリポジトリに同名のブランチを作成し、作成したブランチに切り替える(スキップ) [#b086a6ec]
   $ git checkout --track origin/ブランチ名
 
*** 更新内容の表示など [#o8e508ef]
   $ 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          #すべてのタグを表示


//--------------------------------------------------------------------------------

** 基本的な操作(複数のブランチ利用) [#w4d39b25]

*** あるSHA1のコミットにタグを付ける [#l8e698bb]
 git tag tmp_hoge a5f38c9  #ローカルリポジトリでタグを付ける

*** ブランチを削除する [#nf3bd6a0]
 git branch -d    hogehoge          #ローカルリポジトリにあるブランチhogehogeを削除
 git branch -d -r origin/hogehoge   #ローカルリポジトリにあるブランチorigin/hogehogeを削除
 git push origin --delete hogehoge  #リモートリポジトリのブランチhogehogeを削除

*** 差分をみる [#jb466541]
 git diff --cached   #親コミットとステージの差分
 git diff master_20190603 HEAD nameless_pot.c   #master_20190603タグと親コミットとの差分をnameless_pot.cについて表示

*** helpコマンド [#p6a93489]
 git help rev-parse

*** masterをマージする [#j06cf918]
 git merge --no-commit --no-ff master
   #dry-run的なことがされるので確認後、マージをアボートか、コミットする
   #git merge --abort
   #git commit -m "merge branch master into hogehoge"

*** 作業ディレクトリのファイルのうち、追跡対象になっていないファイルを確認 [#rb2aa2be]
 git ls-files -o --exclude-standard
 gitlsfiles.py  #python3環境のみ(~okazaki/util/com内)



//--------------------------------------------------------------------------------

** 練習 [#a117f094]

マシンalliumに作成中のプログラムがあるディレクトリ ~/pracがあるとする。

*** 最初に一度だけする設定をせよ [#ff6268b7]
 git config --global user.name     'john smith' #SPCが含まれるのでクォートした
 git config --global user.email    smith@ivy    #適当でよい
 git config --global core.editor   emacs
 git config --global push.default  simple
 
 git config -l  #設定内容の確認

*** pracディレクトリを版管理するために、ローカルリポジトリを作成し、必要なファイルをステージングし、コミットせよ [#te841363]
 cd ~/prac
 git init
 gitk --all &  #以下のコマンド実行前後で、gitkのメニューからupdateして表示内容がどう変わるかを確認する。
               #また 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回以上)。以下のよく使うコマンドも試せ [#gfe20738]
 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ファイルを作り、不要な出力を抑止する [#f4823343]

作業ディレクトリに追跡対象ではないファイルがあると git statusで出力される。
出力させたくない場合、.gitignoreファイルにファイル名を記載する。
 emacs .gitignore
 *~   #例えば、この2行を
 *.x  #.gitignoreに記載する。
 git add .gitignore
 git commit -m "add .gitignore"


*** ベアリポジトリを作り、pushしてみよ(スキップ) [#q0ee757e]

 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はivy.eit.hirosaki-u.ac.jpなど

*** ベアリポジトリからクローンしてみよ(スキップ) [#v1bc376a]

 cd ~
 mkdir tmp; cd tmp
 git clone ssh://yourname@hostname:/home/yourname/repgit/prac.git prac2

*** クローンしたリポジトリの作業ディレクトリで、ファイルを修正してcommit, pushし、もともとの作業ディレクトリでpullしてみよ(スキップ) [#wbc9e348]

 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はこのあと使わないので削除して構わない。


//--------------------------------------------------------------------------------

* ソースからgitをインストールする例 [#q791e80b]

 ブラウザからダウンロード https://github.com/git/git/archive/master.zip
 $ unzip git-master.zip
 $ cd git-master
 $ autoconf
 $ ./configure --prefix=$HOME/bin
 $ make all      # doc info はめんどいらしいので除く
 $ make install  # install-doc install-html install-info は除く
 # バージョンは、2.2.0.GITだった。
 | git-master/INSTALLには次のように記載あり
 | $ make prefix=$HOME/bin all doc info
 | $ make prefix=$HOME/bin install install-doc install-html install-info
 
 ブラウザからダウンロード https://www.kernel.org/pub/software/scm/git/ の git-manpages-2.2.0.tar.gz
 $ tar xvfz git-manpages-2.2.0.tar.gz  -C $HOME/bin/share/man  # man{1,5,7}に追加される
 MANPATH=$HOME/bin/share/man:$MANPATH を .bashrcに追加する
 
 (補足) zlibが無かった場合には makeできないので、下のようにzlibをインストール後に、
 再度 git-masterディレクトリで ./configure --prefix=$HOME/bin --with-zlib=$HOME/bin
 としてから makeする。
   $ wget http://zlib.net/zlib-1.2.8.tar.gz
   $ md5sum zlib-1.2.8.tar.gz
   $ tar xvfz zlib-1.2.8.tar.gz
   $ cd zlib-1.2.8
   $ ./configure --prefix=$HOME/bin
   $ make
   $ make install


* 練習(しなくてもよい) [#te2e86e9]

** 練習1 [#fbdc80b6]
 
 ivy.eit.hirosaki-u.ac.jpにログインして、"最初に一度だけする設定"をする。
 
 次に、適当なディレクトリで、
 
 $ git clone git://git.kernel.org/pub/scm/git/git.git #作業ディレクトリ名を省略した
 $ cd git
 $ git remote -v
 $ git branch -vv
 $ git status
 $ git log  --oneline --decorate --graph --all
    一画面下にスクロール SPC
    一画面上にスクロール w
    一行上にスクロール   j
    一行下にスクロール   k
    下に検索             /    ⇒ origin/masterという文字列を検索してみる
    上に検索             ?
    次のもの検索         n
    一番下を表示         ESC >
    一番上を表示         ESC <
    終了 q
 
 $ DISPLAY=hogehoge:0 gitk --all    # ssh -Yでログインしている場合、DISPLAY環境変数の設定は不要。
 $ DISPLAY=hogehoge:0 gitk          # hogehogeはウィンドウを表示させるホストのホスト名にする。
 $ DISPLAY=hogehoge:0 gitk --all &
 $ git log   --oneline --decorate --graph --all | tail
 $ git checkout -b mytest e83c51633
 $ git help checkout
 $ git status
 $ git log   --oneline --decorate --graph --all | tail
 $ make  #失敗するので、
 Makefileの
   LIBS= -lssl
 を
   LIBS= -lssl -lcrypto -lz
 に変更して、再度makeする
 $
 $ git status
 $ git add -u
 $ git status
 $ git commit -m "modify Makefile"
 $ git status
 $ git branch -vv
 $ git log   --oneline --decorate --graph --all | head ; echo ... ; \
   git log  --oneline --decorate --graph --all | tail
 また、gitkのメニューから更新を選んで、ログを確認して、終了q。


** 練習2(1のつづき) [#g3a27d3c]
 $ mkdir ../hoge; cd../hoge  #適当なディレクトリを作り、移動する
 $ cp../git/{*.[ch],Makefile,README} .
 $ ls
 Makefile  cache.h    commit-tree.c  read-cache.c  show-diff.c     write-tree.c
 README    cat-file.c init-db.c      read-tree.c   update-cache.c
 $ git init
 $ git add *.[ch] Makefile README
 $ git status
 $ git commit -m "the first commit"
 $ git log   --oneline --decorate --graph --all
 $ git remote -v ; git branch-vv
 
 たとえば、emacsでMakefileをオリジナルのもの(LIBS= -lssl)に戻す。
 $ git diff
 $ git add Makefile
 $ git commit -m "make Makefile the original"
 $ git log   --oneline --decorate --graph --all
 $ git checkout -b testb
 $ git branch -vv
 emacsで MakefileのLIBSを -lssl -lcrypto -lz にする。
 $ git add Makefile
 $ git commit -m "modify Makefile"
 $ git log   --oneline --decorate --graph --all
 $ git branch -vv
 $ git checkout master
 $ git branch -vv
 emacsで MakefileのLIBSを -lssl -lcrypto にする。
 $ git add Makefile
 $ git commit -m "modify Makefile, again"
 $ git log   --oneline --decorate --graph --all


** 遊び(練習1のつづき) [#r1016c37]
 cd ../gitなどで、練習1のディレクトリに移動する。
 最初のgitを動かしてみる。そのままでは実行時にエラーになるようなので、
 read-cache.cの228行目付近のif文をコメントアウトして、makeし直す。
 -               if (size > sizeof(structcache_header))
 +//             if (size > sizeof(structcache_header))
                         map = mmap(NULL, size,PROT_READ, MAP_PRIVATE, fd, 0);
 $ ./init-db  # .dircacheディレクトリが作成される(.git相当)
 $ ./update-cache *.[ch] Makefile README  #update-cacheが git add相当
 $ ./write-tree                           #write-tree,commit-treeが git commit相当
 6ca44177a19e6ca8f2f761b7415a4360d2db6b8e
 $ ./commit-tree 6ca44177a19e6ca8f2f761b7415a4360d2db6b8e <<eof
 the first commit
 eof
 Committing initial tree 6ca44177a19e6ca8f2f761b7415a4360d2db6b8e
 bab38708b02450867071a94a9fce18123597835d
 $ cat `./cat-file bab38708b02450867071a94a9fce18123597835d | sed 's/:.*$//'` #コミットの表示
 tree6ca44177a19e6ca8f2f761b7415a4360d2db6b8e
 author okazaki,isao,,<okazaki@ivy> Fri Jun 23 14:41:39 2017
 committer okazaki,isao,,<okazaki@ivy> Fri Jun 23 14:41:39 2017
 
 the first commit
 
 $ ./read-tree 6ca44177a19e6ca8f2f761b7415a4360d2db6b8e #コミットの内容(ツリー)
 100664 Makefile(dfa152bcc0e5f29d5a2db9a482d7e65660a6fe61)
 100664 README (665025b11ce8fb16fadb7daebf77cb54a2ae39a1)
 100664 cache.h(9e1bee21e17c134a2fb008db62679048fc819528)
 100664 cat-file.c(fd690acc02ef9c06d7c4c3541f69b10ca4b4f8c9)
 100664 commit-tree.c(a4a8c3d9ef0c4cc6c82b96b5d1a91ac6d3bed466)
 100664 init-db.c(0eaa053919e0cc400ab9bc40d9272360117e6978)
 100664 read-cache.c(4d3c01ab27d6745be53d5caf862e5ce4d939961c)
 100664 read-tree.c(ec0f167a6a505659e5af6911c97f465506534c34)
 100664 show-diff.c(00a29c403e751c2a2a61eb24fa2249c8956d1c80)
 100664 update-cache.c(aff074c63ac827801a7d02ff92781365957f1430)
 100664 write-tree.c(7abeeba116b2b251c12ae32c7b38cb048199b574)
 $ ./show-diff
 Makefile: ok
 README: ok
 cache.h: ok
 cat-file.c: ok
 commit-tree.c: ok
 init-db.c: ok
 read-cache.c: ok
 read-tree.c: ok
 show-diff.c: ok
 update-cache.c: ok
 write-tree.c: ok
 
 次に、emacsでread-cache.cの228行目付近にfprintfを追加(追加内容は以下のdiff参照)。
 $ ./show-diff
 Makefile: ok
 README: ok
 cache.h: ok
 cat-file.c: ok
 commit-tree.c: ok
 init-db.c: ok
 read-cache.c:  4d3c01ab27d6745be53d5caf862e5ce4d939961c
 
 --- -   2017-06-23 14:54:17.547672847 +0900
 +++ read-cache.c        2017-06-23 14:53:00.644494732 +0900
 @@ -228,6 +228,8 @@
                 map = NULL;
                 size = st.st_size;
                 errno = EINVAL;
 +fprintf( stderr, "size= %d\n", size );
 +fprintf( stderr,"sizeof = %d\n", sizeof(struct cache_header) );
  //            if (size > sizeof(struct cache_header))
                         map = mmap(NULL, size,PROT_READ, MAP_PRIVATE, fd, 0);
         }
 read-tree.c: ok
 show-diff.c: ok
 update-cache.c: ok
 write-tree.c: ok
 $ ./update-cacheread-cache.c
 $ ./write-tree
 792883deac0a678d1975ddb4acce30ed15010149
 $ ./commit-tree 792883deac0a678d1975ddb4acce30ed15010149 \
              -p bab38708b02450867071a94a9fce18123597835d <<eof
 add fprintf
 eof
 8af70d35558e4226155fdad489654a0ece5ee196
 $ cat `./cat-file 8af70d35558e4226155fdad489654a0ece5ee196 | sed 's/:.*$//'`
 tree 792883deac0a678d1975ddb4acce30ed15010149
 parent bab38708b02450867071a94a9fce18123597835d
 author okazaki,isao,,<okazaki@ivy> Fri Jun 23 15:14:12 2017
 committer okazaki,isao,,<okazaki@ivy> Fri Jun 23 15:14:12 2017
 
 add fprintf
 
 最初のコミットのツリー(6ca44177a19e6ca8f2f761b7415a4360d2db6b8e)の
 read-cache.c(4d3c01ab27d6745be53d5caf862e5ce4d939961c)を取り出し、diffを
 とってみる。
 
 $ ./cat-file 4d3c01ab27d6745be53d5caf862e5ce4d939961c
 temp_git_file_nV0xt4: blob
 $ diff temp_git_file_nV0xt4read-cache.c
 230a231,232
 > fprintf( stderr,"size = %d\n", size );
 > fprintf( stderr,"sizeof = %d\n", sizeof(struct cache_header) );
 
 使い方は次を参考にすると良い。
  "git(1)の最初のコミットをビルドして使ってみた"http://qiita.com/gfx/items/826b5f846e6a960adcff
  "Gitの最初の姿"http://daretoku-unix.blogspot.jp/2015/03/git.html
  "初期のGitコマンドのソースコード"http://tanakahx.github.io/blog/2014/06/08/initial-git-source-code/

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS