演習 - 共有リポジトリを使用して共同作業を行う

完了

両方が同じネットワーク上にいる場合は、一方のリポジトリから直接プルすることができます。 しかし、それは手間のかかるプロセスであり、ほとんどのコラボレーターは同じネットワーク上にはいません。 すべてのコラボレーターがプッシュおよびプルできる中央リポジトリを設定することをお勧めします。

プロジェクトについて友達の Bob という開発者に知らせたところ、Bob から参加したいと頼まれました。これがまさにあなたが行うことにしたことです。そのため、中央リポジトリ (''ベア リポジトリ'' ともいう) を設定します。

ベア リポジトリを作成する

必要なのは、作業ツリーがないリポジトリです。 ベア リポジトリには、作業ツリーよりも優れた点がいくつかあります。

  • 作業ツリーがない場合、どのブランチがチェックアウトされているかを気にすることなく、だれでも変更をプッシュできます。
  • Git では、他のユーザーがあなたのものと競合する可能性のある変更をいつプッシュしたかを簡単に検出できます。
  • 共有リポジトリは、任意の開発者数に応じて拡大縮小されます。 ベア リポジトリがある場合、共有リポジトリについてだけでなく、プルする必要がある可能性のある他のすべてのコラボレーターについても把握する必要があります。
  • すべてのユーザーがアクセスできるサーバーに共有リポジトリを配置すれば、ファイアウォールやアクセス許可について心配する必要はありません。
  • Git では各コミットの実行者を追跡するため、サーバー上に個別のアカウントは必要ありません (GitHub では、何百万ものユーザーすべてが git アカウントを共有しています。 だれもが Secure Shell (SSH) 暗号化ネットワーク プロトコルを使用しており、ユーザーはそれぞれの公開キーによって識別されます)。

共有用のベア リポジトリを作成するのは簡単です。

  1. ベア リポジトリを保持するために、Alice および Cats ディレクトリと同じレベルで Shared.git という名前の新しいディレクトリを作成します。

    cd ..
    mkdir Shared.git
    cd Shared.git
    
    

    ディレクトリ名は重要ではありませんが、これらの演習では Shared.git ディレクトリ、または単に "共有" ディレクトリと言います。

    ディレクトリに Shared.git という名前を付けるのは、作業ツリーと区別するためにベア リポジトリに .git で終わる名前を割り当てるという長く続いている習慣に従うことです。 これは慣例になっていることですが、必須ではありません。

  2. ここで、次のコマンドを使用して、共有ディレクトリにベア リポジトリを作成します。

    git init --bare
    
    
  3. リポジトリがまだベアの場合、git checkout コマンドを使用して既定のブランチの名前を設定することはできません。 このタスクを実行するために、HEAD ブランチを別のブランチ (この場合は main ブランチ) をポイントするように変更できます。

    git symbolic-ref HEAD refs/heads/main
    
    
  4. 次の手順では、"自分自身の" リポジトリの内容を共有リポジトリに取得します。 これらのコマンドを使用して、自分のリポジトリが格納されているプロジェクト ディレクトリに戻り、origin リモートを設定して、最初のプッシュを実行します。

    cd ../Cats
    git remote add origin ../Shared.git
    git push origin main
    
    
  5. 出力を確認します。 出力には成功したことが示されるはずです。

    Counting objects: 12, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (8/8), done.
    Writing objects: 100% (12/12), 1.07 KiB | 0 bytes/s, done.
    Total 12 (delta 1), reused 0 (delta 0)
    To ../Shared.git
     * [new branch]      main -> main
    
  6. 最初にクローンしてリポジトリを作成した場合と同じように、pushpull で、originmain ブランチが既定で使用されるようにしたいと考えています。 しかしまず、追跡するブランチを Git に指示する必要があります。

    git branch --set-upstream-to origin/main
    
    
  7. この出力を確認します。

    Branch main set up to track remote branch main from origin.
    

    新しいリポジトリにはブランチがないため、最初のプッシュの前にこのコマンドを実行しようとすると、Git によって通知されます。 Git では、存在しないブランチを追跡することはできません。 Git の内部で行われるのは、.git/refs/remotes/origin 内で trunk という名前のファイルを探すことだけです。

コラボレーター用の設定

