Git基礎のメモ3 (clone, fetch, merge, push, pull)

リモートリポジトリ

==ちなみに、よく出てくるoriginとmasterという名称==

用語 意味・内容
origin デフォルトのリポジトリ名。省略すると暗黙的にこの名前のリポジトリが対象となる。 *.gitconfigファイルで、デフォルトの変更も可能
master CVS、SVNの”トランク”に相当する。リポジトリが作成されるとこのブランチも作成される。

なので、リモート操作でよくみるorigin/masterという表記は、 「エイリアス名==origin==で登録されている(リモート)リポジトリのブランチ==master==」ということになる。

  • リモートリポジトリをローカルリポジトリへ追加する

    リモートリポジトリへアクセスするためにはURLを指定すればよい。 が、どうしても長くなるので、エイリアス名で指定できるようにローカルリポジトリに 登録することができる。これより、URL部分をエイリアス名に置き換えてコマンドを実行できる。

      $ git remote add (エイリアス名) (URL)
      $ git remote add test git://hoge.com/test.git
      $ cat .git/config
      :
      [remote "origin"]
          url = https://github.com/hogehoge/sample.git
          fetch = +refs/heads/*:refs/remotes/origin/*
      [remote "test"]
          url = git://hoge.com/test.git
          fetch = +refs/heads/*:refs/remotes/origin/*
    

    $ git fetch test
    remote: Counting objects: 43, done.
    remote: Compressing objects: 100% (36/36), done.
    remote: Tootal 43 (delta 10), reused 31 (delta 5)
    :

  • リモートリポジトリの一覧を表示

      $ git remote -v
    
  • リモートリポジトリの詳細確認

    リモートリポジトリ名を指定して詳細設定を確認する

      $ git remote show origin
      * remote origin
        Fetch URL: https://github.com/hogehoge/sample.git
        Push  URL: https://github.com/hogehoge/sample.git
        HEAD branch: master
        Remote branches:
          b01    tracked
          b02    new (next fetch will store in remotes/origin)
          master tracked
        Local branch configured for 'git pull':
          master merges with remote master
        Local refs configured for 'git push':
          b01    pushes to b01    (fast-forwardable)
          b02    pushes to b02    (local out of date)
          master pushes to master (up to date)
    
  • リモートリポジトリのエイリアス名を変更する

      git remote rename (old name) (new name)
    
  • リモートリポジトリのエイリアス名を削除

      git remote rm (name)
    

リモートリポジトリ操作に関して

おもにリモートリポジトリに対して行う操作とその役割を簡単にまとめると、

操作 内容
clone ローカルに何もない状態から、リモートのリポジトリを指定して、丸ごとローカルにリポジトリをコピーする。恐らくリモート操作で最初にやる処理。clone作成後、ローカルにはリモートから丸ごとコピーされた場合、origin/masterというリモートに結びついたブランチが作成される。
fetch リモートのリポジトリと、cloneしたローカルにあるリモート情報に差異が発生した場合、fetchを行うと、リモートの情報を取得してローカルのリモート情報が更新される。ただしこの操作を行っても、ローカルのmasterブランチは何も更新されない。あくまで、ローカルのリモート情報のみ更新する。
merge ブランチ間のマージを行う。リモートのブランチとローカルのブランチもマージ可能。
pull 一言で言うと、fetch + merge. fetch, merge, rebaseさえあれば、pullコマンドはなくても良い。内部でいろいろ自動的にやっているので、pullしたくないケースや、意図しない結果に陥ることが多い。使うな名言している投稿もある。
push ローカルのリポジトリ情報をリモートリポジトリへアップロードする。
  • リモートリポジトリのクローンを作成する

    リモートにあるリポジトリからローカルにクローンを作成する

      > git clone (URLまたはエイリアス名) (フォルダ名)
       > git clone ssh://hoge.com/repositories/repo.git sample
    

    > git remote add hoge ssh://hoge.com/repositories/repo.git
    > git clone hoge sample

  • ローカルのリモートリポジトリ情報のみを更新する。

    cloneまたは前回のfetch以降にpushされた内容をローカル・リポジトリに反映する。 ワーキングディレクトリのファイルのマージはされない。ワーキングディレクトリのファイルに 反映する場合は、後述するgit mergeを実行する必要がある。

      > git fetch [リポジトリURLまたはエイリアス名]
    
  • リモートリポジトリの変更をダウンロードして、さらにローカルブランチへマージする。

    マージ先を省略すると、HEADが対象になる。 コロンで区切られた箇所をrefspecと呼ばれて、基本的にsrc:distという形式を取る。

      > git pull [リポジトリURLまたはエイリアス名] [リモートのマージ元]:[ローカルのマージ先]
      > git pull [リポジトリURLまたはエイリアス名] [ブランチ名]
    
  • ローカルリポジトリの変更をアップロードして、リモートリポジトリに反映する。

    pushできる条件は、そのリポジトリからcloneしており、それ以降誰もpushして ないことが条件。リモートとローカルのリポジトリ内容に違いがある場合は、==pushできない==。 その場合、git fetchgit mergeまたはgit pullして、リモートとローカルのリポジトリの 整合性を合わせてから実行する。

    下記例だと、ローカルのmybranchをリモートリポジトリoriginの masterブランチにマージすることになる。

      $ git push [リポジトリURLまたはエイリアス名] [ローカルのブランチ名]:[リモートのブランチ名]
      $ git push origin master:master
      $ git push [リポジトリURLまたはエイリアス名] [ブランチ名]
      $ git push origin master