#author("2021-06-18T05:58:18+00:00","default:src128","src128") #author("2021-06-26T05:20:46+00:00","default:src128","src128") &tag(git); *目次 [#x329001c] #contents *関連情報 [#s71ea7b7] -[[git]] / [[github]] *使い始め [#q1580307] **ローカルリポジトリの作成 [#g20f9c3b] -プロジェクトディレクトリでローカルリポジトリを作成してコミットする #pre{{ $ cd <PROJECT_HOME> $ git init $ git add . $ git commit -a -m "first commit" }} **リモートリポジトリの作成 [#p4227c9b] - /home/repository/sample.gitディレクトリに空のリポジトリを作成する。 #pre{{ $ mkdir -p /home/repository/sample.git $ cd /home/repository/sample.git $ git --bare init }} -オリジナルワークツリーの内容をpush #pre{{ $ cd <PROJECT_HOME> $ git remote add origin /pub/repository/sample.git master $ git push origin master }} -二カ所目でclone #pre{{ $ git clone firstmac:/pub/repository/sample.git }} **編集→コミットまでの流れ [#cc21f3a6] -ファイル編集 - 新規ファイルがある場合はgit add . - git commit -a *戻したい [#i2bacc30] -[[gitでアレを元に戻す108の方法 - TIM Labs:http://labs.timedia.co.jp/2011/08/git-undo-999.html]] -基本的にgit resetを使う。resetの引数はsoft、mixed(デフォルト)、hardがありそれぞれ異なる。 --soft: ワークツリー、インデックスそのまま。 --mixed: ワークツリーそのまま、インデックスは取り消す。 --hard: ワークツリー、インデックスを変更。 -すなわちcommit直後にresetを実行する場合、"git reset HEAD^"が基本形で、インデックスやワークツリーをどうするかで引数を使い分ければ良い。例えばaddを取り消したい時はインデックスも取り消したいのでmixed(引数なし)にするとか。 **最後にcommitした状態にもどしたい [#c8104ecf] -checkoutした状態に戻したい場合など git reset --hard HEAD -ゴミがある場合(gitで管理していないファイルが追加されてた場合)。 git clean -df **commitしたときに余計なファイルやフォルダを追加したことに気がついたので戻したい [#pb65193b] -ワークスペースの状態だけ保ちインデックスやコミットを戻す。 git reset HEAD^ **過去のcommitに戻したい [#n2b3eee0] -以前のcommitに戻したい場合、git logなどでハッシュ値を確認して。 git reset --hard xxxxxxxxxxxxxxxxxxxxxxxxxxxxx -これだけだと新規追加したファイルが残るのでuntracked filesを削除する場合、以下のコマンドも実行。[[Git clean | アトラシアン Git チュートリアル:https://www.atlassian.com/ja/git/tutorial/undoing-changes#!clean]] git clean -df **途中のcommitをなかったことにしたい [#af0f5092] -git revertを使うとよい? http://labs.timedia.co.jp/2011/02/git-various-undo.html *除外したい [#r890f8ef] **.gitignoreに追加しそのファイルを管理外にしたい [#f9415b85] -[[How to make Git "forget" about a file that was tracked but is now in .gitignore? - Stack Overflow:https://stackoverflow.com/questions/1274057/how-to-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore]]によると、.gitignoreに追加してもそのファイルはgitで管理されたままとなる。 -以下のコマンドで削除できる。 #単体のファイル git rm --cached <file> #フォルダ全体 git rm -r --cached <folder> *履歴を確認したい [#l98d7b4e] **diffを確認したい [#de52581d] -"-p"オプションを使う git log -p README.md *コンフリクトの解消 [#pb4a45c0] **git pullでコンフリクトしたときの対処法 [#g0fb6122] *** 参考情報 [#aed6b68f] -[[Force git to overwrite local files on pull. - Stack Overflow:http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull]] *** 前回git pullした状態に戻す [#v769389d] -一回もローカルリポジトリにcommitしてない場合 git reset HEAD -ローカルファイルに変更があってそれもなくす場合 git reset --hard HEAD -一回コミットしていた場合は、HEADの場合にHEAD^を使えばよい。 git logなどして確認する。 **git rebaseでコンフリクトしたときの対処法 [#oc18ed15] -[[なぜ git rebase master はコンフリクトしたとき master 側を常に適用させたいときは --ours ですか? - @kyanny's blog:https://blog.kyanny.me/entry/2017/03/28/144928]] -developブランチでmasterをrebaseしようとしたときにコンフリクトした場合 git checkout develop git rebase master -テキストファイルの場合衝突したファイルを修正。バイナリファイルの場合、 git checkout --ours demo.txt(この場合master側を使う) git checkout --theirs demo.txt(この場合develop側を使う) -その後 git add demo.txt git rebase --continue ※rebaseの場合、masterをチェックアウトし(masterがoursになる)、developをcherry-pickするような動作なので、ours,theirsがこうなるらしい。 *ブランチ [#aa1a1878] **全部ランチをpush [#te94269c] -通常masterブランチをpushするが場合によってはfeatureブランチなど全部をpushしたい場合もある。 git push -u origin --all **ブランチを同期する [#q435d653] -[[gitのリモートブランチを使って作業を行う流れのメモ - 那由多屋 開発日誌:http://d.hatena.ne.jp/nayutaya/20090519/1242701594]] -[[Git - リモートブランチ:https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81]] -作業中のブランチはトピックブランチのこともある。そのブランチを同期する方法。 -リモートブランチにトピックブランチをpush。 git push origin issue-99 -別のマシンでリモートブランチをチェックアウト git checkout -b issue-99 origin/issue-99 -同じくpushする。 git push -push元では--set-upstream-toを指定しないといけないかも git branch --set-upstream-to=origin/issue-99 issue-99 -作業完了後はブランチを削除 #pre{{ git branch -d working git branch -r -d origin/working git push origin :working }} -[[今さら聞けないgit pushコマンド - shoma2da's diary:http://shoma2da.hatenablog.com/entry/2014/03/08/234523]] **ベンダーブランチの管理 [#ba9d78b7] ***Gitで管理されていない上流ソースの管理 [#r49c7e66] -[[Vendor branches in git | Jabbering Giraffe:http://happygiraffe.net/blog/2008/02/07/vendor-branches-in-git/]] //例としてWordPressが取り上げられている。テーマを管理しようとするときにも役に立つかもしれない(→[[WordPress/テーマ - src's wiki:http://www.srcw.net/wiki/index.php?cmd=read&page=WordPress%2F%A5%C6%A1%BC%A5%DE&word=Vendor%20branches%20in%20git%20%7C%20Jabbering%20Giraffe%20]]) -[[How do I import a third party lib into git? - Stack Overflow:http://stackoverflow.com/questions/1695925/how-do-i-import-a-third-party-lib-into-git]] -そのソース用に専用gitリポジトリを作って毎回インポートしなおす戦略。使用する側はそのgitリポジトリをサブモジュールとして参照。 ***Gitで管理されているソースの管理 [#jc067ce0] -submoduleで管理するのが簡単?[[[git 1.6.0.2] submoduleを使おう!その2 - satoko's blog - s21g:http://blog.s21g.com/articles/1411]]。forkしてから組み込むことで上流の変更にも追随できる。 *その他Tips [#c2eb3ef6] **サブモジュールを使う [#mae9fb07] -[[git submodule - みずぴー日記:http://d.hatena.ne.jp/mzp/20080508/git]] -[[[git 1.6.0.2] submoduleを使おう!その1:add, status - satoko's blog - s21g:http://blog.s21g.com/articles/1401]] -[[[git 1.6.0.2] submoduleを使おう!その2 - satoko's blog - s21g:http://blog.s21g.com/articles/1411]] **空フォルダを管理する [#xd050ab3] -フォルダに空の.gitignoreファイルを置く。 **Subversionからの移行 [#a958bb0c] -Windows以外の環境は安定してるようなのでWindowsがからまないなら使っても良さそう。Windows用クライアントはいろいろとだめ。 -GUIクライアントはなくてもまあ大丈夫か。 -[[SubversionからGitへの移行をオススメする7つの理由 - akimatter:http://d.hatena.ne.jp/akm/20100227/1267289900]] **PC/デスクトップで作業を同期 [#m3e463bf] -commit単位を記にしなくて良いなら、中央リポジトリを使ってpush/pullしあうのが簡単。 -[[リモートのgitブランチをローカルにチェックアウトする - sessanの日記:http://sessan.hatenablog.com/entry/2012/11/04/132746]] -[[remote に branch を push し、remote から clone したリポジトリの branch を変更して push する - basyura's blog:http://blog.basyura.org/entry/20100323/p1]] **機密情報のチェック [#y0e95fdf] -git-secret -[[secretlint/secretlint: Pluggable linting tool to prevent committing credential.:https://github.com/secretlint/secretlint]]