#author("2025-10-27T00:00:41+00:00","","")
#contents
** 基本 [#k9cfa7ab]
- 3段構成(repo - index - working_tree)
- index に git add で登録することを staging すると呼び
- working_tree の親になっている commit を HEAD と呼ぶ
-&ref(git_commit_workflow.jpg);

- git diff は通常は working_tree と index の差分 
-&ref(git_diff_reset.jpg);

** 前提 [#cddba28f]
- シングルユーザー、 マルチユース
-- ssh により多拠点リモートユース
-- 複数のマシンで、別々の場所からから接続する
-- gitweb を利用する
- 文書ファイル (tex など) の来歴管理を行なう
- サーバー設定情報の管理も行なう
- 基本的に ubuntu の標準に従う (ファイルの置き場所など)

** 設定 [#w097626d]
- server account
-- user = git
-- pass = gituser
-- home = /mnt/raid_vol/home/git
-- shell = /usr/bin/git-shell (git 操作専用、通常ログインはできない)
- リモートリポジトリ   = ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/git/repos 下

- 公開鍵がサーバーに登録されている場合 = git clone ssh://MYTHEN/mnt/raid_vol/home/git/repos/(repo_name)

- クライアントの ~/.ssh/config 設定 
 munakata@muna-E420:~/latex$ cat ~/.ssh/config
 Host MYTHEN
 	HostName		mythen.hmuna.com
 	Port			8823
 	IdentityFile	        ~/.ssh/muna_E420
 	User			git
- gitweb URL = wiki.hmuna.com/gitweb


** 運用 [#ka15a661]

*** ローカルリポジトリの作成 [#qf298eec]
- git init
- git add
- git commit -am "comments"

*** リモートリポジトリの作成 [#kbbf46eb]
- git init --bare --shared

*** ローカルの内容をリモートに反映 [#occ7813e]
- git remote add [local_repo 名 (origin)] ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/git/repos/REPO_NAME
- git push [ git remote add で指定したリモートリポジトリ名 (origin)] main
-- origin はリモートリポジトリ(=デフォルトではクローンした元のリポジトリ)を指しています。
-- origin main で クローン元の main ブランチにプッシュするといった意味になります。


*** ローカルに git を導入 [#z9224fe0]
- 共通環境の設定
 munakata@muna-E420:~/beamer/keio2012$ git config --global user.email public_mail@hmuna.com
 munakata@muna-E420:~/beamer/keio2012$ git config --global user.name "hisao munakata"
- git local repo の設定と、変更のローカルコミット
 munakata@muna-E420:~/beamer/keio2012$ git init
 Reinitialized existing Git repository in /home/munakata/beamer/keio2012/.git/
 
 munakata@muna-E420:~/beamer/keio2012$ git add *

*** ローカルとリモートの repo の関係付け ( git remote add ) [#o0dadf44]
- git remote add [ローカルブランチ名] [リモートブランチ]
-- この場合、リモートブランチの &color(red){同じ名前のブランチ}; に紐付かれる
-- なので、基本ローカルブランチ名を push 先のブランチ名に合わせるのが無難である
- git remote add [ローカルブランチ名] [リモートブランチ]:[リモード上のブランチ名]
-- このように明示的にリモート側のブランチ名を指定することも可能である。
-- が、繰り返しになるが、&color(red){もしリモート側のブランチ名指定を忘れ、上書きしてはいけない同名のブランチがあると事故になる}; ので注意
// munakata@muna-E420:~/beamer/keio2012$ git remote add origin ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/git/repos/XXX

 $ git remote add origin ssh://munakata@kgb2.hmuna.com:8722/raid_vol/home/git/repos/XXXX

~''/.ssh/config に KGB2 アクセス設定(公開鍵登録)をしておけば、以下の記述にすることで &color(red){パスワード無しで push/pull ができる}; ようになる''
 
 $ git remote add origin KGB2:/raid_vol/home/git/repos/XXXX

-- config の書き方例
 munakata@Magus-HiraWin:~/latex/sdvx2509$ cat ~/.ssh/config
 Host KGB2
     HostName        kgb2.hmuna.com
     Port            8722
     IdentityFile    ~/.ssh/id_maguhira
     User            munakata

//- 上記で e420 はローカル repo を区別するための名前付け、git push で利用する
//- 下記の例では repo 自体は master → master の対応である

*** remote ブランチとの関係付けを確認( git remote -v) [#y1fcd6b4]
 [local] munakata:~/latex/LFS301-JP$ git remote -v
 github	https://github.com/hmunak/LFS301-JP-local.git (fetch)
 github	https://github.com/hmunak/LFS301-JP-local.git (push)
 hmuna	ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/git/repos/LFS301-JP (fetch)
 hmuna	ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/git/repos/LFS301-JP (push)
 origin	ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/git/repos/LFS301-JP (fetch)
 origin	ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/git/repos/LFS301-JP (push)

*** ブランチ名を指定してリモートブランチを取得(clone -b リモートブランチ名) [#q628a833]
− git clone -b ブランチ名 https://リポジトリのアドレス

*** ブランチ名の確認( git branch -a) [#ke41e63d]
- 何もオプションを付けないと、現在のブランチ名が表示される
- -a を付加すると、全てのブランチ名が見える
 [local] munakata:~/latex/LFS301-JP$ git branch
 * main
 
 [local] munakata:~/latex/LFS301-JP$ git branch -a
 * main
   remotes/github/main
   remotes/hmuna/main
   remotes/hmuna/master
   remotes/origin/HEAD -> origin/master
   remotes/origin/master

*** ローカルブランチ名の変更( git branch -m ) [#qcbf0856]
- git branch -m [変更後のブランチ名]
-- 現在のブランチ名を変更
- git branch -m [変更したいブランチ名] [変更後のブランチ名]
-- 明示的の変更対象のブランチ名を指定することもできる

*** ローカルブランチの削除( git branch -d ) [#xdbd6eee]
- git branch -d [ブランチ名]

*** リモートブランチの削除 [#qf9ae8a8]
- git push [ローカルブランチ](空白):[削除するリモートブランチ名]
-- 空白を push することで、リモートブランチを削除する

*** リモートブランチの最新状況(削除など)をローカル側に反映する [#waf2e0d6]
- git fetch --prune (git fetch -p)

*** リモートブランチ名を変更した時の、ローカルブランチの対応付け [#k2795d35]
 git branch -m main japanese-wip
 git fetch origin
 git branch -u origin/japanese-wip japanese-wip
 git remote set-head origin -a

*** ローカルブランチ (=master) のトラッキング先を明示的に指定 [#z5832fc8]
- 通常は git clone した時点で origin/master としてトラッキング先リポジトリーが設定されるが
- git pull した時にトラッキング先のブランチが指定されていない... と表示された場合には、以下で再設定できる
- コンソールで git clone したコードを vscode 上の git view 経由で操作した場合にこの問題が発生した

 git branch --set-upstream-to=origin/master master

- 以下のように [master] と [origin/master] が並んでいる状態ならトラッキング情報が正しく設定されている
- &ref(originmaster.jpg);

*** ローカルブランチがトラッキングブランチであるかどうか確認 [#z05088bc]
- japanese-wip2 がリモート origin のローカルブランチ japanese のトラッキングブランチであるか
 [local] munakata:~/latex/LFS301-JP$ git status -sb
 ## japanese-wip2...origin/japanese [ahead 2]


*** ローカルがブランチが追跡しているリモートブランチの確認 [#l6eefcb9]
 [local] munakata:~/latex/LFS301-JP$ git branch -vv
 * japanese-wip2 09f7ec1 [origin/japanese: ahead 2] Mint Linux -> Linux Mint, fix missing correction
- ブランチ名 コミット番号 [追跡ブランチ名] コミットメッセージ

*** 追跡するリモートブランチの設定 [#a0d6ef36]
 git push -u origin [ブランチ名]

*** インデックス、 ワーキングツリー、 HEAD の関係の変化 [#q277bfa6]
- &ref(initial.jpg);

- &ref(file_edit.jpg);

- &ref(git_add.jpg);

- &ref(git_add_and_edit.jpg);

*** デフォルトのブランチ名の指定( master を main などに変更する) [#wd941f0b]
 git config --global init.defaultBranch main

*** detached HEAD [#q5216d52]
- HEAD がブランチではなく commit ID を直接指している状況(= ブランチが無い特殊な状況)
- 解決するには git branch でブランチを作ればよい
 [local] munakata:~/latex/LFS301$ git branch
 * (HEAD detached at 313786d)
   japanese
 [local] munakata:~/latex/LFS301$ git branch master
 [local] munakata:~/latex/LFS301$ git checkout master
 M	Makefile
 Switched to branch 'master'
 [local] munakata:~/latex/LFS301$ git branch
   japanese
 * master

*** git add -p [#o1d268fc]
- -p を付けると変更箇所ごとに commit の対象にするか確認してくれる。
- 沢山の変更をした時に、論理的に関連のないものを別の commit にする(← 非常に重要)のを助ける

*** git add する前(=ステージングしていない状態)で変更を取り消す [#uafa1520]
- git checkout HEAD .

*** git add (=ステージング)の取り消し (2回目以降のステージングの取り消し) [#xe168e94]
- git reset HEAD (file_name)

*** git commit [#y0b122d4]
- 一行目に変更の概略 → パッチを送る時のメールタイトルになる。
- 二行目は空行
- 三行目以降に詳細な説明を書く

*** git commit <path> [#t299184a]
- git commit に引数でファイル名を渡すと、明示的に指定されたファイルだけがcommit 対象になる

*** git commit(但し、push 前)の取り消し(コミットの取り消しのみ、変更内容は保持) [#u6af28b4]
- git reset --soft HEAD^

*** git commit(但し、push 前)の取り消し(コミットと変更自体の取り消しを同時に行う) [#l6bbf7be]
- git reset --hard HEAD^

*** git rebase -i で過去数回分のコミットをまとめる [#r33d2329]
- git rebase -i HEAD~~~~ (~ の数のコミットをまとめる)
- git rebase -i HEAD~4

 pick 29e1651 evaluate model updated, still in struggle
 pick 35d15a4 temporaly save (no major change)
 pick 356c295 removed unused view (preffered flag)
 pick b81062d removed build-in command (vman_entry.py)
 
 # Rebase ca395bd..b81062d onto ca395bd (4 commands)
 #
 # Commands:
 # p, pick = use commit
 # r, reword = use commit, but edit the commit message
 # e, edit = use commit, but stop for amending
 # s, squash = use commit, but meld into previous commit
 # f, fixup = like "squash", but discard this commit's log message
 # x, exec = run command (the rest of the line) using shell
 # d, drop = remove commit
 #

pick を s (squash) に書き換えるとコミットが前のコミットにマージされる

***  git diff と git diff HEAD と git diff --cached の違い [#i83644a6]
- &color(red){以下の図は [[murankの日記 というサイトから引用:http://d.hatena.ne.jp/murank/20110327/1301224770]]};

- git diff は working_tree と index の差 (git add 後に加えた差分が表示される)
- &ref(git-diff.jpg);

- git diff --cached は index と 最新の commit の差
- &ref(git-diff-c.jpg);

- git diff HEAD は working_tree と 最新の commit との差 (git add したが commit していないものが含まれる)
- &ref(git-diff-h.jpg);

- git diff HEAD~..HEAD は複数のコミット間の差
- &ref(git-diff-hh.jpg);

*** git diff --stat [#l0a9cb3c]
- ファイル単位で変更(削除、追加)の量を概算表示する(パッチの素性を確認する等に使う)

 [local] munakata:~/source/perl/nana2tex$ git diff eada 8435 --stat
  Makefile    |  6 ++++--
  nana2tex.pl | 78 +++++++++++++++++++++++++++++++-----------------------------------------------
  2 files changed, 35 insertions(+), 49 deletions(-)

*** git reset[#w48267b9]
- HEAD の位置を変更するコマンド。
- オプション (影響度の小さい順に --soft、--mixed(オプションなしと同等)、--hard) によってインデックス、ワーキングツリーの内容も変更できる。
-- soft = HEAD の位置のみを変更する。インデックス、ワーキングツリーには影響なし。
-- mixed (またはオプションなし) = HEAD の位置とインデックスを変更する。ワーキングツリーには影響なし。
-- hard = HEADの位置、インデックス、ワーキングツリーをすべて変更する。

- git reset --soft HEAD^
- &ref(reset_soft_head1.jpg);

- git reset HEAD
- &ref(reset_hed.jpg);

- git reset HEAD^
- &ref(reset_head1.jpg);

- git reset --hard
- &ref(reset_hard_head.jpg);

- git reset --hard HEAD^  
- &ref(reset_hard_head1.jpg);

- git reset --hard HEAD(HEAD^ ではなく) は 最新の commit(=HEAD)以降のすべての working_tree の変更を取り消す

*** git pull でコンフリクトした時の対応 [#u6a2424c]
Your local change would be overwritten by merge. Commit, stash or revert to proceed と言われたら

- git stash でローカルの変更を一時退避
 git stash save -u
 git stash list
 git pull
 git stash pop <------ 自動マージを試みる、コンフリクトしたら手修正
 git drop <---- stash したファイルの削除

*** ローカルの master を、強制的にリモートの master に合わせる [#ha280b1c]
 // 1) リモートの最新を取ってきておいて・・
 $ git fetch origin master
 
 // 2) ローカルのmasterを、リモート追跡のmasterに強制的に合わせる!
 $ git reset --hard origin/master

*** git commit --amend : 直前のコミットのやり直し [#fbaaa9ac]
- 以下の操作と等価 (一行で完結する)
-- git reset HEAD^
-- ファイルの再編集
-- git add (file)
-- git commit -a -m "新しいコミットメッセージ"
- コミットメッセージの書き換えだけにも利用できる

*** git reset <path> [#wa06e001]
- git reset にファイル名を指定すると、明示的に指定されたファイルだけが

*** git revert [#o23b0f27]
- git revert は 過去のコミットを取り消す

*** git fetch [#bd000030]
- git pull = git fetch + git merge
- fetch はローカルマシン上のオリジン情報(= origin/master) を更新する。が、ソースは変更しない

*** git log [#zc13fb77]
- git log --pretty=oneline : 一行で表示オプション	出力される内容
- git log --pretty=format: (option) で色々な表示にできる
 git log --pretty=format:"%h - %an, %ar : %s"
 ca82a6d - Scott Chacon, 11 months ago : changed the version number
 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
 a11bef0 - Scott Chacon, 11 months ago : first commit
-- format の書き方
|%H|	コミットのハッシュ|
|%h|	コミットのハッシュ (短縮版)|
|%T|	ツリーのハッシュ|
|%t|	ツリーのハッシュ (短縮版)|
|%P|	親のハッシュ|
|%p|	親のハッシュ (短縮版)|
|%an|	Author の名前|
|%ae|	Author のメールアドレス|
|%ad|	Author の日付 (--date= オプションに従った形式)|
|%ar|	Author の相対日付|
|%cn|	Committer の名前|
|%ce|	Committer のメールアドレス|
|%cd|	Committer の日付|
|%cr|	Committer の相対日付|
|%s|	件名|

*** git log でサマリーを表示させるスクリプト(gitlog) [#j97ffb23]
- alias gitlog='git log  --pretty="%h %ad: %s" --date=short'

*** git push ローカル上の変更をリモートに反映 [#jccfaea5]
 munakata@muna-E420:~/beamer/keio2012$ git push e420 master
 munakata@mythen.hmuna.com's password: 
 Counting objects: 5, done.
 Delta compression using up to 4 threads.
 Compressing objects: 100% (3/3), done.
 Writing objects: 100% (3/3), 337 bytes, done.
 Total 3 (delta 2), reused 0 (delta 0)
 To ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/munakata/repos/keio2012
    462fe87..7a936a0  master -> master

*** 既にあるブランチへの切り替え [#d8f67457]
- git checkout ブランチ名

*** git ブランチを作成して、そのブランチに移動 [#qf876a04]
- git checkout -b ブランチ名

これは以下の2つをまとめて実行したことになる
- git branch ブランチ名
- git checkout ブランチ名

*** git ブランチをプッシュ [#d69832d3]
- git push origin [branch 名]

*** git ブランチの削除 [#z33851e0]
- git branch -d ブランチ名

*** git の管理対象から外す [#yaf510d3]
- .git と同じディレクトリーに .gitignore というファイルを作成し追跡させないファイルの 拡張子やディレクトリを列挙する。
- git はリカーシブに検索するのでファイル拡張子を指定する場合にディレクトリー名を指定する必要はない
- &color(red){注意:一度 git の追跡対象となったファイルは .gitignore に定義しても管理対象外にならない。 次項のキャッシュの削除が必要};

*** git の管理対象から外す2(.gitignore に追加登録する場合には必須) [#a13afdf9]
- 特定のファイルを対象外にする場合
 git rm --cached [ファイル名]
- 一括してキャッシュを削除する場合
 git rm -r --cached .

*** git gc [#o6ce1490]
- レポジトリの最適化(未使用オブジェクトの削除、圧縮)

*** 過去のリビジョンからファイルを復元 (abc123リビジョンにあるhoge.txtを持ってきたいとする) [#u424a87a]
 git checkout -f abc123 hoge.txt

*** [[git tag:http://blog.s21g.com/articles/1359]] [#z6330d14]
- git tag -a <タグ名> -m "メッセージ"
- git push --tags 

- git checkout -b 1.6 refs/tags/v1.6 (tag を指定してブランチにチェックアウト)

*** [[tag を削除 (付け直す):http://qiita.com/cutmail/items/1383d9f864703482c277]] [#o14759f0]

- git tag -d TAG_NAME (まずローカルのタグを削除)
- git push origin :refs/tags/TAG_NAME (リモートのタグを空のタグで上書きする形で削除)

*** git diff [#t0b42d1a]
- git diff --word-diff=color
-- 単語ベースのdiff
-- 行の中の一部だけが変更されてるのをみたりするのに便利
-- color を指定すると色の変化でdiffがわかって良い

-git diff --ignore-space-at-eol
-- 末尾空白の変更を無視する
-- なんかのついでに末尾スペース削りまくってるみたいな変更に対して便利

- git diff -b
-- 空白の変更を無視する
-- このへん多分インデントかわっただけだよね.. て心配なときに確認するのに便利

*** git send-email [#w54c988c]
- apt-get install git-email
- git format-patch HEAD^ (file_name)
- git send-email (file_name)

*** マージされたPR元のブランチを自動的に削除する [#zb29ca14]
- https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-the-automatic-deletion-of-branches

*** 日本語のファイル名などを表示させる [#b2fc2dc4]
- git config --global core.quotepath false

- [[git document:https://git-scm.com/docs/git-config]]
 core.quotePath
 Commands that output paths (e.g. ls-files, diff), will quote "unusual" characters in the pathname
 by enclosing the pathname in double-quotes and escaping those characters with backslashes in the
 same way C escapes control characters (e.g. \t for TAB, \n for LF, \\ for backslash) or bytes
 with values larger than 0x80 (e.g. octal \302\265 for "micro" in UTF-8). If this variable is set
 to false, bytes higher than 0x80 are not considered "unusual" any more. Double-quotes, backslash
 and control characters are always escaped regardless of the setting of this variable.
 A simple space character is not considered "unusual". Many commands can output pathnames completely
 verbatim using the -z option. The default value is true.


*** [[git credential helperを使って &color(red){HTTP越しで}; 認証がかかっているリポジトリにアクセスする:http://mistymagich.wordpress.com/2013/10/07/git-credential-helper%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6http%E8%B6%8A%E3%81%97%E3%81%A7%E8%AA%8D%E8%A8%BC%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AA%E3%83%9D%E3%82%B8/]] [#d5ccfcf3]
- &color(red){HTTP は基本的に読み込み専用のリポジトリーに使う。 以下の方法は ssh 接続では使えない};
- git config --global credential.helper store
- cloneが終わると、$HOME/.git-credentialsというファイルが生成される。
- 中身はリポジトリホスト名とユーザ名・パスワードが平文で保存されている。
- git config --global credential.helper cache

*** [[SSH 接続でパスワードなしにするには公開鍵をサーバーに登録する:http://d.hatena.ne.jp/end0tknr/20081213/1229168575]] [#re895baf]
- クライントで ssh-keygen を実行、パスフレーズは無しで生成する。
− サーバーの ~/.ssh に
 cat (クライアントの公開鍵)>> ~/.ssh/authorized_keys
 chmod 600 ~/.ssh/authorized_keys
- クライアントの ~/.ssh/config に
 munakata@muna-E420:~/latex$ cat ~/.ssh/config
 Host MYTHEN
 	HostName		mythen.hmuna.com
 	Port			8823
 	IdentityFile	        ~/.ssh/muna_E420 (公開鍵)
	User			munakata
- クライアントのシェルに鍵を登録
 $ ssh-agent bash
 $ ssh-add ~/.ssh/(秘密鍵)

&color(red){注:gitサーバーの .ssh のディレクトリーのパーミションが 700 でないと、git push 時に git ユーザーのパスワードを聞かれる(が、git アカウントには対話ログインを許可していないので正しいパスワードを入れても push できない。)};

** [[git 環境変数の設定:http://transitive.info/article/git/command/config/]] [#qea182f9]
 munakata@mythen:~/My_presentations/als2013JP$ git config -l
 color.ui=auto
 user.name=hisao munakata
 user.email=public_mail@hmuna.com
 core.quotepath=false
 core.repositoryformatversion=0
 core.filemode=true
 core.bare=false
 core.logallrefupdates=true
 remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
 remote.origin.url=ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/munakata/repos/als2013JP
 branch.master.remote=origin
 branch.master.merge=refs/heads/master
 remote.mythen.url=ssh://munakata@mythen.hmuna.com:8823/mnt/raid_vol/home/munakata/repos/als2013JP
 remote.mythen.fetch=+refs/heads/*:refs/remotes/mythen/*

** [[認証情報の登録(git credential):https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98]] [#c7544070]

 munakata@muna-U2404:~/latex/honda2024$ git config --global credential.helper cache
 
 munakata@muna-U2404:~/latex/honda2024$ git config --global credential.helper store
  
 munakata@muna-U2404:~/latex/honda2024$ git credential fill
 protocol=https
 host=kgb2.hmuna.com:8722
 username=munakata
 password=!freedman7785

- https://blog.fieldnotes.jp/entry/git-credential-manager

** [[git 公式サイトマニュアル(日本語):http://git-scm.com/book/ja/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B]] [#vfc5a4c0]

** [[逆引き git:http://www.backlog.jp/git-guide/reference/]] [#e48832d6]

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