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

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
10,413 バイト追加 、 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
|-
|}
==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つの場所===
$cd mysite
$git init
====リモートリポジトリの作成====*作業ファイルがなく、管理ファイルのみのリポジトリの場合作業ファイル、ワーキングディレクトリがなく、管理ファイルのみのリポジトリ
$git init --bare hoge
**2行目:空行(区切りとみなす)
**3行目:詳細の説明
=====直前のコミットを修正 (amend)=====
*add してコミットすると、直前のコミットに追加される
* --no-edit でコミットメッセージの変更をせずに実行
*以下のコマンドのみ実行するとコミットコメントのみを修正できる
$ git commit --amend
====変更・移動 (mv)====
====ファイルを無視する (.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======
https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff
======特定の拡張子を無視する=======
*.exe
 
======特定のフォルダの中身全てを無視する======
bin/
======フォルダ内の特定拡張子を無視======
package/**/*.class
======隠しフォルダを無視するが、.gitignoreファイルは無視しない======
<pre>
.*
!/.gitignore
</pre>
===変更の確認 ===
$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)=====
=====すべて (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 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 ===ワーキングディレクトリの追跡対象外ファイルを元に戻す(clean)===*gitに管理させることなく、ワーキングディレクトリに作成したファイルを一括して削除*対象を確認 $ git clean -n*強制削除 $ git clean -f ==チーム開発==#メインブランチからトピックブランチを作成##メインブランチは開発の中心となっていてチームの大多数が参照しているブランチ##トピックブランチは一つのトピックに絞った開発を行うブランチ#機能実装を行いローカルリポジトリのトピックブランチにコミット#定期的にトピックブランチをリモートリポジトリにプッシュ##メンバーに公開(ローカルブランチの作業は非公開なので)#定期的にメインブランチの内容をフェッチしてローカルリポジトリにマージ##自分の作業内容と競合していないか定期的にフェッチして、マージもしくはプルして更新しておく#トピックブランチをメインブランチにマージ##トピックブランチの開発が区切られたら、メインブランチを最新(フェッチ+マージ もしくは プル)したのちトピックブランチをマージ#リモートリポジトリのメインブランチにプッシュ##マージが無事に完了したら、リモートリポジトリにプッシュ、全員がメインブランチを参照できるようになる 
==ブランチ==
[[Git]] の真髄は、あらゆるものがブランチのように扱われることにある
===ブランチ一覧(branch)===
<pre>
$ git branch
* master
</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 -b retry 3462e9a
</pre>
===ブランチ名の変更と削除===*チェックアウトしているブランチに、git brancn -m 変更後名称で、名称変更*git branch -d ブランチ名 で、ブランチの削除、-D で強制削除 ===ブランチを切り替える(checkout)===<pre> $git checkout [[R]]B_1RB_1.0&lt;</pre><blockquote&gt;>Gitでは、ブランチにかかるコストが安い。Gitのブランチはそのブランチで成された最新のコミットだけを記録している</blockquote>===作業途中のブランチを切り替える(stash)===[[Githttps://qiita.com/chihiro/items/f373873d5c2dfbd03250 【git stash】コミットはせずに変更を退避したいとき]]では、ブランチにかかるコストが安い。[[Git]]のブランチはそのブランチで成された最新のコミットだけを記録している&lt;/blockquote&gt;「とあるブランチで作業中だけど、いますぐやりたいことができた。作業がすごく中途半端だからコミットはしたくない。」というときに、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>
==リリースのハンドリング==
$ git push origin master
===未 push コミットの確認===
*git log (リポジトリ名)/(リモートのブランチ名)..(ローカルのブランチ名)
*存在しなければ何も出力されない
<pre>
$ git log origin/master..master
</pre>
===rebase:ブランチから変更を取り出し別ブランチの先頭で再生 (rebase)===
===アーカイブする (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>
==リモートリポジトリ==
|-
|}
====ローカルリポジトリをリモートを作成して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設定===
$ git pull origin master
==[[Tips]]==
===日本語ファイル名日本語ファイル名を表示させる(文字化け対応)===
*日本語ファイル名は "\nnn" にエスケープされてしまって読めない。以下の設定を追加することで日本語ファイル名が表示されるようになる。
$ git config --global core.quotepath false
===[[Git]]でやらかしたときに使えるコマンド===
*https://qiita.com/muran001/items/dea2bbbaea1260098051
 
==Workflow==
*拾いもの
 
[[File:Git workflow.jpeg]]

案内メニュー