次の手順では、Bob がベア リポジトリをクローンしてから、Alice が自身のリポジトリ内に origin を設定して、共有リポジトリがプッシュとプルのターゲットになるようにします。

  1. プロジェクト ディレクトリの兄弟である Bob という名前のディレクトリを作成してから、Bob ディレクトリに移動します。

    cd ..
    mkdir Bob
    cd Bob
    
    
  2. ここで、共有リポジトリをクローンします (コマンドの最後にピリオドを必ず含めてください)。

    git clone ../Shared.git .
    
    
  3. 現在、Alice のリポジトリは、自身のリポジトリに対してプッシュとプルを行うように構成されています。 次のコマンドを使用して、Alice ディレクトリに移動し、共有リポジトリを指すように origin を変更します。

    cd ../Alice
    git remote set-url origin ../Shared.git
    
    

共同作業を開始する

これで Bob は Web サイトで作業するように設定されました。Bob はページの下部にフッターを追加することにしました。 少しの間、Bob と Alice のペルソナを使用して、共同作業の基本を学習しましょう。

  1. まず Bob ディレクトリに移動して、Bob として作業します。

    cd ../Bob
    git config user.name Bob
    git config user.email bob@contoso.com
    
    
  2. index.html を開き、<hr> 要素をこの行 (<body> 要素の末尾にある) に置き換えます。

    <footer><hr>Copyright (c) 2021 Contoso Cats</footer>
    

    その後、ファイルを保存して、エディターを閉じます。

  3. 変更をコミットし、リモートの origin にプッシュします。

    git commit -a -m "Put a footer at the bottom of the page"
    git push
    
    
  4. 出力を確認します。 次の例のような警告が表示されても、心配はありません。 この警告は単に、Git の既定の動作の変更について、ユーザーに知らせるためのものです。 今後、この警告が表示されないようにしたい場合は、git config --global push.default simple を実行できます。

    warning: push.default is unset; its implicit value has changed in
    Git 2.0 from 'matching' to 'simple'. To squelch this message
    and maintain the traditional behavior, use:
    
      git config --global push.default matching
    
    To squelch this message and adopt the new behavior now, use:
    
      git config --global push.default simple
    
    When push.default is set to 'matching', git will push local branches
    to the remote branches that already exist with the same name.
    
    Since Git 2.0, Git defaults to the more conservative 'simple'
    behavior, which only pushes the current branch to the corresponding
    remote branch that 'git pull' uses to update the current branch.
    
    See 'git help config' and search for 'push.default' for further information.
    (the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
    'current' instead of 'simple' if you sometimes use older versions of Git)
    
  5. Bob がサイトの編集を行う間、Alice も行います。 Alice はページにナビゲーション バーを追加することにしました。 この追加では、Alice は 2 つのファイル (index.htmlsite.css) を変更する必要があります。 まず Alice ディレクトリに戻ります。

    cd ../Alice
    
    
  6. 次に、index.html を開き、8 行目の <body> タグの直後に次の行を挿入します。

    <nav><a href="./index.html">home</a></nav>
    

    その後、ファイルを保存して、エディターを閉じます。

  7. その後、CSS フォルダーにある site.css を開き、最下部に次の行を追加します。

    nav { background-color: #C0D8DF; }
    

    ファイルを保存して、エディターを閉じます。

  8. ここで、Alice が Bob から、Bob がサイトに変更を加えたことを知らせる電子メールを受信したとします。 Alice は独自のものをコミットする前に、Bob の変更をプルすることにしました (Alice が既にその変更をコミット済みである場合、別のモジュールで説明されている、異なる問題が発生します)。Alice はこのコマンドを実行します。

    git pull
    
    
  9. 出力を確認します。 出力からは、Git によって問題の発生が防がれたように見えます。

    remote: Counting objects: 3, done.
    remote: Compressing objects: 100% (3/3), done.
    remote: Total 3 (delta 2), reused 0 (delta 0)
    Unpacking objects: 100% (3/3), done.
    From ../Shared
       843d142..2cf6cbf  main     -> origin/main
    Updating 843d142..2cf6cbf
    error: Your local changes to the following files would be overwritten by merge:
            index.html
    Please commit your changes or stash them before you can merge.
    Aborting
    

    Git により、プルを実行すると Alice の index.html バージョンが上書きされ、自分の変更が失われることが警告されます。 これは、Bob も index.html を変更したためです。 Alice が index.html を変更していなかった場合は、Git によってマージがコミットされているはずです。

  10. git diff コマンドを使用して、Bob が index.html にどのような変更を加えたかを確認します。

    git diff origin -- index.html
    
    
  11. 出力を確認します。 出力からは、Alice の変更と Bob の変更が重複しないことが明らかです。 そこで、Alice は自分の変更を "一時退避" することができます。

    git stash を使用すると、いくつかの一時的なコミットを行うことによって、作業ツリーとインデックスの状態を保存できます。 一時退避は、別の作業を行う間、"実際に" コミットせずに、またはリポジトリ履歴に影響を与えずに、現在の作業を保存するための手段と考えることができます。

    実際には、Alice はプルを試みる前に、自分の変更を一時退避またはコミットしておく必要があります。 "ダーティな" 作業ツリーに対してプルすると、簡単に回復できないことが実行される可能性があるため、危険です。

    次のコマンドを使用して、Alice の変更を一時退避します。

    git stash
    
    
  12. 出力を確認します。 これはこの例のようになるはずです。

    Saved working directory and index state WIP on main: 95bbc3b Change background color to light blue
    HEAD is now at 95bbc3b Change background color to light blue
    
  13. これで Alice は安全にプルすることができます。その後、スタックとして編成された一時退避を "ポップ" することができます。 (実際、git stashgit stash push の省略形です。これは、まだ支払っていない請求書を収納する棚によく似ています)。これらのコマンドを実行します。

    git pull
    git stash pop
    
    

    一時退避をポップすると、変更がマージされます。 変更が重複する場合は、競合が発生する可能性があります。 Microsoft Learn のより高度な Git モジュールで、これらの状況を解決する方法を学習することができます。

  14. 出力を確認します。 Alice には、マージが成功し、変更は戻されたものの、まだコミット用にステージングされていないことを知らせるこの出力が示されるはずです。

    Auto-merging index.html
    On branch main
    Your branch is up-to-date with 'origin/main'.
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   CSS/site.css
            modified:   index.html
    
    no changes added to commit (use "git add" and/or "git commit -a")
    Dropped refs/stash@{0} (0cfb7b75d56611d9fc6a6ab660a51f5582b8d9c5)
    

    この時点で、Alice は作業を続行するか、単に変更をコミットしてプッシュすることができます。 ナビゲーション バーと同じスタイルをフッターに割り当て、Alice としてもう 1 つ変更を加えましょう。

  15. CSS フォルダーにある site.css を開き、3 行目 (<nav> 要素のスタイルを指定するもの) をこの共有 CSS 規則に置き換えます。 その後、通常どおり、変更を保存してエディターを閉じます。

    nav, footer { background-color: #C0D8DF; }
    
  16. ここで、変更をコミットし、それらを共有リポジトリにプッシュします。

    git commit -a -m "Stylize the nav bar"
    git push
    
    

    これで、更新されたサイトが共有リポジトリに追加されました。

  17. 最後に、プロジェクト ディレクトリに戻り、プルを実行します。

    cd ../Cats
    git pull
    
    
  18. index.html (プロジェクト ディレクトリにあるもの) を開いて、Bob と Alice の両方によって行われた変更があなたのローカル リポジトリに存在することを確認します。 index.html に最新のコードがあることを確認します。

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset='UTF-8'>
        <title>Our Feline Friends</title>
        <link rel="stylesheet" href="CSS/site.css">
      </head>
      <body>
        <nav><a href="./index.html">home</a></nav>
        <h1>Our Feline Friends</h1>
        <p>Eventually we will put cat pictures here.</p>
        <footer><hr>Copyright (c) 2021 Contoso Cats</footer>
      </body>
    </html>
    
  19. 現時点では、あなたのリポジトリと Alice のリポジトリは同期されていますが、Bob のリポジトリは同期されていません。 最後の作業として、Bob を最新の状態にします。

    cd ../Bob
    git pull
    
    

これで、3 つのリポジトリすべてが同期されました。 共有リポジトリは、すべてのユーザーにとっての信頼できる単一のソースであり、すべてのプッシュとプルが共有リポジトリに送信されます。

Web サイトがどのように表示されるか知りたい場合は、次のプレビューをご覧ください。

Screenshot of the rendered Cats website.

必要に応じて、ファイルをダウンロードし、ローカルでプレビューすることができます。

  1. Cats フォルダーを圧縮します。

    cd ..
    zip -r Cats.zip Cats
    
    
  2. zip ファイルをダウンロードします。

    download Cats.zip
    
    
  3. ここで、ローカル コンピューター上でファイルを解凍し、index.html を開いて自分で確認します。