$ git diff --check 作業ディレクトリの変更について、空白に関する警告を表示する。 デフォルトでは以下の場合に警告する(core.whitespaceの設定で変更可、詳細はググれ)。 o 行末に空白がある o 空白を含む空行がある o ファイルの末尾に空行がある o タブの次に空白がある
未チェック(試していないが正しいらしい) git push -u origin featureB:featureBee # featureBブランチを、originのfeatureBeeにpushする。 # また -u があるのでfeatureBはfeatureBeeを追跡するように設定する。 git push -u origin featureB:featureB # 同じブランチ名のときは、このように書け、 git push -u origin featureB # このようにも書ける(-uは--set-upstreamの短縮形)
$ git checkout 17004ca detached HEADになる。ソース修正やコンパイルなどが可能である。 $ git commit -a -m 'a commit of the detached head of 17004ca' $ git branch fwd_17004ca b815d77 リポジトリにも変更したブランチをpushするには、 $ git push --set-upstream origin fwd_17004ca なお、その後、他のローカル側でこのブランチを利用するには次のようにする。 $ git fetch $ git checkout --track origin/fwd_17004ca detachして、追加修正した記録を残したいとき、これでOK? $ git commit -m "a commit for debug tests" #とりあえずコミットした $ git branch debug_hoge #ブランチにして、 $ git tag debug_hoge_20230322 #タグを付けて、 $ git push --set-upstream origin debug_hoge #リモートリポジトリにpush $ git push --tags #タグもpush $ git push origin --delete debug_hoge #ブランチを削除(ブランチにしないとpushできないため) $ git checkout master $ git branch -D debug_sotu_ngrid #ブランチを削除 最後の三行は $ git checkout master $ git branch -D -r debug_sotu_ngrid か。
localな設定 git config --local core.quotepath false #.git/configに保存される git config --local --unset core.quotepath #設定を元に戻す globalな設定 git config --global core.quotepath false #~/.gitconfigに保存される git config --global --unset core.quotepath
git diff eaad7c8 254b87b d3087fd #changes when merging git diff -U10 eaad7c8 254b87b d3087fd #changes when merging 違いが出るのはなぜか?
$ git log --oneline --decorate --graph --all --pretty=format:'%C(auto)%x09%h %d %s %C(blue)%cd %an%C(reset)' --date=short %C(色名) 文字の色を指定。autoだと項目により自動で色付けされる。resetは前の状態に戻す。 %x09 タブ %h sha1(ハッシュ値) %d 注釈 %cd 日付。日付のフォーマットは別途 --date=shortで与えている。 %an コミットした人 --date=iso だと "2015-03-21 16:24:43 +0900" となる。他の指定は git help log を見よ。
~/.gitconfig に次のものを入れておくと、git mylog とできる。
[alias] mylog = log --oneline --decorate --graph --all --pretty=format:'%C(auto)%x09%h %d %s %C(blue)%cd %an%C(reset)' --date=short
こちらへ howto/git/forthefirsttime
https://git-scm.com/book/ja/v2
ここからダウンロード(2021/04/15)したPDF版のファイル (ただしそのままでは不具合があるようだったので、macOSのプレビューで開いてから再度PDFで保存し作成した)。 2nd Edition (2014) のファイルです。 なお、旧版はDownloadsメニューにあるらしい。
このPDFは Scott Chacon and Ben Straubにより書かれたものであり、 ライセンスは CC BY-NC-SA 3.0です。
以下は古いもの。
例) git add . # カレント以下のファイル(ディレクトリ含む)をステージに追加する git add ファイル # ファイルをステージに追加する git add -u # 追跡対象のファイルで修正があったものをステージに追加する
例) find . -type d -empty -not -path './.git*' -exec touch {}\/.gitkeep \;
mv 変更前のファイル名 変更後のファイル名 git add 変更前のファイル名 #削除した(無くなった)ことをステージに追加する git add 変更後のファイル名 #gitとしては、削除されて、新しい名前で追加する形の操作となっている または git mv 変更前のファイル名 変更後のファイル名
rm ファイル名 git add ファイル名 #gitとしては、削除したファイル名、無いファイル、を追加する形の操作となっている または git rm ファイル名 削除するファイルが、ステージに載っている場合は --cachedオプションが必要 git rm --cached ファイル名 #ステージから削除し、ファイルを削除し、無いファイルを追加する形
git reset HEAD ファイル名 #ステージのファイルが削除される形
git checkout -- ファイル名 #作業ディレクトリのファイルが、チェックアウト時点に戻される
git reset HEAD ファイル名 #ステージのファイルが削除される形 git checkout -- ファイル名 #作業ディレクトリのファイルが、チェックアウト時点に戻される
ファイルを更新したが、その更新を維持したままにする(git pull等で更新されないようにする) git update-index --skip-worktree ファイル名 # 更新されないように登録する git update-index --no-skip-worktree ファイル名 # 登録を解除する git ls-files -v | grep ^S # skip-worktreeしたファイルを表示する
git ls-files -o #カレントディレクトリ以下で、追跡されていないファイルのリストを表示 git ls-files -o --exclude-standard #git ls-files -o のうち、.gitignoreで無視したファイルを除くリスト
⇒ むずかしいのでほどほどで対応すればよい。
⇒ コミットメッセージは英語でする。日本語は使わないこと。
git config --global user.name "yourname" # 実行すると ~/.gitconfigに保存される git config --global user.email "youremail" # --global無しだとリポジトリ毎の.git/configに保存される git config --global core.editor emacs git config --global push.default simple # simple(デフォルト)、matching(2.0以前のデフォルト) git config --global credential.helper 'cache --timeout=1800' # 数分間だけ認証をキャッシュする。 #httpsのみ?sshだとパスワード無しの鍵を使う?
git commit -m 注釈 # ステージ済みをコミットする git commit -a -m 注釈 # 追跡対象(のみ)をステージして、コミットする
git commit --amend -m 注釈 # 直前のコミットを上書きする(直前のコミットをやり直せる)。 # ただし、push前であること。push後だと mergeが必要となるのでしないこと。
git checkout -- ファイル名 #作業ディレクトリのファイルが、チェックアウト時点に戻される #(ファイルに変更があれば、失われる) git reset HEAD ファイル名 #ステージのファイルが削除される形 #(作業ディレクトリのファイルは、何もされない) git reset --hard #現在のブランチを、チェックアウトの時点まで取り消す #(ファイルに変更があれば、失われる)
git clean -n で確認して、 git clean -f で追跡対象以外(無視するファイルは除く)を削除できる。 なお、 - カレントディレクトリ以下のディレクトリ内も対象にするときは -d を付ける - gitignoreで無視しているファイルも消すときは - xを付ける - 対話的に消したいときは -iを付ける
dry-run的なことをして確認後、マージをコミットする手法 ★お薦め
現在のブランチに、指定のブランチをマージ $ git merge --no-commit --no-ff [リモートリポジトリ/]ブランチ #コミットしない、fast forwardでもコミットしない。 これで、マージされた結果はステージに載るので、 $ git diff --cached で結果を確認できる。コンフリクト(競合)していたらその旨が git merge 時に出るので手動解決する。 そして、 (a) このマージを取り消したければ、git merge --abort をする。 (b) そのままコミットしたければ git commit -m "merge branch hoge1 into hoge2" をする。 又は git merge --abort 後に git merge [リモートリポジトリ/]ブランチ をしてもよい。
git merge [リモートリポジトリ/]ブランチ # 現在のブランチに、指定のブランチをマージする # (コンフリクトした場合は手動で解決する) よくある例) masterブランチを修正して commitした。pushすると、originの masterブランチが変更されて いたため rejectされた。この場合は次のようにする。 $ git fetch $ git merge --no-commit --no-ff origin/master ここでコンフリクトを手動で解消 $ git add 解消したファイル $ git commit -m "merge branch origin/master into master" $ git push
単純なコンフリクトの場合は、ファイルにコンフリクトの内容が、 <<<<<<< HEAD ほげほげ ======= ほげほげ >>>>>>> SHA1 と書き込まれているので、エディタで修正して、保存する。その後、add, commit する。
コンフリクトが出たとき git show :1:ファイル名 > ファイル名.base git show :2:ファイル名 > ファイル名.ours git show :3:ファイル名 > ファイル名.theirs 3つのファイルについて手動で修正し、 git merge-file -p ファイル名.{base,ours,theirs} > ファイル名 #再度マージ? をして、問題無ければ add, commitする。 ファイル名のファイルを、コンフリクトが生じたときのマーカーの入った状態にもどすには git checkout --conflict=diff3 ファイル名
git checkout --conflict=merge ファイル名
(実例)作業領域に更新があり、コミットしていなく、したくないが、リモートリポジトリの更新を pullしたいとき $ git stash $ git pull $ git stash pop # popする(applyして、リストからは削除) で良いらしい。 --skip-worktreeしたファイルがコンフリクトしていた場合は、コンフリクトのためAbortするので、 --no-skip-worktreeしてから git stashする。 git stash [ save [--include-untracked]or?[--all] ["メッセージ(日付を入れると良い)"] ] git stash list git stash apply --index [ stash@{0} ] #auto mergeなどされるようだ。 git stash drop stash@{0} #削除 git stash pop #変更をpopする(リストからは自動で削除される。コンフリクトがあると削除されない) 今の作業ブランチにapplyやpopがされるようだ。 logをみると stashしたものの SHA1がわかるので、ブランチ名をつけて作業してゆくこともできる。
+------>o fixブランチ | ------>o masterブランチ | +------------->o----> 作業ブランチ ~~~~~ 未コミット部分A o 印はコミット ブランチの分岐が上図のようにあり、 作業ディレクトリのブランチに fixブランチをマージするには、 次の(1)-(4)のいずれかの方法でできる。 作業ブランチをコミット済みの状態にしておき、(2)の方法でコミット するのがいちばん素直だろう。 (fixがmasterの進んだコミットであっても同じ) (1) git merge origin/fix これは自動的にコミットされる。 たぶんA部分があればエラーとなる? もしくは、A部分もコミットされる? fixに関係 するファイルだけか? コンフリクトしたら作業ディレクトリのファイルにその内容が入る。 (2) git merge --no-commit --no-ff origin/fix 自動的にコミットしない。 コンフリクトしたら作業ディレクトリのファイルにその内容が入る。 確認後、 git merge --abort で取り消すか(取り消してから(1)でマージしてもよい)、または、 コンフリクトがあれば修正して(無ければそのままで)、 git commit -m "hogehoge" する。 (なお、コミットする前にはコミットするファイルを取捨選択もできる)。 (3) git cherry-pick SHA1 fixのコミットのSHA1をマージする。master--->fixの間に複数のコミット があれば順に全てに対してこのコマンドでマージする。 たぶんコンフリクトしたら作業ディレクトリにその内容が入る。 (4) git stash --skip-worktreeしたファイルは無いことが望ましい。 git merge origin/fix をする(または (1)-(3)のいずれかでもよい)。 git stash pop たしか、コンフリクトしたら作業ディレクトリのファイルにその内容が入る。 そして stashは消されずに残る。
・作成方法1(新規作成) cd 作業ディレクトリ git init
・作成方法2(リモートリポジトリのクローン) git clone リモートリポジトリ [作業ディレクトリ] # リモートリポジトリは [ssh://[user@]host.xz[:port]]/path_to_repo.git などのurlで指定する。 # 自動的に、origin という登録名でurlが登録され、リモートブランチ(origin/master)を追跡するブランチ master が作られる。 # 作業ディレクトリを省略すると、リモートリポジトリのディレクトリ名(ディレクトリ名.gitの.gitの前の部分)となる。 # 作業ディレクトリを指定する場合は、既存のディレクトリを使う場合はそれが空ディレクトリでなくてはならない。
・作成方法1 cd ディレクトリ.git # 拡張子を慣習的につける git init --bare
git add ファイル git remote add origin リモートリポジトリ # リモートリポジトリを登録名originとして、登録する git remote -v ; git branch -vv git commit -m "注釈" git push --set-upstream origin master # --set-upstreamは現在のプランチの追跡先を、origin/masterとする設定を登録する
リモートリポジトリの移動自体は単にまるごとディレクトリを移動するだけである。
これに追従しているリポジトリは git remote set-url origin 新しいリモートリポジトリ をして、登録名の内容を上書き更新する(originを消してから作り直してもよい)。 又は、originを作り直す場合は git remote rm origin # リモートリポジトリの登録名originを削除 git remote add origin リポジトリのURL # URLでリモートリポジトリを登録名originで作成
git remote add リモートリポジトリの登録名 リモートリポジトリのurl git remote rename リモートリポジトリの変更前の登録名 リモートリポジトリの変更後の登録名 git remote rm 削除するリモートリポジトリの登録名
git remote set-url origin 変更後のリポジトリのURL # URLの上書き変更
git remote [-v] # リモートリポジトリの一覧表示
作業ディレクトリやステージは commit,push済であるとする $ git branch nwp # 現在の状態で、ブランチnwpを作成 $ git checkout nwp # ブランチnwpに移動 なお、ここの段階でファイルを変更して add,commitをしても良い。 $ git push --set-upstream origin nwp # リモートリポジトリoriginのブランチnwp(作成される)に pushする。 # nwpは、origin/nwpを追跡するように設定される(オプション # --set-upstreamによる)。
作業ディレクトリやステージは commit,push済であるとする $ git fetch --all --tags $ git checkout --track origin/nwp # リモートリポジトリoriginのブランチnwpを追従するローカルのブランチnwp # を作成し、チェックアウトする。 # git checkout -b nwp origin/nwp でも同じ。
git status [-s] # -sは簡潔表示(非追跡対象のファイルは「?? ファイル名」で表示)
git diff [--] [ファイル] # 作業ディレクトリとステージの比較。ファイルを指定するとそのファイルだけ比較 git diff --cached [--] [ファイル] # ステージとコミット済みの比較。ファイルを指定するとそのファイルだけ比較 # 曖昧さがある場合は、ファイル名の引数の前に -- を付ける。
git diff A B [--] [ファイル] # 差分をみる。AやBは SHA1や、ブランチ、タグなどで指定 git diff A..B [--] [ファイル] # 〃 git diff A...B [--] [ファイル] # AとBとの共通の親と, Bの差分 (例) git diff master..origin/master # リモートリポジトリ(origin/master)との差分をみる # origin/masterの位置は fetchなどで更新されるので、 # しばらく fetchやpullをしていない場合には位置が古い場合も生じうる
git diff A:file1 B:file2 # Aのfile1とBのfile2の比較
git diff -w # ファイル内のスペースの違いを無視、改行コードの違いも無視 git diff -b # ファイル内のスペースの数の違いを無視、改行コードの違いも無視
git diff --name-only # 差分のあったファイルのファイル名だけを表示 git diff --name-status # 差分のあったファイルのファイル名と、変更か追加か削除かも表示 # git status -s と同じ?
git show オブジェクト[:ファイル] # コミットやその内容(ファイル)を表示する。 # オブジェクトは SHA1や、ブランチ、タグなどで指定 # :ファイル 特定のファイルのみ表示
コミットログを表示する git log -5 --oneline --decorate --graph --all [--stat] [-p] [レンジ] [--] [ファイル] # --graphにより図形表示される # --author=パタン でuser.nameの選択ができる # --decorateによりHEADの位置がわかる # -pはソースの差分が出る。 # --statはサマリーが出る。 # -5は 5件だけ表示 git log --grep hogehoge #ログ内容を検索 git log -p -S'hogehoge' file # コミットの中で、fileのhogehogeを含む行が追加or削除された # コミットを検索する。 # -pオプションがあるのでそのコミット時の差分も表示(マージは対象外)。
(その他のオプション) git log --since="50 minutes ago" # 50分前からのログのみ表示 git log --no-merges issue54..origin/master #ログのフィルター記法(レンジで指定している) #origin/masterには含まれるが、issue54には含まれないコミットのログだけを表示 git log contrib --not master # masterに無くcontribブランチにあるコミットのログを表示
git log --cc --all -S"h5py.get_config().default_file_mode = 'a'" misc.py --ccで各コミットのdiff(実際はパッチ)をとる(マージコミットも対象とするために -pでない方がよい) -Sで検索にヒットしたコミットだけ表示する コミットのSHA1やコミットメッセージがわかるので、 git show 287658 や、git log 287658 、 gitkの Find欄にそのメッセージを入れて、コミットを検索表示できる(親や子のSHA1がわかる)
/bin/rm -rf .git a b git init echo foo > a; git add a; git commit -m "add a" git branch other; git checkout other echo bar > b; git add b; git commit -m "add b" git checkout master git merge --no-commit --no-ff other echo bart > a; git add a git commit -m "merge branch other" echo "*** log"; git log -25 --oneline --decorate --graph --all echo "*** log -p"; git log -p echo "*** log --cc"; git log --cc
git blame [-C] -L n,m file # fileに対して、n~m行目の最後のコミットをリストアップする # -Cがあると別の所からのコピーがあれば示してくれる # 行は1から数える。 (どのコミットで追加されたものかを調べる例) $ git blame -C -L 23,23 makefile 1e84d5f5 (okazaki,i 2018-03-19 20:13:09 +0900 23) DOPT = -Ofast
(他) gitに bisectというものもあり(二分探索によるデバッグ支援)。 git log -p -S も見よ。
git blame -C -L 141,153 ファイル名 #ファイル名のファイル 141から153行目を対象に別の所からコピーされたコード片を探す
git grep --heading --line-number -3 'readGrid' # ファイル名を先頭に、行番号を行頭に、検索文字列の前後各3行、をマッチしたもの # について表示する git grep -w 文字列 # 単語境界での検索 -F # 正規表現を利用しない -l # マッチしたファイル名だけ表示 # 作業領域で追跡対象のファイルを対象に検索が行われる。 $ git grep -l 文字列 | xargs sed -i '' -e 's/文字列/置換文字列/g' # なお、-iが空でなければその拡張子でバックアップが作られるらしい。 git rev-list {--all|ブランチ名} | xargs git grep '文字列' #すべてのブランチか、指定したブランチについて、検索が行われる。
git grep 文字列 [タグ|SHA1] # 該当プロジェクトで文字列検索
git rev-list --all | xargs git grep --heading --line-number -10 'rs+1'
git branch -a #ローカルにある◯/◯のリモートブランチと、ローカルリポジトリのブランチをすべて表示 git branch ブランチ # ブランチを作成 git branch -vv # ブランチを表示 git branch -m 古いブランチ名 新しいブランチ名 #ブランチ名を変更する git branch -m 新しいブランチ名 #現在のブランチ名を変更する git branch -d ブランチ # ブランチを削除(ローカルのブランチ)
リモートリポジトリのブランチを削除し、ローカルのブランチも削除する git push origin --delete nwp2 または git push origin :nwp2 または git push origin :refs/heads/nwp2 次に、git fetch する(ローカルにあるその◯/◯のリモートブランチも自動で削除される)。 (備考) ・pullやcloneされた別のリポジトリでは、その人が消さない限りそのまま残る。消されたリモートブランチを もつその人は、pushするとリモートリポジトリのブランチは再度作られる。 ・detached branch(ブランチ名の付いていないブランチのようなもの)は、git logには出てこない。リポジトリに 残っていると思うが、どのように検索できるのか? ローカルにある◯/◯のリモートブランチを削除する(あまり使わないだろう) git branch -d -r originfuji/masterfuji #-dの代わりに -Dとするとマージしていなくても削除する (リモートにあるそのリモートブランチが削除されていなければ、fetchすると再度、〇/〇は作成される)
git branch --merged # 現在作業中のブランチにマージされたブランチのリストを表示 git branch --no-merged # 現在作業中のブランチにマージされていないブランチのリストを表示
git branch ブランチ1 リモートリポジトリ/ブランチ2 # リモートリポジトリ/ブランチ2を追跡 # するブランチ1を作る git branch --set-upstream=リモートリポジトリ/ブランチ2 ブランチ1 # リモートリポジトリのブランチ2を追跡 # するようにブランチ1を設定する --set-upstream の省略形は -u である。
git branch -d -r origin/hoge #ローカルのorigin/hogeを消す git branch -d hoge #ローカルのhogeを消す git push origin --delete hoge #リモートoriginのhogeを消す
git fetch --all # 登録されている全てのリモートリポジトリから最新情報を取得する git fetch --tags # リモートリポジトリにあるタグも取得する git fetch [リモートリポジトリ] [ブランチ] # リモートリポジトリから最新情報を取得する
git pull [リモートリポジトリ] # fetchし、mergeする(pull=fetch+mergeに相当)
git push [リモートリポジトリ] [ブランチ] [--tags] # 競合が発生した場合は pushはできない(pullして競合解決してから pushする)。 # --tagsはタグもプッシュする
git tag # すべてのタグを表示 git tag [-a] タグ [SHA1ハッシュ] [-m 注釈] # タグを付ける(-aと-mで1行の注釈を入れれる。-aのみは注釈を入れるために # エディタが立ち上がる) # -sオプションで署名もできるらしい(詳しくは https://git-scm.com/book/ja/v2 の5章) git tag -d タグ名 #タグ名を削除する git show タグ名 #タグ名の情報を表示 git fetch --tags #リモートリポジトリのタグを取得する
git push --tags #リモートリポジトリに無いタグを、全て送る(タグだけ送る) git push --delete リポジトリ タグ名 #リポジトリ(originなど)のタグ名を削除
git checkout {SHA1|タグ|masterなど} # 指定のものをチェックアウトする。 # ブランチ名(masterなど)ではなく、SHA1(ハッシュ値)を指定した時、detached HEADになるが、 # 普通どおり修正してコミットできる(ブランチ名を新たにつける方が取り扱いやすい)。 # 追跡対象外のファイルなどは、そのまま残される。
git checkout --track リモートリポジトリ/ブランチ # git checkout -b ブランチ リモートリポジトリ/ブランチ と同じ。 # 作成されたブランチはリモートブランチ(追跡ブランチ、上流ブランチ)を追跡するように設定される。
git checkout -b ブランチ {タグ|リモートリポジトリ/ブランチ} # -bで指定するブランチを作成後、移動する。 # タグがあれば、その所にブランチを作る(ただしコミットするとブランチは進む。タグは動かない)。
gitk # GUIツール
git help コマンド名
git diff差分はそのままでパッチファイルになっている。 また、パッチファイルを使って、リダイレクションでパッチをあてることが出来る。 patch [--dry-run] -p1 < パッチファイル #パッチファイルをあてる場合 #--dry-runは何が行われるかを表示するだけ。
git config [--global] -l # .git/configを表示 git config [--global] -e # .git/configを編集
HEAD # 現在作業中のローカルブランチを示す
git archive master --prefix='project/' --format-zip > git_master.zip
git shortlog --no-merges master --not hogehoge #masterブランチに対してタグhogehogeからのコミットログを出力する
tagを消すとき git push origin :refs/tags/タグ名 branchを消すとき git push origin :refs/heads/ブランチ名
まず、ブラウザで名前を付けてリポジトリを作る。 ここへのpushの仕方が表示されるので、ローカルに作っておいたリポジトリをpushする。
$ git push (gnome-ssh-askpass:hogehoge): Gtk-WARNING **: cannot open display: error: unable to read askpass response from '/usr/libexec/openssh/gnome-ssh-askpass' Username for 'https://github.com': などと、表示される場合の対応。 - 無視して、つづけて問題無い。 (GUI環境で無いために、パスワードキャッシュがうまく動かなかったらしい) - unset SSH_ASKPASS をすると表示されなくなる。