20210226のGitに関する記事は3件です。

【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-dirty

Subprojectでコミットの変更があったことだけが表示される。

サブモジュールのファイルの変更内容は見えない。中身を確認するためには、サブモジュールのディレクトリに移動する必要がある。


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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Git】git pullはgit fetchとgit mergeと同じそれは知ってるけど、具体的にはどういうこと?

git pullgit fetchしてgit mergeをするのと同じという話はよく目にする。

しかし、それぞれのコマンドでオプションや引数が省略された場合にどういった挙動になるのかが曖昧だったため、それらのコマンドが具体的に何をしているのかを調べてみた。

$git pull

↓ 同じ

$git fetch
$git merge

目次

  1. git fetch
  2. git merge
  3. 引数のあるgit pull
  4. よくある使い方


1. git fetch

オプションや引数を付けない場合、リモートレポジトリで登録されているoriginにあるすべての追跡ブランチのデータを取得してくる。

つまり、リモートレポジトリとしてoriginが登録されていることが前提となる。

▼リモートレポジトリ

//登録されているリモートレポジトリの確認
$ git remote 
origin

urlを確認したい場合はgit remote -vで確認できる。



▼リモート追跡ブランチ
リモート追跡ブランチは、git branch -aで確認できる。

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/aaa

上記の状態の場合、git fetchを実行すると、origin/masterと、origin/aaaからコミット履歴を取得してくる。

コミット履歴が更新されるのは、そのコマンドを実行したブランチではなく、origin/masterorigin/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 aaa

git fetchで、指定したリモートレポジトリ(origin)のブランチ(aaa)からデータを取得してくる。

git mergeで取得してきたコミットを、コマンドを実行したブランチにマージする。


よくある使い方

複数人で実施しているプロジェクトでよくある使い方は、自分の作業環境を最新状態に保つために、

自分がブランチを切って作業をしている時に、masterの更新情報を取得して定期的にマージすること。

コマンドでみると、

$ git pull origin master

$git fetch origin master
$git merge origin master

を実行していることになる。



以上。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Git】git fetchしたデータはどこにある?fetchによるデータ取得と取得後のコミット履歴を確認する方法

git fetchの処理が何をしているかについて。

git fetchを実行したら、何かしらがダウンロードされたのに、git logしても何も変更されていない、、取得したデータはどこにあるんだ!?となったので、データのありかや、確認方法について確認してみた。

目次

  1. git fetchとは?
  2. 引数・オプションなしの場合
  3. git fetchの実例
  4. git fetchで取得してきたデータを確認する方法
    1. コミット履歴の確認
    2. ファイルの差分を確認
  5. リモートレポジトリとブランチを指定する
  6. 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む