0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gitのリモートブランチとかリモートリポジトリとかをまとめる

Last updated at Posted at 2024-10-23

リモートリポジトリとかリモートブランチ周りがイマイチ理解しきれていない気がするので調べた範囲でまとめてみる。

リモートリポジトリの登録

リモートリポジトリを指定する際、URLをいちいち指定するのは面倒なのでリモートリポジトリに任意の名前をつけて登録することができ、リモートリポジトリの指定の際にその名前を使うことができる。

リモートリポジトリの登録はgit remote add <RemoteName> <RepositoryURL>で行い、
現在登録されているリモートリポジトリはgit remote -vで確認できる。

//originという名前でリモートリポジトリを登録
> git remote add origin git@github.com:user/TestRepository.git

//登録されているリモートリポジトリの確認
> git remote -v
origin  git@github.com:user/TestRepository.git (fetch)
origin  git@github.com:user/TestRepository.git (push)

リモートリポジトリをcloneした際は、自動的にoriginという名前でリモートリポジトリが登録される。

3種類のブランチ

リモートブランチ

リモートリポジトリに存在するブランチ。

リモート追跡ブランチ

ローカルに存在するブランチ。
最後にリモートブランチに接続した際のリモートブランチの状態を保持するブランチ。
git fetchした際にリモートブランチの状態を取得し、最新化される。
.git/refs/remotes/以下に保持される。
ブランチ名は(remote)/(branch)のように表される。(例: origin/master)

ローカルブランチ

ローカルリポジトリに存在するブランチ。
ブランチ名は(branch)のように表される。(例: master

git fetchgit mergeがなにをしているのか

git fetch

リモートブランチから差分となるコミットを取得し、リモート追跡ブランチに反映する。
ローカルブランチには反映されない。

Fetch branches and/or tags (collectively, "refs") from one or more other repositories, along with the objects necessary to complete their histories. Remote-tracking branches are updated

公式ドキュメントにもリモート追跡ブランチを更新すると書いてある。

When git fetch is run without specifying what branches and/or tags to fetch on the command line, e.g. git fetch origin or git fetch, remote.<repository>.fetch values are used as the refspecs—​they specify which refs to fetch and which local refs to update

fetchはremote.<repository>.urlで指定されているURLから、remote.<repository>.fetchの指定に従ってどこからどこへfetchするかを決定する。

remote.origin.url=git@github.com:user/TestRepository.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

refs/remotes/origin/はローカルのリモート追跡ブランチ。

git merge

リモート追跡ブランチの状態をローカルブランチに反映させる。

If no commit is given from the command line, merge the remote-tracking branches that the current branch is configured to use as its upstream

正確には、「上流ブランチとして設定されているブランチの内容をローカルブランチに反映させる」みたい。

わからないところ

ローカルブランチの上流ブランチは通常、リモート追跡ブランチを指すのか、リモートブランチを指すのか。

公式ドキュメントの用語集には下記の通り記載されている。

upstream branch
The default branch that is merged into the branch in question (or the branch in question is rebased onto). It is configured via branch.<name>.remote and branch.<name>.merge. If the upstream branch of A is origin/B sometimes we say "A is tracking origin/B".

引数なしでgit mergeした際のマージ対象との認識で、これを読む限りでは、「ローカルブランチの上流ブランチ=リモート追跡ブランチ」であるように読み取れる。
git mergeの公式ドキュメントの引用部分を見てもそのように読み取れる。

しかしながら、git configの値を見る限り、branch.main.mergeの値は以下のようになっている。

branch.main.remote=origin
branch.main.merge=refs/heads/main

git mergeした際のマージ対象がbranch.main.mergeになる認識だが、この設定値を見る限りではリモートブランチを指しているように見える。
リモート追跡ブランチを指すのであれば、refs/remotes/origin/mainになるのではないか?

多分前者なのかな、と思っているが、両方の説があって色々調べているうちにわからなくなってしまった。

まとめ

  • リモートリポジトリは参照しやすいように名前をつけることができる。デフォルトはorigin
  • リモート追跡ブランチはローカルに存在し、リモートブランチに最後に接続した際の状態を保持する。
  • fetchmergeをすると、リモート追跡ブランチを経由してローカルブランチにマージされる。
  • 上流ブランチが通常リモート追跡ブランチを指すのかリモートブランチを指すのかはわからなかった。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?