| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
11,767 バイト追加 、 2023年1月29日 (日) 02:56
| [[Subversion]] |
==[[Git]]==
*以下の本からメモ以下の本からメモなど 
{{amazon|427406767X}}
 
{{amazon|B01AIB438A}}
*[[Git インストール]]
==設定==
*https://note.nkmk.me/git-config-setting/
*レベルが大きい順に適用
{|class="wikitable"
!種類
!範囲
!場所
!レベル
|-
|system
|システム全体
|/etc/gitconfig
|1
|-
|global
|該当ユーザー全リポジトリ
|~/.gitconfig
|2
|-
|local
|該当リポジトリ
|[repository]/.git/config
|3
|-
|}
===確認(config) ===
====基本====
$git config --global --list
====ユーザーインターフェースの色====
$git config --global color.ui "auto"
 ===設定(config)===*確認 $git config --list*変更
$git config --global user.name "Hiroto Yagi"
$git config --global user.email "pppiroto@gmail.com"
===*編集===
$git config --global --edit
 ===ヘルプ(help)===
$git help
$git help コマンド
 
==GUI==
===gitk===
----
*[http://futurismo.biz/archives/824 Cygwinでgitkが使えないときの対策メモ]
*gitk はグラフィカルな履歴ビューア。 git log や git grep をパワフルなGUIシェルから使えるようにしたようなもの。 過去に何が起こったかを検索したり、プロジェクトの歴史を視覚化しようとしているときに使う。
[[File:0552_gitk.jpg]]
===git-gui===
----
*git-gui は主にコミットを作成するためのツール
*左側はインデックスです。ステージされていない変更が上に、ステージされた変更が下に表示
$ git gui
[[File:0551_git_gui.jpg]]
 
===GitKraken===
----
*[https://www.gitkraken.com/ GitKraken]
 
===Github Desktop===
----
*[https://desktop.github.com/ Github Desktop]
 
===Sourcetree===
----
*[https://www.atlassian.com/ja/software/sourcetree Sourcetree]
 
==プロジェクトの作成==
===プロジェクトコードが保存される3つの場所===
作業ツリー -- add --> インデックス -- commit --> ローカルリポジトリ -- push --> リモートリポジトリ====作業ツリー ====#作業ツリー : 直接ファイルを編集#====インデックス(ステージングエリア) : ====#作業ツリーとリポジトリとの間のバッファ#リポジトリコミット前に一時的に登録しておき、コミットによりリポジトリに格納される#ステージを設けることにより、関連性の強い変更のみをコミットできるようになる
作業ツリー -- add --> インデックス -- commit --> ローカルリポジトリ -- push --> リモートリポジトリ====リポジトリ==== ===リポジトリの作成(init) ===
*[[Git]]のリポジトリは、作業ツリーと同じ場所の.gitディレクトリの中
$mkdir mysite
$cd mysite
$git init
====リモートリポジトリの作成====*作業ファイルがなく、管理ファイルのみのリポジトリの場合作業ファイル、ワーキングディレクトリがなく、管理ファイルのみのリポジトリ
$git init --bare hoge
 
===変更を加える===
*リポジトリに追加====ステージングエリアへ追加し、コミット対象とする (add)====
$git add hoge.txt
*サブディレクトリを含めたすべてを登録
$git add .
*コミット
$git commit -m "Comment for this commit"
*gitが変更を把握しているすべてをコミット
$git commit -a
====add====
*gitがコミットのための追加・変更をステージする
*対話形式に対象を選ぶ
*4.まだ追跡していないファイルをステージする
*5.コミットする変更箇所を指定する
 ====コミット (commit) ==== $git commit -m "Comment for this commit"*gitが変更を把握しているすべて(追加以外、ステージングとワークディレクトリの差分)をコミット $git commit -a*-mは、一行コミットコメント。省略すると詳細コメント**1行目:コミット内容の要約**2行目:空行(区切りとみなす)**3行目:詳細の説明=====直前のコミットを修正 (amend)=====*add してコミットすると、直前のコミットに追加される* --no-edit でコミットメッセージの変更をせずに実行*以下のコマンドのみ実行するとコミットコメントのみを修正できる $ git commit --amend ====変更・移動 (mv)====
*ファイル名の変更やファイルの移動
git mv 元ファイル名 後ファイル名
<blockquote>mvは、新しいファイルに対する、add と古いファイルに対する rm を自動で行う</blockquote>
 ====ファイルを無視する=========(.gitignore=)====
*.gitignoreファイルに設定を書き足す
*ワイルドカードが使用可能
*通常のファイルで構成管理対象のため共有されてしまう
*複数にマッチする場合、最後にマッチしたパターン*[http://help.github.com/ignore-files/ Github]*[https://github.com/github/gitignore テンプレート]=====基本ルール=====* # 始まりはコメント* ! 始まりは該当しないものを表す* / で終わる場合、ディレクトリのみ* / で始まる場合、リポジトリルート=====簡易正規表現(globパターン)が使用可能=====* * は複数文字にマッチ* [a,b,c] は括弧内の任意の文字、左記なら、a,b,c* [0-9] は文字の範囲* ** ネストされたディレクトリにマッチ** a/**/z なら、a/z, a/b/z, a/b/c/z などにマッチ ======.git/info/exclude======
*.git/info/excludeに記述する方法もある。
*他のユーザとは共有されない。
https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff
======特定の拡張子を無視する======
*.exe
 ======特定のフォルダの中身全てを無視する======
bin/
======特定のパターンを無視しない======
!bin/hoge.exe
======フォルダ内の特定拡張子を無視======
package/**/*.class
======隠しフォルダを無視するが、.gitignoreファイルは無視しない======
<pre>
.*
!/.gitignore
</pre>
  ===変更の確認=======現在の状況を確認(status) ====
$git status
====差分の確認(diff) ====----*https://qiita.com/shibukk/items/8c9362a5bd399b9c56be
=====作業ツリーの変更を表示=====
----
*パラメータなし
$git diff
=====ステージングとリポジトリとの差分表示=====
----
$git diff --cached
=====ステージング含め作業ツリーのすべてをリポジトリと比較=====
----
$git diff HEAD
&lt;blockquote&gt;HEADは現在作業しているブランチの直前のコミットを表すキーワード&lt;/blockquote&gt;
 ====コミット同士====----<pre> $ git diff 変更前SHA..変更後SHA</pre> ===コミットログの確認(log)========コミットの履歴を見る(log)=====
$git log
 {| class="wikitable"|-! scope="col"| オプション! scope="col"| 内容|-| -n <limit>| 件数を指定|-| --oneline| それぞれの履歴を一行に圧縮|-| --stat| 追加、削除行数の表示|-| -p| 完全な差分を表示|-| <file>| 指定したフィイルを含むコミットのみ表示|-| --pretty=format:"%h - %an %ar: %s"| 独自のフォーマットを指定|-| --graph| 左側にグラフィカル表示|-| --decorate| コミットログにブランチ名|-|||-|||} =====これまでHEADが辿ってきた履歴を見る(reflog)=====
$git reflog
 
====誰がいつ書いたコードか調べる(blame)====
<pre>
$ git blame <file_name>
</pre>
 
===作業を開始する===
*作業ツリーがgitにどう見えているか
$git status
 
===変更を削除===
=====ファイル指定(checkout)=====
git checkout &lt;filename&gt;
=====すべて(checkout)=====
$git checkout .
 ===リセットでコミットを書き換える==指定 (checkout)=====<pre> $git checkout <branch_name> $git checkout <commit_id> $git checkout <commit_id> <file_name></pre> ===コミットを打ち消すコミット(revert)===*そのコミット内容を打ち消すコミットを新たに加えることで、過去のコミット履歴から指定したスナップショットを無かったことにする*手動でコミット内容を元に戻して、再度コミットするのを自動化<pre>$ git revert <commit_id></pre> ===ステージを取り消す (rm) ===*ワーキングディレクトリ、及びステージングエリアからファイルを削除 $ git rm <file_name>*cachedをつけると、ステージングエリアからは削除するが、ワーキングディレクトリはそのまま $ git rm --cached <file_name> ===ファイル名の変更・移動(mv)===*ワーキングディレクトリのファイル名変更と移動<pre>$ git mv <old_file> <new_file></pre>===リセット(reset)でコミットを書き換える===
*https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe
<blockquote>git reset は実行すると取り消しが効かない危険なコマンドであることを留意</blockquote>====直前のコミット取り消し(reset)====*コミット履歴を過去に遡って以降のコミットをなかったことにする*git revert は打ち消し処理も履歴として残るが、resetは履歴が残らない=====ステージングエリアから削除=====*git add の取り消し*ファイルを指定しなければ、全てのaddを取り消す(直前のコミット状態に戻る)*フィアるの変更は破棄されない $ git reset <file> 
=====コミットのみ=====
$ git reset --soft HEAD^
 
=====すべて=====
$ git reset --hard HEAD^
 
====コミット後の変更を全部取り消し====
$ git reset --hard HEAD
$ git reset --mixed HEAD
====過去の状態に戻す====
*直前のコミットと完全に一致した状態
*ワーキングディレクトリの変更内容は全て破棄
$ git reset --hard
*特定の時点
$ git reset --hard 昔のコミットのハッシュ値
<blockquote>
*リモートにpush済みの場合、再度pushするとエラーになる
<pre>
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
</pre>
*無理矢理pushするには、-f とする
<pre>
$ git push -f origin master
</pre>
</blockquote>
 
 
 
=====resetの後最新の状態に戻す=====
$ git reset --hard O[[R]]IG_HEADORIG_HEAD 
====直前のリセットを取り消す====
$ git reset --hard O[[R]]IG_HEADORIG_HEAD ===ワーキングディレクトリの追跡対象外ファイルを元に戻す(clean)===*gitに管理させることなく、ワーキングディレクトリに作成したファイルを一括して削除*対象を確認 $ git clean -n*強制削除 $ git clean -f ==チーム開発==#メインブランチからトピックブランチを作成##メインブランチは開発の中心となっていてチームの大多数が参照しているブランチ##トピックブランチは一つのトピックに絞った開発を行うブランチ#機能実装を行いローカルリポジトリのトピックブランチにコミット#定期的にトピックブランチをリモートリポジトリにプッシュ##メンバーに公開(ローカルブランチの作業は非公開なので)#定期的にメインブランチの内容をフェッチしてローカルリポジトリにマージ##自分の作業内容と競合していないか定期的にフェッチして、マージもしくはプルして更新しておく#トピックブランチをメインブランチにマージ##トピックブランチの開発が区切られたら、メインブランチを最新(フェッチ+マージ もしくは プル)したのちトピックブランチをマージ#リモートリポジトリのメインブランチにプッシュ##マージが無事に完了したら、リモートリポジトリにプッシュ、全員がメインブランチを参照できるようになる 
==ブランチ==
&lt;blockquote&gt;[[Git]] の真髄は、あらゆるものがブランチのように扱われることにある&lt;===ブランチ一覧(branch)===<pre>$ git branch* master</blockquote&gt;pre>*リモートのブランチ一覧<pre>$ git branch -r origin/HEAD -> origin/master origin/fix_chart origin/master</pre> ===ブランチを作る(branch)===----*masterブランチを元に[[R]]B_1masterブランチを元にRB_1.0ブランチを作成する
*masterブランチは、Subversionにおけるtrunkにあたる
<pre> $git branch [[R]]B_1RB_1.0 master</pre>
=====例=====
*new ブランチをつくる
<pre>
$git branch new
</pre>
*"*"が打たれているのがcheckout(現在作業ツリーに反映されている)されているブランチ
*この時点ではブランチが作成されただけで、checkoutはされていない
<pre>
$git branch
* master
new
</pre>
*新しいブランチをcheckout
$git checkout new
master
* new
===ブランチを切り替える=過去のコミットからブランチを作る====* git checkout -b <new_branch> <commit_hash><pre> $git checkout [[R]]B_1.0-b retry 3462e9a&lt;blockquote&gt;[[Git]]では、ブランチにかかるコストが安い。[[Git]]のブランチはそのブランチで成された最新のコミットだけを記録している&lt;</blockquote&gt;pre>
===ブランチ名の変更と削除===*チェックアウトしているブランチに、git brancn -m 変更後名称で、名称変更*git branch -d ブランチ名 で、ブランチの削除、-D で強制削除 ===ブランチを切り替える(checkout)===<pre> $git checkout RB_1.0</pre><blockquote>Gitでは、ブランチにかかるコストが安い。Gitのブランチはそのブランチで成された最新のコミットだけを記録している</blockquote>===作業途中のブランチを切り替える(stash)===[https://qiita.com/chihiro/items/f373873d5c2dfbd03250 【git stash】コミットはせずに変更を退避したいとき]「とあるブランチで作業中だけど、いますぐやりたいことができた。作業がすごく中途半端だからコミットはしたくない。」というときに、stashが使えます。stashを使用すると、コミットしていない変更を退避することができます。stashで現在の変更を退避して、今すぐやりたい作業をして、退避させていた変更を戻して作業を再開することができます。 *未コミットの状態だと、checkoutでブランチを切り替えられない*git stash を利用することで、作業状態を保存し、ブランチを切り替えられる*保存した情報を取り出すには、git stach pop ===ブランチ間での変更マージ(merge)===
*ブランチ間で変更をマージする方法はいくつかある
**直接マージ: 履歴をマージして一緒にしようとする
====直接マージ====
*マージ先としたいブランチに切り替え
<pre>
$git checkout master
$git merge {マージしたいブランチ}
</pre>
*例
<pre>
$ git branch
* directlink
master
calcutta:favophrase-web hirotoyagi$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git merge directlink
</pre>
 
===コンフリクトを解消===
----
*以下のようなコンフリクトが発生した場合
<pre>
Auto-merging lib/photo_list_screen.dart
CONFLICT (content): Merge conflict in lib/photo_list_screen.dart
Automatic merge failed; fix conflicts and then commit the result.
</pre>
*「自動マージに失敗しました。コンフリクトを修正してから結果をコミットしてください。」
*git status で対象を確認
<pre>
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
 
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
:
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: lib/photo_list_screen.dart
both modified: pubspec.lock
</pre>
*==== より上の部分が、HEADが参照しているブランチの内容
*==== より下の部分が、変更内容
*どちらかを採用するなどした後、git add , git commit
<pre>
<<<<<<< HEAD
.collection('users/${user.uid}/photos')
.doc()
.set(data);
=======
.collection('users/${user.uid}/photos')
.doc()
.set(data);
 
HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('ocr',
options: HttpsCallableOptions(timeout: const Duration(seconds:30)));
 
var res = await callable.call(
{'gsUrl':'gs://tenarai-online.appspot.com/users/${user.uid}/photos/$path'});
//gs://tenarai-online.appspot.com/users/m8dAoyu7s3UJUNQwI1F8E3NcMO72/photos/1628325188064403_IMG_20210807_173119.jpg
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Response'),
content: Text(res.data.toString()),
);
},
);
>>>>>>> 090b91525ddb715a39803757bd7617eeb0e8029a
</pre>
 
==リリースのハンドリング==
===タグを打つ(tag)===
*タグの名前(1.0)、タグを打ちたいポイント([[R]]B_1.0)
$git tag 1.0 [[R]]B_1.0
 
===タグ一覧の参照===
$git tag
===タグをリモートにpush(push)===
$git push origin {tag_name}
*一括でpush
$ git push origin master
===未 push コミットの確認===*git log (リポジトリ名)/(リモートのブランチ名)..(ローカルのブランチ名)*存在しなければ何も出力されない<pre>$ git log origin/master..master</pre> ===rebase:ブランチから変更を取り出し別ブランチの先頭で再生(rebase)===
*masterブランチからブランチした[[R]]B_1.0 の変更をmasterブランチに反映させる
*まず、masterブランチへ戻る
$git checkout master
$git rebase [[R]]B_1.0
 ===ブランチの削除(branch)===
*タグを打ってあるため、ブランチを削除しても問題ない
$git branch -d [[R]]B_1.0
$git branch [[R]]B_1.0.1 1.0
$git checkout [[R]]B_1.0.1
 ===アーカイブする(archive)===
*--formatでアーカイブ形式、--prefixでディレクトリを指定
<pre>
$git archive --format=zip --prefix=phraseit-0.9/ master &gt;master0.9.zip
</pre>
*現在のワーキングディレクトリのHEADをアーカイブ
<pre>
$ git archive --format=zip HEAD -o export.zip
</pre>
====フォマット一覧====
<pre>
$ git archive -l
tar
tgz
tar.gz
zip
</pre>
 
==リモートリポジトリ==
*gitはリモートのリポジトリも扱える
|-
|}
====ローカルリポジトリをリモートを作成してpushする例====
----
*サーバー側でリポジトリを作成
<pre>
# git init --bare wol_swift.git
</pre>
*ローカル側からリモート設定
**リモートリポジトリ登録
**ブランチ名の確認
**push
<pre>
$ git remote add origin ssh://root@repo.typea.info/var/www/html/git/_samples/wol_swift.git
$ git branch
* main
$ git push origin main
</pre>
====リモートリポジトリの確認====
<pre>
$ git remote -v
origin ssh://root@repo.typea.info/var/www/html/git/_samples/wol_swift.git (fetch)
origin ssh://root@repo.typea.info/var/www/html/git/_samples/wol_swift.git (push)
</pre>
===リポジトリ公開時のApache設定===
&gt; git remote set-url origin ssh://root@git.taisetsu.typea.info/var/www/git/hoge.git
===Webからリポジトリ内容を閲覧(GitWeb)===
*[http://typea.info/blg/glob/2015/04/gitwebgit.html GitWebで簡単にGitサーバーの情報を閲覧できるようにする]
$ git pull origin master
==[[Tips]]==
===日本語ファイル名日本語ファイル名を表示させる(文字化け対応)===
*日本語ファイル名は "\nnn" にエスケープされてしまって読めない。以下の設定を追加することで日本語ファイル名が表示されるようになる。
$ git config --global core.quotepath false
===[[Git]]でやらかしたときに使えるコマンド===
*https://qiita.com/muran001/items/dea2bbbaea1260098051
 
==Workflow==
*拾いもの
 
[[File:Git workflow.jpeg]]

案内メニュー