演習 - 共有リポジトリを使用して共同作業を行う
両方が同じネットワーク上にいる場合は、一方のリポジトリから直接プルすることができます。 しかし、それは手間のかかるプロセスであり、ほとんどのコラボレーターは同じネットワーク上にはいません。 すべてのコラボレーターがプッシュおよびプルできる中央リポジトリを設定することをお勧めします。
プロジェクトについて友達の Bob という開発者に知らせたところ、Bob から参加したいと頼まれました。これがまさにあなたが行うことにしたことです。そのため、中央リポジトリ (''ベア リポジトリ'' ともいう) を設定します。
ベア リポジトリを作成する
必要なのは、作業ツリーがないリポジトリです。 ベア リポジトリには、作業ツリーよりも優れた点がいくつかあります。
- 作業ツリーがない場合、どのブランチがチェックアウトされているかを気にすることなく、だれでも変更をプッシュできます。
- Git では、他のユーザーがあなたのものと競合する可能性のある変更をいつプッシュしたかを簡単に検出できます。
- 共有リポジトリは、任意の開発者数に応じて拡大縮小されます。 ベア リポジトリがある場合、共有リポジトリについてだけでなく、プルする必要がある可能性のある他のすべてのコラボレーターについても把握する必要があります。
- すべてのユーザーがアクセスできるサーバーに共有リポジトリを配置すれば、ファイアウォールやアクセス許可について心配する必要はありません。
- Git では各コミットの実行者を追跡するため、サーバー上に個別のアカウントは必要ありません (GitHub では、何百万ものユーザーすべてが
git
アカウントを共有しています。 だれもが Secure Shell (SSH) 暗号化ネットワーク プロトコルを使用しており、ユーザーはそれぞれの公開キーによって識別されます)。
共有用のベア リポジトリを作成するのは簡単です。
ベア リポジトリを保持するために、Alice および Cats ディレクトリと同じレベルで Shared.git という名前の新しいディレクトリを作成します。
cd .. mkdir Shared.git cd Shared.git
ディレクトリ名は重要ではありませんが、これらの演習では Shared.git ディレクトリ、または単に "共有" ディレクトリと言います。
ディレクトリに Shared.git という名前を付けるのは、作業ツリーと区別するためにベア リポジトリに
.git
で終わる名前を割り当てるという長く続いている習慣に従うことです。 これは慣例になっていることですが、必須ではありません。ここで、次のコマンドを使用して、共有ディレクトリにベア リポジトリを作成します。
git init --bare
リポジトリがまだベアの場合、
git checkout
コマンドを使用して既定のブランチの名前を設定することはできません。 このタスクを実行するために、HEAD
ブランチを別のブランチ (この場合はmain
ブランチ) をポイントするように変更できます。git symbolic-ref HEAD refs/heads/main
次の手順では、"自分自身の" リポジトリの内容を共有リポジトリに取得します。 これらのコマンドを使用して、自分のリポジトリが格納されているプロジェクト ディレクトリに戻り、
origin
リモートを設定して、最初のプッシュを実行します。cd ../Cats git remote add origin ../Shared.git git push origin main
出力を確認します。 出力には成功したことが示されるはずです。
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
最初にクローンしてリポジトリを作成した場合と同じように、
push
とpull
で、origin
のmain
ブランチが既定で使用されるようにしたいと考えています。 しかしまず、追跡するブランチを Git に指示する必要があります。git branch --set-upstream-to origin/main
この出力を確認します。
Branch main set up to track remote branch main from origin.
新しいリポジトリにはブランチがないため、最初のプッシュの前にこのコマンドを実行しようとすると、Git によって通知されます。 Git では、存在しないブランチを追跡することはできません。 Git の内部で行われるのは、
.git/refs/remotes/origin
内で trunk という名前のファイルを探すことだけです。
コラボレーター用の設定
次の手順では、Bob がベア リポジトリをクローンしてから、Alice が自身のリポジトリ内に origin を設定して、共有リポジトリがプッシュとプルのターゲットになるようにします。
プロジェクト ディレクトリの兄弟である Bob という名前のディレクトリを作成してから、Bob ディレクトリに移動します。
cd .. mkdir Bob cd Bob
ここで、共有リポジトリをクローンします (コマンドの最後にピリオドを必ず含めてください)。
git clone ../Shared.git .
現在、Alice のリポジトリは、自身のリポジトリに対してプッシュとプルを行うように構成されています。 次のコマンドを使用して、Alice ディレクトリに移動し、共有リポジトリを指すように
origin
を変更します。cd ../Alice git remote set-url origin ../Shared.git
共同作業を開始する
これで Bob は Web サイトで作業するように設定されました。Bob はページの下部にフッターを追加することにしました。 少しの間、Bob と Alice のペルソナを使用して、共同作業の基本を学習しましょう。
まず Bob ディレクトリに移動して、Bob として作業します。
cd ../Bob git config user.name Bob git config user.email bob@contoso.com
index.html を開き、
<hr>
要素をこの行 (<body>
要素の末尾にある) に置き換えます。<footer><hr>Copyright (c) 2021 Contoso Cats</footer>
その後、ファイルを保存して、エディターを閉じます。
変更をコミットし、リモートの origin にプッシュします。
git commit -a -m "Put a footer at the bottom of the page" git push
出力を確認します。 次の例のような警告が表示されても、心配はありません。 この警告は単に、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)
Bob がサイトの編集を行う間、Alice も行います。 Alice はページにナビゲーション バーを追加することにしました。 この追加では、Alice は 2 つのファイル (index.html と site.css) を変更する必要があります。 まず Alice ディレクトリに戻ります。
cd ../Alice
次に、index.html を開き、8 行目の
<body>
タグの直後に次の行を挿入します。<nav><a href="./index.html">home</a></nav>
その後、ファイルを保存して、エディターを閉じます。
その後、CSS フォルダーにある site.css を開き、最下部に次の行を追加します。
nav { background-color: #C0D8DF; }
ファイルを保存して、エディターを閉じます。
ここで、Alice が Bob から、Bob がサイトに変更を加えたことを知らせる電子メールを受信したとします。 Alice は独自のものをコミットする前に、Bob の変更をプルすることにしました (Alice が既にその変更をコミット済みである場合、別のモジュールで説明されている、異なる問題が発生します)。Alice はこのコマンドを実行します。
git pull
出力を確認します。 出力からは、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 によってマージがコミットされているはずです。
git diff
コマンドを使用して、Bob が index.html にどのような変更を加えたかを確認します。git diff origin -- index.html
出力を確認します。 出力からは、Alice の変更と Bob の変更が重複しないことが明らかです。 そこで、Alice は自分の変更を "一時退避" することができます。
git stash
を使用すると、いくつかの一時的なコミットを行うことによって、作業ツリーとインデックスの状態を保存できます。 一時退避は、別の作業を行う間、"実際に" コミットせずに、またはリポジトリ履歴に影響を与えずに、現在の作業を保存するための手段と考えることができます。実際には、Alice はプルを試みる前に、自分の変更を一時退避またはコミットしておく必要があります。 "ダーティな" 作業ツリーに対してプルすると、簡単に回復できないことが実行される可能性があるため、危険です。
次のコマンドを使用して、Alice の変更を一時退避します。
git stash
出力を確認します。 これはこの例のようになるはずです。
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
これで Alice は安全にプルすることができます。その後、スタックとして編成された一時退避を "ポップ" することができます。 (実際、
git stash
はgit stash push
の省略形です。これは、まだ支払っていない請求書を収納する棚によく似ています)。これらのコマンドを実行します。git pull git stash pop
一時退避をポップすると、変更がマージされます。 変更が重複する場合は、競合が発生する可能性があります。 Microsoft Learn のより高度な Git モジュールで、これらの状況を解決する方法を学習することができます。
出力を確認します。 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 つ変更を加えましょう。
CSS フォルダーにある site.css を開き、3 行目 (
<nav>
要素のスタイルを指定するもの) をこの共有 CSS 規則に置き換えます。 その後、通常どおり、変更を保存してエディターを閉じます。nav, footer { background-color: #C0D8DF; }
ここで、変更をコミットし、それらを共有リポジトリにプッシュします。
git commit -a -m "Stylize the nav bar" git push
これで、更新されたサイトが共有リポジトリに追加されました。
最後に、プロジェクト ディレクトリに戻り、プルを実行します。
cd ../Cats git pull
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>
現時点では、あなたのリポジトリと Alice のリポジトリは同期されていますが、Bob のリポジトリは同期されていません。 最後の作業として、Bob を最新の状態にします。
cd ../Bob git pull
これで、3 つのリポジトリすべてが同期されました。 共有リポジトリは、すべてのユーザーにとっての信頼できる単一のソースであり、すべてのプッシュとプルが共有リポジトリに送信されます。
Web サイトがどのように表示されるか知りたい場合は、次のプレビューをご覧ください。
必要に応じて、ファイルをダウンロードし、ローカルでプレビューすることができます。
Cats フォルダーを圧縮します。
cd .. zip -r Cats.zip Cats
zip ファイルをダウンロードします。
download Cats.zip
ここで、ローカル コンピューター上でファイルを解凍し、index.html を開いて自分で確認します。