From bd69774191bc62d4e75cf18ba1ffe0e4c5e83823 Mon Sep 17 00:00:00 2001 From: Bjarke Sporring Date: Thu, 15 Jan 2026 17:25:33 +0100 Subject: [PATCH] feat: drastically simplify the multiplayer module --- 01-essentials/08-multiplayer/03_README.md | 1398 ++------------------- 01-essentials/08-multiplayer/04_TASKS.md | 395 ------ 01-essentials/08-multiplayer/numbers.txt | 11 + 3 files changed, 142 insertions(+), 1662 deletions(-) delete mode 100644 01-essentials/08-multiplayer/04_TASKS.md create mode 100644 01-essentials/08-multiplayer/numbers.txt diff --git a/01-essentials/08-multiplayer/03_README.md b/01-essentials/08-multiplayer/03_README.md index ff8a010..62cad92 100644 --- a/01-essentials/08-multiplayer/03_README.md +++ b/01-essentials/08-multiplayer/03_README.md @@ -1,1303 +1,167 @@ -# Module 08: Multiplayer Git - The Number Challenge +# Multiplayer Git -## Learning Objectives +Work with others using branches and pull requests. -By the end of this module, you will: -- Clone and work with remote repositories on a cloud server -- Collaborate with teammates using a shared repository -- Experience push rejections when your local repository is out of sync -- Resolve merge conflicts in a real team environment -- Practice the fundamental push/pull workflow -- Apply all the Git skills you've learned in a collaborative setting +## Goal -## Welcome to Real Collaboration! +Learn to collaborate on a shared repository using: +- **Branches** - work independently without breaking main +- **Pull Requests** - review and merge changes safely -Congratulations on making it this far! You've learned Git basics: committing, branching, merging, and even resolving conflicts solo. But here's where it gets real - **working with actual teammates on a shared codebase**. +## The Workflow -This module is different from all the others. There's no `setup.ps1` script creating a simulated environment. Instead, you'll work with: -- A real Git server: **Azure DevOps** (your facilitator will provide the specific URL) -- Real teammates -- A shared repository where everyone works together -- Real merge conflicts when multiple people edit the same file -- Real push rejections when your local repository falls out of sync +``` +1. Create branch → 2. Make changes → 3. Push branch + ↓ +6. Delete branch ← 5. Merge PR ← 4. Create PR +``` -**This is exactly how professional developers collaborate every day on GitHub, GitLab, Bitbucket, Azure DevOps, and company Git servers.** - -**New to remote Git commands?** Check out [GIT-BASICS.md](./GIT-BASICS.md) for simple explanations of clone, push, pull, and fetch! - -Ready? Let's collaborate! +This is how professional teams work together on code. --- -## The Number Challenge +## Step 1: Clone the Repository -### What You'll Do - -Your team will work together to sort a jumbled list of numbers (0-20) into the correct order. The repository contains a file called `numbers.txt` with numbers in random order: +Get the repository URL from your facilitator, then: +```powershell +git clone +code ``` -17 -3 -12 -8 -19 -... -``` - -**Your goal:** Work as a team to rearrange the numbers so they appear in order from 0 to 20: - -``` -0 -1 -2 -3 -4 -... -20 -``` - -**The rules:** -- Each person moves **ONE number per commit** -- You **MUST pull before making changes** to get the latest version -- **Communicate with your team** - coordination is key! - -**The challenge:** You'll experience merge conflicts when two people edit the file at the same time, and push rejections when your local copy is out of sync with the server. - -### Why This Exercise? - -This exercise teaches collaboration in a safe, structured way: - -1. **Simple task:** Moving a number is easy. The hard part is Git, not the work itself. -2. **Clear success:** You can instantly see when all numbers are sorted. -3. **Guaranteed conflicts:** Multiple people editing the same file creates conflicts to practice resolving. -4. **Push rejections:** You'll experience what happens when your database goes out of sync with the remote. -5. **Team coordination:** Success requires communication and collaboration. -6. **Safe experimentation:** It's okay to make mistakes - you can always pull a fresh copy! - -### Repository Structure - -``` -number-challenge/ -├── numbers.txt # The file everyone edits - contains numbers 0-20 -└── README.md # Quick reference for the challenge -``` - -**Note:** The repository is already set up on the server. You'll clone it and start collaborating! --- -## Prerequisites +## Step 2: Create a Branch -Before starting, ensure you have: +Never work directly on `main`. Create your own branch: -### 1. Your Azure DevOps Account - -Your facilitator will provide: -- **Organization and Project URLs** for the workshop -- **Azure DevOps account credentials** (Microsoft Account or Azure AD) -- **SSH Key Setup** (Recommended - see below) - -**First-time setup:** Visit the Azure DevOps URL provided by your facilitator and sign in to verify your account works. - -### 2. Git Configuration - -Verify your Git identity is configured: - -```bash -git config --global user.name -git config --global user.email +```powershell +git switch -c ``` -If these are empty, set them now: +This creates a new branch and switches to it. -```bash -git config --global user.name "Your Name" -git config --global user.email "your.email@example.com" +--- + +## Step 3: Make Changes + +1. Open `numbers.txt` in VS Code +2. Move one number to its correct position +3. Save the file (`Ctrl+S`) + +--- + +## Step 4: Commit and Push + +```powershell +git add . +git commit -m "fix: move 7 to correct position" +git push ``` -**Why this matters:** Every commit you make will be tagged with this information. +Your branch is now on Azure DevOps. -### 3. Authentication Setup: SSH Keys (Recommended) +--- -**SSH is the best practice for secure Git authentication.** It provides secure, passwordless access to Azure DevOps without exposing credentials. +## Step 5: Create a Pull Request -#### Quick SSH Setup +[Detailed guide](https://learn.microsoft.com/en-us/azure/devops/repos/git/pull-requests?view=azure-devops&tabs=browser#create-a-pull-request) -**If you haven't set up SSH keys yet, follow these steps:** +1. Go to Azure DevOps in your browser +2. Navigate to **Repos** → **Pull Requests** 3. Click **New Pull Request** +4. Set: + - **Source branch:** `` + - **Target branch:** `main` +5. Add a title describing your change +6. Click **Create** -1. **Generate SSH key:** - ```bash - ssh-keygen -t rsa -b 4096 -C "your.email@example.com" - ``` - Press Enter to accept default location, optionally add a passphrase for extra security. +--- - **Note:** Azure DevOps requires RSA keys. See [AZURE-DEVOPS-SSH-SETUP.md](../../AZURE-DEVOPS-SSH-SETUP.md) for details on why we use RSA. +## Step 6: Review and Merge -2. **Copy your public key:** +1. Review the changes shown in the PR (Person B) +2. If everything looks good, click **Complete** +3. Select **Complete merge** +4. Your changes are now in `main` - **Linux/Mac:** - ```bash - cat ~/.ssh/id_rsa.pub - ``` +--- - **Windows PowerShell:** +## Step 7: Update Your Local Main + +After merging, update your local copy: + +```powershell +git switch main +git pull +``` + +--- + +## Step 8: Repeat + +1. Create a new branch for your next change +2. Make changes, commit, push +3. Create another PR +4. Continue until all numbers are sorted + +--- + +## Step 9: Create a merge conflict + +1. Both people should create a branch with changes to `feature-1` and `feature-2`, you task is to change the position of number 5. Where you place it is up to you. +2. Now both people should push their respective branch `git push ` +3. Now merge `feature-1` branch first, going throught the Pull Request flow. +4. Then merge `feature-2` branch second, and notice you'll get a MERGE CONFLICT. +5. It is not the owner of `feature-2` branch to resolve the conflict. This is done by merge the `main` branch into `feature-2` locally and so the owner of `feature-2` has to do the following + ```pwsh + # First get the latest changes on main + git switch main + git pull + + # Then go back to the branch you can from + git switch feature-2 + + # Now we resolve the merge. We're merging the main branch INTO the feature-2 branch. + git merge main + # Resolve the merge conflict in numbers.txt + # Once resolved + git add numbers.txt + git commit + # VSCode will open up with a default message of "Merge main into feature-2" + # finish the commit. And push the changes + git push + ``` +6. Now the owner of `feature-2` can checkout the pull request on azure again and see that the merge conflict has been resolved and can therefore "Complete" the merge request, using the button in the top right corner with the name "Complete" + +## Quick Reference + +| Command | What It Does | +|---------|--------------| +| `git switch -c ` | Create and switch to new branch | +| `git push -u origin ` | Push branch to Azure DevOps | +| `git switch main` | Switch to main branch | +| `git pull` | Get latest changes from remote | + +--- + +## Common Issues + +### "My PR has conflicts" +1. Update your branch with latest main: ```powershell - type $HOME\.ssh\id_rsa.pub + git switch main + git pull + git switch + git merge main ``` +2. Resolve conflicts in VS Code +3. Commit and push again -3. **Add to Azure DevOps:** - - Sign in to Azure DevOps - - Click your profile icon (top-right) → **User settings** - - Select **SSH Public Keys** - - Click **+ New Key** - - Paste your public key and give it a name (e.g., "Workshop Laptop 2026") - - Click **Save** - - ![Azure DevOps - SSH Public Keys](./images/azure-devops-ssh-keys.png) - *Navigate to User Settings → SSH Public Keys to add your SSH key* - -4. **Test your SSH connection:** - ```bash - ssh -T git@ssh.dev.azure.com - ``` - - Expected output: `remote: Shell access is not supported.` - This is normal and means authentication worked! - -**For detailed SSH setup instructions including troubleshooting, see:** [AZURE-DEVOPS-SSH-SETUP.md](../../AZURE-DEVOPS-SSH-SETUP.md) - -#### Alternative: HTTPS with Personal Access Token (PAT) - -If you cannot use SSH (firewall restrictions, etc.), you can use HTTPS with a Personal Access Token: - -1. Sign in to Azure DevOps -2. Click your profile icon → **Personal access tokens** -3. Click **+ New Token** -4. Give it a name, set expiration, and select **Code (Read & Write)** scope -5. Click **Create** and **copy the token** (you won't see it again!) -6. Use the token as your password when Git prompts for credentials - -**Note:** SSH is recommended for security and convenience. With SSH, you won't need to enter credentials for every push/pull. - ---- - -## Part 1: Getting Started (15 minutes) - -### Step 1: Get Ready - -Your facilitator will explain the exercise. Everyone on the team will work together on the same repository. - -**Important:** Everyone will work on the **same branch (`main`)**. This simulates real team development where multiple developers collaborate on a shared codebase. - -### Step 2: Understand the Exercise - -Your team will collaborate to sort the numbers in `numbers.txt` from 0 to 20. - -**The approach:** -- Everyone works on the same file (`numbers.txt`) -- Everyone works on the same branch (`main`) -- Each person moves one number per commit -- Communication is key to avoid too many conflicts! - -### Step 3: Clone the Repository - -Your facilitator will provide the exact repository URL. The format depends on your authentication method: - -**Using SSH (Recommended):** - -```bash -# Replace {organization}, {project}, and {repository} with values from your facilitator -git clone git@ssh.dev.azure.com:v3/{organization}/{project}/number-challenge -cd number-challenge -``` - -**Example:** -```bash -git clone git@ssh.dev.azure.com:v3/workshoporg/git-workshop/number-challenge -cd number-challenge -``` - -**Using HTTPS (with PAT):** - -```bash -# Replace {organization} and {project} with values from your facilitator -git clone https://dev.azure.com/{organization}/{project}/_git/number-challenge -cd number-challenge -``` - -**Note:** Use the exact URL provided by your facilitator to ensure you're cloning the correct repository. - -**Expected output:** - -``` -Cloning into 'number-challenge'... -remote: Enumerating objects: 10, done. -remote: Counting objects: 100% (10/10), done. -remote: Compressing objects: 100% (7/7), done. -remote: Total 10 (delta 2), reused 0 (delta 0), pack-reused 0 -Receiving objects: 100% (10/10), done. -Resolving deltas: 100% (2/2), done. -``` - -Success! You now have a local copy of the shared repository. - -### Step 4: Explore the Repository - -Let's see what we're working with: - -```bash -# List files -ls -la - -# View the numbers file -cat numbers.txt -``` - -**What you'll see in `numbers.txt`:** +### "I need to make more changes to my PR" +Just commit and push to the same branch - the PR updates automatically: +```powershell +git add . +git commit -m "fix: address review feedback" +git push ``` -17 -3 -12 -8 -19 -1 -14 -6 -11 -0 -20 -9 -4 -16 -2 -18 -7 -13 -5 -15 -10 -``` - -The numbers are all jumbled up! Your team's goal is to sort them from 0 to 20. - -### Step 5: Understanding the Workflow - -**For this exercise, everyone works on the `main` branch together.** - -Unlike typical Git workflows where you create feature branches, this exercise intentionally has everyone work on the same branch to experience: -- **Push rejections** when someone else pushed before you -- **Merge conflicts** when two people edit the same line -- **The pull-before-push cycle** that's fundamental to Git collaboration - -**There's no need to create a branch** - you'll work directly on `main` after cloning. - ---- - -## Part 2: Your First Contribution (20 minutes) - -Now you'll practice the basic collaborative workflow: make a change, commit, push, and help others pull your changes. - -### Step 1: Decide Who Goes First - -Pick someone to go first. They'll move one number to its correct position. - -### Step 2: First Person - Move ONE Number - -**First person:** Open `numbers.txt` in your text editor. - -Look at the file and find a number that's in the wrong position. Let's say you decide to move the `0` to the top. - -**Before:** -``` -17 -3 -12 -8 -19 -1 -14 -6 -11 -0 ← Let's move this to the top! -20 -... -``` - -**After editing:** -``` -0 ← Moved to the top! -17 -3 -12 -8 -19 -1 -14 -6 -11 -20 -... -``` - -**Key point:** Move ONLY ONE number per commit. This keeps things simple and helps everyone track changes. - -### Step 3: Commit Your Change - -```bash -git status -# You should see: modified: numbers.txt - -git add numbers.txt -git commit -m "Move 0 to its correct position" -``` - -**Expected output:** - -``` -[main abc1234] Move 0 to its correct position - 1 file changed, 1 insertion(+), 1 deletion(-) -``` - -### Step 4: Push to Remote - -This uploads your commit to the shared server: - -```bash -git push origin main -``` - -**Expected output:** - -``` -Enumerating objects: 5, done. -Counting objects: 100% (5/5), done. -Delta compression using up to 8 threads -Compressing objects: 100% (3/3), done. -Writing objects: 100% (3/3), 345 bytes | 345.00 KiB/s, done. -Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 -remote: Analyzing objects... (100%) (3/3) (X ms) -remote: Storing packfile... done (X ms) -remote: Storing index... done (X ms) -To ssh.dev.azure.com:v3/{organization}/{project}/number-challenge - abc1234..def5678 main -> main -``` - -Success! Your change is now on the server for everyone to see. - -### Step 5: Others - Pull the Change - -**Everyone else:** Make sure you get the latest changes: - -```bash -# Pull the changes from the server -git pull origin main -``` - -**Expected output:** - -``` -From ssh.dev.azure.com:v3/{organization}/{project}/number-challenge - * branch main -> FETCH_HEAD -Updating 123abc..456def -Fast-forward - numbers.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) -``` - -**Verify you have the update:** - -```bash -cat numbers.txt -# Should show 0 at the top -``` - -You now have the first person's change! - -### Step 6: Next Person's Turn - -**Next person:** Now it's your turn! Pick a different number and move it to its correct position. - -Follow the same cycle: -1. Pull first: `git pull origin main` (always get the latest!) -2. Edit `numbers.txt` - move ONE number -3. Commit: `git add numbers.txt && git commit -m "Move X to correct position"` -4. Push: `git push origin main` -5. Tell the team you pushed! - -### Step 7: Keep Taking Turns - -Continue this pattern: -- **Always pull before editing** -- Move one number per person -- Commit with a clear message -- Push to share with the team -- Communicate when you've pushed - -**As you work, the file gradually becomes more sorted:** - -``` -After a few rounds: -0 -1 -2 -3 -17 ← Still needs to be moved -12 ← Still needs to be moved -... -``` - -**Congratulations! You've completed your first collaborative Git workflow!** You've learned the core cycle: pull → work → commit → push. This is what professional developers do hundreds of times per day. - ---- - -## Part 3: Deliberate Conflict Exercise (30 minutes) - -Now for the **real** learning: merge conflicts! You'll deliberately create a conflict, then resolve it together. - -### The Scenario - -Merge conflicts happen when two people edit the same lines in the same file. Git can't automatically decide which version to keep, so it asks you to resolve it manually. - -**What you'll do:** -1. Two people will BOTH edit the same line in `numbers.txt` -2. Person A pushes first (succeeds) -3. Person B tries to push (gets rejected!) -4. Person B pulls (sees conflict markers) -5. You resolve the conflict together -6. Person B pushes the resolution - -This is a **deliberate practice** scenario. In real projects, conflicts happen by accident - now you'll know how to handle them! - -### Setup: Choose Two People - -Pick two people to create the conflict. Let's call them **Person A** and **Person B**. - -Everyone else can watch and learn - you'll create your own conflicts later! - -### Step 1: Both People Start Fresh - -Make sure you both have the latest code: - -```bash -git pull origin main - -# Check status - should be clean -git status -``` - -Both people should see: "Your branch is up to date with 'origin/main'" and "nothing to commit, working tree clean" - -### Step 2: Person A - Make Your Change First - -**Person A:** Open `numbers.txt` and move a specific number. Let's say you decide to move `17` down a few lines. - -**Before:** -``` -17 ← Let's move this -3 -12 -8 -``` - -**After (Person A's version):** -``` -3 -17 ← Moved here -12 -8 -``` - -**Commit and push IMMEDIATELY:** - -```bash -git add numbers.txt -git commit -m "Person A: Move 17 down" -git push origin main -``` - -Person A should see the push succeed. - -### Step 3: Person B - Make DIFFERENT Change (DON'T PULL YET!) - -**Person B:** This is critical - do NOT pull Person A's changes yet! - -Instead, edit the SAME lines with a DIFFERENT change. Move `17` to a different position: - -**Before:** -``` -17 ← Let's move this somewhere else -3 -12 -8 -``` - -**After (Person B's version):** -``` -3 -12 -17 ← Moved to a different position than Person A! -8 -``` - -**Commit (but don't push yet):** - -```bash -git add numbers.txt -git commit -m "Person B: Move 17 down" -``` - -### Step 4: Person B - Try to Push (This Will Fail!) - -```bash -git push origin main -``` - -**You'll see an error like this:** - -``` -To ssh.dev.azure.com:v3/{organization}/{project}/number-challenge - ! [rejected] main -> main (fetch first) -error: failed to push some refs to 'git@ssh.dev.azure.com:v3/{organization}/{project}/number-challenge' -hint: Updates were rejected because the remote contains work that you do -hint: not have locally. This is usually caused by another repository pushing -hint: to the same ref. You may want to first integrate the remote changes -hint: (e.g., 'git pull ...') before pushing again. -hint: See the 'Note about fast-forwards' in 'git push --help' for details. -``` - -**Don't panic!** This is completely normal and expected. Git is protecting you from overwriting Person A's work. - -**What happened:** Person A pushed commits that you don't have. Git requires you to pull first and integrate their changes before you can push yours. - -### Step 5: Person B - Pull and See the Conflict - -```bash -git pull origin main -``` - -**You'll see:** - -``` -From ssh.dev.azure.com:v3/{organization}/{project}/number-challenge - * branch main -> FETCH_HEAD -Auto-merging numbers.txt -CONFLICT (content): Merge conflict in numbers.txt -Automatic merge failed; fix conflicts and then commit the result. -``` - -**This is a merge conflict!** Git tried to merge Person A's changes with yours, but couldn't automatically combine them because you both edited the same lines. - -### Step 6: Check Git Status - -```bash -git status -``` - -**Output:** - -``` -On branch main -You have unmerged paths. - (fix conflicts and run "git commit") - (use "git merge --abort" to abort the merge) - -Unmerged paths: - (use "git add ..." to mark resolution) - both modified: numbers.txt - -no changes added to commit (use "git add" and/or "git commit -a") -``` - -Git is telling you: "The file `numbers.txt` has conflicts. Both of you modified it. Please resolve and commit." - -### Step 7: Open the Conflicted File - -```bash -cat numbers.txt -# Or open in your text editor: code numbers.txt, vim numbers.txt, nano numbers.txt -``` - -**Find the conflict markers:** - -``` -3 -<<<<<<< HEAD -12 -17 -======= -17 -12 ->>>>>>> abc1234567890abcdef1234567890abcdef12 -8 -``` - -### Understanding Conflict Markers - -``` -<<<<<<< HEAD # Start marker -12 # YOUR version (Person B's order) -17 -======= # Divider -17 # THEIR version (Person A's order from remote) -12 ->>>>>>> abc1234... # End marker (shows commit hash) -``` - -**The three sections:** -1. `<<<<<<< HEAD` to `=======`: Your current changes (what you committed locally) -2. `=======` to `>>>>>>>`: Their changes (what Person A pushed to the server) -3. You must choose one, combine them, or write something new - -### Step 8: Resolve the Conflict TOGETHER - -**Talk with the group!** Look at both versions and decide which order makes sense. - -**Person A's version:** -``` -3 -17 -12 -8 -``` - -**Person B's version:** -``` -3 -12 -17 -8 -``` - -**Decide together:** Which is closer to the correct sorted order (0-20)? Or is there a better way? - -**Edit the file to:** -1. Remove ALL conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) -2. Keep the agreed-upon order -3. Make sure the file is clean - -**Example resolved version:** - -``` -3 -12 -17 -8 -``` - -**Save the file!** - -### Step 9: Verify the Resolution - -```bash -cat numbers.txt -``` - -Make sure you don't see any conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`). The file should just contain numbers. - -### Step 10: Mark as Resolved and Commit - -Tell Git you've resolved the conflict: - -```bash -git add numbers.txt -``` - -This stages the resolved file. - -Now commit the resolution: - -```bash -git commit -m "Resolve conflict - agreed on number order" -``` - -**Note:** Git may open an editor with a default merge commit message. You can keep it or customize it. - -**Expected output:** - -``` -[main def5678] Resolve conflict - agreed on number order -``` - -### Step 11: Person B - Push the Resolution - -```bash -git push origin main -``` - -This time it should succeed! The conflict is resolved and the agreed-upon order is on the server. - -### Step 12: Everyone - Pull the Resolved Version - -**Everyone else:** Get the resolved version: - -```bash -git pull origin main -``` - -Check the file - you should see the agreed-upon resolution. - -**You've successfully resolved your first merge conflict together!** In real projects, this is a daily occurrence. You now know exactly what to do when you see those conflict markers. - ---- - -## Part 4: Continue Sorting (Until Complete) - -Now that you understand the pull-push cycle and how to resolve conflicts, continue working as a team to sort all the numbers! - -### The Goal - -Keep working until `numbers.txt` contains all numbers sorted from 0 to 20: - -``` -0 -1 -2 -3 -4 -5 -... -18 -19 -20 -``` - -### The Workflow - -Continue the pattern you've learned: - -1. **Pull first:** Always start with `git pull origin main` -2. **Check the file:** Look at `numbers.txt` to see what still needs sorting -3. **Move one number:** Edit the file to move ONE number closer to its correct position -4. **Commit:** `git add numbers.txt && git commit -m "Move X to position Y"` -5. **Push:** `git push origin main` -6. **Communicate:** Tell the team you've pushed so they can pull -7. **Repeat!** - -### Tips for Success - -**Coordinate with your team:** -- Decide who goes next to avoid too many conflicts -- Call out what number you're working on -- Pull frequently to stay in sync - -**Handle conflicts calmly:** -- If you get a push rejection, don't panic - just pull first -- If you get a merge conflict, work through it together -- Remember: conflicts are normal and you know how to resolve them! - -**Check your progress:** -- View the file regularly: `cat numbers.txt` -- Count how many numbers are in the right position -- Celebrate as the file gets more sorted! - -### When You're Done - -When all numbers are sorted correctly, verify your success: - -```bash -git pull origin main -cat numbers.txt -``` - -**Expected final result:** -``` -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -``` - -**Congratulations!** Your team successfully collaborated using Git to complete the challenge! - ---- - -## Part 5: What You've Learned - -You've now experienced the fundamental Git collaboration workflow that professional developers use every day! - ---- - -## Commands Reference - -### Essential Git Commands for Collaboration - -**Cloning and Setup:** -```bash -git clone # Create local copy of remote repo -git config user.name "Your Name" # Set your name (one-time setup) -git config user.email "your@email.com" # Set your email (one-time setup) -``` - -**Branching:** -```bash -git switch -c # Create and switch to new branch -git switch # Switch to existing branch -git branch # List local branches (* = current) -git branch -a # List all branches (local + remote) -git branch -d # Delete branch (safe - prevents data loss) -``` - -**Making Changes:** -```bash -git status # See current state and changed files -git add # Stage specific file -git add . # Stage all changed files -git commit -m "message" # Commit staged changes with message -git commit # Commit and open editor for message -``` - -**Synchronizing with Remote:** -```bash -git pull origin # Fetch and merge from remote branch -git push origin # Push commits to remote branch -git push -u origin # Push and set upstream tracking -git fetch origin # Download changes without merging -git remote -v # Show configured remotes -``` - -**Conflict Resolution:** -```bash -git status # See which files have conflicts -# Edit files to remove <<<<<<, =======, >>>>>>> markers -git add # Mark file as resolved -git commit -m "Resolve conflict in ..." # Commit the resolution -git merge --abort # Abort merge and go back to before -``` - -**Merging and Integration:** -```bash -git merge # Merge branch into current branch -git merge main # Common: merge main into feature branch -git log --oneline --graph --all # Visualize branch history -``` - -**Viewing Changes:** -```bash -git diff # See unstaged changes -git diff --staged # See staged changes -git show # Show last commit -git log --oneline # See commit history (concise) -git log --oneline --graph # See branch structure visually -``` - ---- - -## Common Scenarios & Solutions - -### "My push was rejected!" - -**Error:** -``` -! [rejected] main -> main (fetch first) -error: failed to push some refs to 'git@ssh.dev.azure.com:v3/{organization}/{project}/number-challenge' -``` - -**What it means:** Someone else pushed commits to the branch since you last pulled. - -**Solution:** -```bash -# Pull their changes first -git pull origin main - -# If conflicts, resolve them (see Part 3) -# If no conflicts, you can now push -git push origin main -``` - ---- - -### "I have merge conflicts!" - -**What you see:** -``` -CONFLICT (content): Merge conflict in numbers.txt -Automatic merge failed; fix conflicts and then commit the result. -``` - -**Solution:** -1. Don't panic - this is normal! -2. Run `git status` to see which files have conflicts -3. Open `numbers.txt` in your editor -4. Find the conflict markers: `<<<<<<<`, `=======`, `>>>>>>>` -5. **Talk with your team** - decide which version makes sense -6. Remove ALL markers and keep the agreed order -7. Verify: `cat numbers.txt` (make sure no markers remain!) -8. Stage: `git add numbers.txt` -9. Commit: `git commit -m "Resolve conflict in numbers.txt"` -10. Push: `git push origin main` - ---- - -### "Someone else pushed, how do I get their changes?" - -**Solution:** -```bash -# Pull the latest changes -git pull origin main -``` - -If you have uncommitted changes, Git might ask you to commit or stash first: -```bash -# Option 1: Commit your changes first -git add numbers.txt -git commit -m "Move number X" -git pull origin main - -# Option 2: Stash your changes temporarily -git stash -git pull origin main -git stash pop # Restore your changes after pull -``` - ---- - -### "Two people edited the same numbers!" - -**This creates a conflict - which is exactly what we want to practice!** - -**Solution:** -Follow the complete conflict resolution workflow from Part 3. The key steps: -1. Person who tries to push second gets rejection -2. They pull (sees conflict) -3. Everyone looks at the conflict markers together -4. Decide which version to keep (or create new version) -5. Remove markers, verify the file, commit, push - ---- - -### "How do I see what changed?" - -**Before committing:** -```bash -git diff # See unstaged changes -git diff --staged # See staged changes (after git add) -``` - -**After committing:** -```bash -git show # Show last commit's changes -git log --oneline # See commit history (one line per commit) -git log --oneline --graph # See branch structure with commits -``` - ---- - -### "I want to start over on this file!" - -**Scenario:** You made a mess and want to restore the file to the last committed version. - -**Solution:** -```bash -# Discard all changes to the file (CAREFUL: can't undo this!) -git restore numbers.txt - -# Or restore to a specific commit -git restore --source=abc1234 numbers.txt -``` - -**If you want to keep your changes but try a different approach:** -```bash -# Save your work temporarily -git stash - -# Work is saved, file is back to clean state -# Later, restore your work: -git stash pop -``` - ---- - -### "I accidentally deleted all the numbers!" - -**Don't worry - Git has your back!** - -**Solution:** -```bash -# If you haven't committed the deletion: -git restore numbers.txt - -# If you already committed the deletion but haven't pushed: -git log --oneline # Find the commit before deletion -git reset --hard abc1234 # Replace abc1234 with the good commit hash - -# If you already pushed: -# Ask your facilitator for help, or let someone else pull and fix it! -``` - ---- - -## Troubleshooting - -### Authentication Issues - -**Problem:** "Authentication failed" or "Permission denied" when pushing or pulling - -**Solution (SSH - Recommended):** - -1. **Verify your SSH key is added to Azure DevOps:** - - Sign in to Azure DevOps - - User Settings (profile icon) → SSH Public Keys - - Confirm your key is listed - -2. **Test SSH connection:** - ```bash - ssh -T git@ssh.dev.azure.com - ``` - - Expected: `remote: Shell access is not supported.` (This is normal!) - - If you get "Permission denied (publickey)": - - Your SSH key is not added or Azure DevOps can't find it - - See [AZURE-DEVOPS-SSH-SETUP.md](../../AZURE-DEVOPS-SSH-SETUP.md) for detailed troubleshooting - -3. **Check your remote URL uses SSH:** - ```bash - git remote -v - ``` - - Should show: `git@ssh.dev.azure.com:v3/...` (not `https://`) - - If it shows HTTPS, switch to SSH: - ```bash - git remote set-url origin git@ssh.dev.azure.com:v3/{organization}/{project}/number-challenge - ``` - -**Solution (HTTPS with PAT):** - -1. **Verify you're using a Personal Access Token** (not your account password) - - Azure DevOps → User Settings → Personal access tokens - - Create new token with **Code (Read & Write)** scope - - Use token as password when Git prompts for credentials - -2. **Check token permissions:** - - Token must have **Code (Read & Write)** scope - - Verify token hasn't expired - -3. **Update stored credentials** (if cached incorrectly): - - **Windows:** - ```powershell - git credential-manager erase https://dev.azure.com - ``` - - **Mac:** - ```bash - git credential-osxkeychain erase https://dev.azure.com - ``` - - **Linux:** - ```bash - git config --global --unset credential.helper - ``` - -**Recommendation:** Use SSH to avoid credential management issues. See [AZURE-DEVOPS-SSH-SETUP.md](../../AZURE-DEVOPS-SSH-SETUP.md). - ---- - -### Can't Pull or Push - "Unrelated Histories" - -**Problem:** -``` -fatal: refusing to merge unrelated histories -``` - -**What happened:** Your local branch and remote branch don't share a common ancestor (rare, but happens if branches were created independently). - -**Solution:** -```bash -git pull origin main --allow-unrelated-histories -``` - -Then resolve any conflicts if they appear. - ---- - -### Accidentally Deleted Numbers - -**Problem:** "I deleted numbers and committed it!" - -**Solution:** - -**If not pushed yet:** -```bash -# Find the commit before deletion -git log --oneline - -# Example: abc1234 was the last good commit -git reset --hard abc1234 -``` - -**If already pushed:** -```bash -# Find the commit with the correct numbers -git log --oneline - -# Restore the file from that commit -git checkout abc1234 -- numbers.txt - -# Commit the restoration -git add numbers.txt -git commit -m "Restore accidentally deleted numbers" -git push origin main -``` - -**Pro tip:** Use `git log --all --full-history -- numbers.txt` to see all commits that touched that file. - ---- - -### File Still Has Conflict Markers - -**Problem:** You thought you resolved the conflict, but when you look at the file: -``` -3 -<<<<<<< HEAD -12 -17 -======= -17 -12 ->>>>>>> abc1234 -8 -``` - -**What happened:** You forgot to remove the conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`). - -**Solution:** -```bash -# Open the file -nano numbers.txt # or vim, code, etc. - -# Search for "<<<<<<<" and remove ALL markers -# Keep only the numbers you want - -# Verify it's clean -cat numbers.txt - -# If it looks good, commit the fix -git add numbers.txt -git commit -m "Remove remaining conflict markers" -``` - ---- - -## Success Criteria - -You've completed this module when you can check off ALL of these: - -**Basic Collaboration:** -- [ ] Cloned the repository from Azure DevOps using SSH -- [ ] Successfully pushed at least one commit to the shared repository -- [ ] Successfully pulled changes from other team members -- [ ] Contributed to sorting the numbers file - -**Conflict Resolution:** -- [ ] Experienced or witnessed a merge conflict -- [ ] Saw the conflict markers in the file (`<<<<<<<`, `=======`, `>>>>>>>`) -- [ ] Resolved a conflict (or helped someone resolve one) -- [ ] Successfully pushed the resolution - -**Push/Pull Cycle:** -- [ ] Experienced a push rejection when someone else pushed first -- [ ] Understood why the push was rejected -- [ ] Pulled changes before pushing again -- [ ] Successfully pushed after pulling - -**Final Result:** -- [ ] The `numbers.txt` file contains all numbers from 0 to 20 in sorted order -- [ ] No conflict markers remain in the file -- [ ] Everyone on the team contributed at least one commit - -**Bonus (if time permits):** -- [ ] Helped someone else resolve a conflict -- [ ] Created multiple merge conflicts and resolved them -- [ ] Experimented with `git stash` when needing to pull with local changes - ---- - -## What You've Learned - -**Collaborative Git Skills:** -- ✅ Cloning repositories from remote Git servers -- ✅ Working with teammates on a shared repository -- ✅ The push/pull cycle for synchronizing work -- ✅ Experiencing and resolving real merge conflicts -- ✅ Understanding push rejections and why they happen -- ✅ Communicating with teammates during collaborative work -- ✅ Using Git in a realistic team environment -- ✅ SSH authentication for secure Git operations - -**Real-World Applications:** - -**These skills are exactly what you'll use at work:** -- This workflow is identical across GitHub, GitLab, Bitbucket, Azure DevOps, and any Git server -- Professional teams do this hundreds of times per day -- Understanding merge conflicts is critical for team collaboration -- Push rejections happen constantly in real teams - you now know how to handle them -- SSH authentication is the industry standard for secure Git operations - -**You're now ready to:** -- Contribute to open source projects on GitHub -- Join a development team and collaborate effectively -- Handle merge conflicts without panic -- Understand the fundamental push/pull workflow -- Work on distributed teams across time zones - ---- - -## What's Next? - -### More Advanced Git Modules - -Continue your Git journey with advanced techniques: - -- **02-advanced/01-rebasing**: Learn to rebase instead of merge for cleaner history -- **02-advanced/02-interactive-rebase**: Clean up messy commits before submitting PRs -- **02-advanced/03-worktrees**: Work on multiple branches simultaneously -- **02-advanced/04-bisect**: Find bugs using binary search through commit history -- **02-advanced/05-blame**: Investigate who changed what and when -- **02-advanced/06-merge-strategies**: Master different merge strategies and when to use them - -### Practice More - -- Try contributing to a real open source project on GitHub -- Practice more complex workflows (multiple feature branches, rebasing, etc.) -- Help teammates at work or school with Git issues - ---- - -## Congratulations! - -**You've completed the Multiplayer Git module!** - -You started this workshop learning basic Git commands like `git init` and `git commit`. Now you're collaborating with teammates, resolving conflicts, and handling push rejections like a professional developer. - -**What makes you different from most beginners:** -- You've experienced REAL merge conflicts and resolved them -- You've worked on a REAL shared repository with teammates -- You've experienced REAL push rejections and learned how to handle them -- You've practiced the entire workflow professionals use daily - -**Most importantly:** You're no longer afraid of merge conflicts or push rejections. You know exactly what to do when you see those `<<<<<<<` markers or get a "rejected" error. - -**Keep practicing, keep collaborating, and welcome to the world of professional Git!** - ---- - -**Happy Collaborating!** diff --git a/01-essentials/08-multiplayer/04_TASKS.md b/01-essentials/08-multiplayer/04_TASKS.md deleted file mode 100644 index b682bdb..0000000 --- a/01-essentials/08-multiplayer/04_TASKS.md +++ /dev/null @@ -1,395 +0,0 @@ -# Multiplayer Git Tasks - -These tasks walk you through collaborating with Git in the cloud. You'll clone a shared repository, make changes, and sync with your teammates. - -## Prerequisites - -Before starting, make sure you have: -- [ ] An account on the team's Azure DevOps project -- [ ] SSH key configured (ask your facilitator if you need help) -- [ ] Git installed on your computer - ---- - -## Task 1: Clone the Repository - -Cloning creates a local copy of a remote repository on your computer. - -### Steps - -1. Get the SSH URL from Azure DevOps: - - Navigate to the repository - - Click **Clone** - - Select **SSH** - - Copy the URL - -2. Open PowerShell and run: - ```powershell - git clone - ``` - -3. Open the folder in VS Code: - ```powershell - code - ``` - -4. Open the VS Code terminal (`` Ctrl+` ``) and verify the clone worked: - ```powershell - git status - git log --oneline --graph --all - ``` - -### What Just Happened? - -``` -Azure DevOps Your Computer -┌─────────────┐ ┌─────────────┐ -│ Repository │ ───── clone ──> │ Repository │ -│ (original) │ │ (copy) │ -└─────────────┘ └─────────────┘ -``` - -You now have: -- A complete copy of all files -- The entire commit history -- A connection back to the original (called "origin") - ---- - -## Task 2: Make Changes and Push - -Pushing sends your local commits to the remote repository. - -### Steps - -1. In VS Code, create a new file: - - Click **File → New File** (or `Ctrl+N`) - - Add some content, for example: `Hello from ` - - Save as `hello-.txt` (use `Ctrl+S`) - -2. In the VS Code terminal, stage and commit your change: - ```powershell - git add . - git commit -m "feat: add greeting from " - ``` - -3. Push to the remote: - ```powershell - git push - ``` - -### What Just Happened? - -``` -Your Computer Azure DevOps -┌─────────────┐ ┌─────────────┐ -│ Commit A │ │ Commit A │ -│ Commit B │ ───── push ───> │ Commit B │ -│ Commit C │ (new!) │ Commit C │ -└─────────────┘ └─────────────┘ -``` - -Your new commit is now on the server. Others can see it and download it. - ---- - -## Task 3: Pull Changes from Others - -Pulling downloads new commits from the remote and merges them into your branch. - -### Steps - -1. Check if there are new changes: - ```powershell - git status - ``` - Look for "Your branch is behind..." - -2. Pull the changes: - ```powershell - git pull - ``` - -3. See what's new: - ```powershell - git log --oneline -10 - ``` - -### What Just Happened? - -``` -Azure DevOps Your Computer -┌─────────────┐ ┌─────────────┐ -│ Commit A │ │ Commit A │ -│ Commit B │ │ Commit B │ -│ Commit C │ ───── pull ───> │ Commit C │ -│ Commit D │ (new!) │ Commit D │ -└─────────────┘ └─────────────┘ -``` - -Your local repository now has all the commits from the remote. - ---- - -## Task 4: The Push-Pull Dance - -When working with others, you'll often need to pull before you can push. - -### The Scenario - -You made a commit, but someone else pushed while you were working: - -``` -Azure DevOps: A ── B ── C ── D (teammate's commit) -Your Computer: A ── B ── C ── E (your commit) -``` - -### Steps - -1. Try to push: - ```powershell - git push - ``` - This will fail with: "Updates were rejected because the remote contains work that you do not have locally" - -2. Pull first: - ```powershell - git pull - ``` - -3. Now push: - ```powershell - git push - ``` - -### What Happened? - -``` -Before pull: - Remote: A ── B ── C ── D - Local: A ── B ── C ── E - -After pull (Git merges automatically): - Local: A ── B ── C ── D ── M - \ / - E ───┘ - -After push: - Remote: A ── B ── C ── D ── M - \ / - E ───┘ -``` - ---- - -## Task 5: Understanding Fetch - -Fetch downloads changes but does **not** merge them. This lets you see what's new before deciding what to do. - -### Steps - -1. Fetch updates from the remote: - ```powershell - git fetch - ``` - -2. See what's different: - ```powershell - git log HEAD..origin/main --oneline - ``` - This shows commits on the remote that you don't have locally. - -3. When ready, merge: - ```powershell - git merge origin/main - ``` - -### Fetch vs Pull - -| Command | Downloads | Merges | Safe to run anytime? | -|---------|-----------|--------|----------------------| -| `git fetch` | Yes | No | Yes | -| `git pull` | Yes | Yes | Usually | - -**Think of it this way:** -- `fetch` = "Show me what's new" -- `pull` = "Give me what's new" (same as `fetch` + `merge`) - ---- - -## Task 6: Working with Branches - -Branches let you work on features without affecting the main code. - -### Steps - -1. Create and switch to a new branch: - ```powershell - git switch -c feature/-greeting - ``` - -2. In VS Code, create a new file: - - Click **File → New File** (or `Ctrl+N`) - - Add some content, for example: `A special greeting` - - Save as `special.txt` (use `Ctrl+S`) - -3. Stage and commit: - ```powershell - git add . - git commit -m "feat: add special greeting" - ``` - -4. Push your branch to the remote: - ```powershell - git push -u origin feature/-greeting - ``` - The `-u` flag sets up tracking so future pushes are simpler. - -5. Go back to main: - ```powershell - git switch main - ``` - ---- - -## Task 7: The Number Challenge - -This is the main collaborative exercise. Your team will work together to sort numbers 0-20 into the correct order. - -### The Setup - -The repository contains a file called `numbers.txt` with numbers 0-20 in random order: - -``` -17 -3 -12 -8 -... -``` - -Your goal: Work as a team to rearrange the numbers so they appear in order from 0 to 20. - -### The Rules - -1. **Each person moves ONE number per commit** -2. **You must pull before making changes** -3. **Communicate with your team** - decide who moves which number - -### Steps - -1. Pull the latest changes: - ```powershell - git pull - ``` - -2. Open `numbers.txt` in VS Code - -3. Find a number that's out of place and move it to the correct position - - For example, if `5` is at the bottom, move it between `4` and `6` - -4. Save the file (`Ctrl+S`) - -5. Commit your change with a clear message: - ```powershell - git add numbers.txt - git commit -m "fix: move 5 to correct position" - ``` - -6. Push your change: - ```powershell - git push - ``` - -7. If push fails (someone else pushed first): - ```powershell - git pull - ``` - Resolve any conflicts, then push again. - -8. Repeat until all numbers are in order! - -### Handling Conflicts - -When two people edit the same part of the file, you'll see conflict markers: - -``` -<<<<<<< HEAD -4 -5 -6 -======= -4 -6 ->>>>>>> origin/main -``` - -To resolve: -1. Decide what the correct order should be -2. Remove the conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) -3. Keep only the correct content: - ``` - 4 - 5 - 6 - ``` -4. Save, commit, and push - -### Success - -When complete, `numbers.txt` should look like: - -``` -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -``` - -Celebrate with your team! - ---- - -## Quick Reference - -| Command | What It Does | -|---------|--------------| -| `git clone ` | Download a repository | -| `git push` | Upload your commits | -| `git pull` | Download and merge commits | -| `git fetch` | Download commits (don't merge) | -| `git switch -c ` | Create and switch to a branch | -| `git push -u origin ` | Push a new branch | - ---- - -## Common Issues - -### "Permission denied (publickey)" -Your SSH key isn't set up correctly. See the SSH setup guide or ask your facilitator. - -### "Updates were rejected" -Someone pushed before you. Run `git pull` first, then `git push`. - -### "Merge conflict" -Two people edited the same lines. See BEST-PRACTICES.md for how to handle this. - -### "There is no tracking information" -Run `git push -u origin ` to set up tracking. diff --git a/01-essentials/08-multiplayer/numbers.txt b/01-essentials/08-multiplayer/numbers.txt new file mode 100644 index 0000000..b033488 --- /dev/null +++ b/01-essentials/08-multiplayer/numbers.txt @@ -0,0 +1,11 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10