- 投稿日:2021-02-26T19:26:08+09:00
【Git】サブモジュール をコミットした後の親プロジェクトの対応方法
個人メモです。
サブモジュールで更新した後に、親のプロジェクトでどう対応したらいいか迷うので、まとめとして。サブモジュールのあるプロジェクトで、サブモジュールを更新すると、親のプロジェクトでステータスを見ると、
・
ディレクトリ名(new commits)
が表示される。この後の処理方法などについて。
$git status modified: submodule名 (new commits)または、
$git status modified: submodule名 (modified content)1. submoduleで変更をコミットする。
submoduleで変更を加えたら、
git add
,git commit
する。2. submoduleのmasterにマージする
親のプロジェクトに反映する前に、submoduleの変更内容をmasterにマージする。
submoduleのディレクトリで、
$ git push origin master
または、個人のブランチにpushし、プルリクを出す。
3. 親のプロジェクトディレクトリでコミットの確認
サブモジュールの変更内容を親のプロジェクトに反映させるため、ルートのプロジェクトディレクトリに移動する。
git-status#submoduleが直下にあった場合 $ cd .. $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) (commit or discard the untracked or modified content in submodules) modified: submodule名 (modified content) no changes added to commit (use "git add" and/or "git commit -a")commit or discard the untracked or modified content in submodulesとあり、サブモジュールで変更があったことを伝えてくれる。
3. git diffで詳細を確認
$ git diff diff --git a/sbmodule名 b/sbmodule名 --- a/sbmodule名 +++ b/sbmodule名 @@ -1 +1 @@ -Subproject commit 8f71500980389a8cdd5522545d352df5fa7b4faf +Subproject commit 8f71500980389a8cdd5522545d352df5fa7b4faf-dirtySubprojectでコミットの変更があったことだけが表示される。
サブモジュールのファイルの変更内容は見えない。中身を確認するためには、サブモジュールのディレクトリに移動する必要がある。
4. サブモジュールの変更をコミット
サブモジュールの変更内容を確認し問題がなければ、
親プロジェクトで、サブモジュールの変更があったことをステージ&コミットする。
・
$ git commit -m "update submodule"
コミット名は細かく記述してもいいが、サブモジュールで変更が頻繁にある場合は「update submodule」で簡略化してもいい。(コミット履歴はサブモジュールに行けば見れるため)
$ git add submodule名 $ git commit -m "update submodule" [master 734fec6] update submodule 1 file changed, 1 insertion(+), 1 deletion(-) #クリーンになったか確認 $ git status On branch master nothing to commit, working tree clean
- 投稿日:2021-02-26T18:00:38+09:00
【Git】git pullはgit fetchとgit mergeと同じそれは知ってるけど、具体的にはどういうこと?
git pull
はgit fetch
してgit merge
をするのと同じという話はよく目にする。しかし、それぞれのコマンドでオプションや引数が省略された場合にどういった挙動になるのかが曖昧だったため、それらのコマンドが具体的に何をしているのかを調べてみた。
$git pull↓ 同じ
$git fetch $git merge目次
1. git fetch
オプションや引数を付けない場合、リモートレポジトリで登録されているoriginにあるすべての追跡ブランチのデータを取得してくる。
つまり、リモートレポジトリとしてoriginが登録されていることが前提となる。
▼リモートレポジトリ
//登録されているリモートレポジトリの確認 $ git remote originurlを確認したい場合は
git remote -v
で確認できる。
▼リモート追跡ブランチ
リモート追跡ブランチは、git branch -a
で確認できる。$ git branch -a * master remotes/origin/master remotes/origin/aaa上記の状態の場合、
git fetch
を実行すると、origin/masterと、origin/aaa
からコミット履歴を取得してくる。コミット履歴が更新されるのは、そのコマンドを実行したブランチではなく、
origin/master
とorigin/aaa
。更新されたコミット履歴の確認
リモート追跡ブランチのコミット履歴を確認するには、
・
$ git log origin/<ブランチ名>
を実行すればいい。
--online
や--graph
オプションを付ければ見やすく表示できる。
2. git merge
オプションや引数を付けない場合、現在のブランチのリモート追跡ブランチをマージする。
もしmasterブランチで
git merge
を実行したのであれば、$ git merge origin masterを実行したのと同じになる。
※注意点
master以外の別のブランチにいる場合(例えばブランチaaa)だと、master/masterではなく、そのリモートレポジトリ(origin/aaa)のコミット履歴を統合することになる。ここが、単なる
git pull
の落とし穴。自分専用のブランチで作業している場合は、
git pull
したところで何も更新されない。もし、master以外のブランチで作業していて、リモートレポジトリのマスターのコミットを
git merge
したい場合は、$git pull origin master↓ 同じ
$git fetch $git merge origin masterとなる。
3. 引数のあるgit pull
では、リモートレポジトリとブランチを指定したgit pullはどういった処理になるのか?
$ git pull origin aaa↓
$git fetch origin aaa $git merge origin aaagit fetchで、指定したリモートレポジトリ(origin)のブランチ(aaa)からデータを取得してくる。
git merge
で取得してきたコミットを、コマンドを実行したブランチにマージする。
よくある使い方
複数人で実施しているプロジェクトでよくある使い方は、自分の作業環境を最新状態に保つために、
自分がブランチを切って作業をしている時に、masterの更新情報を取得して定期的にマージすること。
コマンドでみると、
$ git pull origin master↓
$git fetch origin master $git merge origin masterを実行していることになる。
以上。
- 投稿日:2021-02-26T17:36:11+09:00
【Git】git fetchしたデータはどこにある?fetchによるデータ取得と取得後のコミット履歴を確認する方法
git fetch
の処理が何をしているかについて。
git fetch
を実行したら、何かしらがダウンロードされたのに、git logしても何も変更されていない、、取得したデータはどこにあるんだ!?となったので、データのありかや、確認方法について確認してみた。目次
- git fetchとは?
- 引数・オプションなしの場合
- git fetchの実例
- git fetchで取得してきたデータを確認する方法
- リモートレポジトリとブランチを指定する
- git fetch --allとは?
git fetchとは?
git fetch
とは、他のレポジトリから情報を取得するコマンド。通常はgithubのリモートレポジトリからコミットを取得してくる目的で使う。
git pullだと、リモートレポジトリからコミットの情報を取得して、差分があればマージまでしてしまうが、git fetchは情報の取得までで止まる。
引数・オプションなしの場合
単に
git fetch
を実行した場合は、リモートレポジトリoriginの現在のブランチのデータを取得し更新する。$ git fetch↓ 同じ
masterブランチの場合$ git fetch originローカル側で更新されるのは
remotes/origin/master
ブランチ(リモート追跡ブランチと呼ぶ)。リモート追跡ブランチの一覧は
git branch -a
で確認できる。
▼注意点
現在のブランチや、コマンドを実行したブランチの情報が更新されるわけではない。ローカルのリモート追跡ブランチのログが更新される。git fetchの実例
git fetchをすると登録してある、originで追跡しているすべてのレポジトリの内容を確認して、差分を取得してくる。
submoduleがある場合は、submoduleの情報も更新する。
$ git fetch remote: Enumerating objects: 107, done. remote: Counting objects: 100% (107/107), done. remote: Compressing objects: 100% (52/52), done. remote: Total 108 (delta 70), reused 84 (delta 53), pack-reused 1 Receiving objects: 100% (108/108), 30.28 KiB | 6.05 MiB/s, done. Resolving deltas: 100% (70/70), completed with 19 local objects. From github.com:test/app 27c38b55..9c3de210 master -> origin/master ea99240d..1108db61 aaa -> origin/aaa d1f87062..27c38b55 bbb -> origin/bbb 4cad4e31..3c14bc6a ccc -> origin/ccc Fetching submodule app-sub From github.com:test/app a9e55dd..7975898 master -> origin/master + fd77a0d...5213eea xxx -> origin/xxx (forced update)git fetchで取得してきたデータを確認する方法
コミット履歴の確認
git fetchで更新されるのはリモート追跡ブランチ(origin/ブランチ)。このブランチのログを表示すればいい。
$ git log origin/ブランチ名
--oneline
や--graph
をつけると見やすくなる。▼実例
$ git log origin/master --oneline --graph * 9c3de210 (origin/master) Merge branch 'master' of github.test/app |\ | * d44f7bb3 Merge pull request #1144 from aaa | |\ | | * d31b7483 (origin/aaa) [F]CSV download category | |/ | * 9d164354 (origin/xxx) Merge pull request #114 | |\
ファイルの差分を確認
現在のブランチとの差分を確認する場合は、
$ git diff origin/branch名
リモートレポジトリとブランチを指定する
取得したいブランチを指定することもできる。
・
git fetch <リモートレポジトリ名> <ブランチ名>
※レポジトリとブランチ名の間にスラッシュは入らない
$ git fetch origin master From github.com:test/app * branch master -> FETCH_HEAD
▼スラッシュがあるとエラーになるエラー$ git fetch origin/master fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
origin/master
というレポジトリを探すため、そんなのはないとエラーが出る。git fetch --allとは?
--all
オプションを使うとすべてのリモートレポジトリのすべてのブランチからデータを取得してくる。リモートレポジトリがoriginしか登録されていない場合は、
git fetch
(git fetch origin)と同じになる。//originしかない $ git remote origin //originのデータを取得 $ git fetch --all Fetching origin