Compare commits
7 Commits
refactor-r
...
cba2d9bb16
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cba2d9bb16 | ||
|
|
968a44f9a5 | ||
|
|
c39573573f | ||
|
|
ee67433fdd | ||
|
|
100e89b23d | ||
| b58080b8e8 | |||
| 2240cbe10d |
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
By the end of this module, you will:
|
By the end of this module, you will:
|
||||||
- Understand what cherry-picking is and how it works
|
- Understand what cherry-picking is and how it works
|
||||||
- Know when to use cherry-pick vs merge or rebase
|
- Know when to use cherry-pick vs merge
|
||||||
- Apply specific commits from one branch to another
|
- Apply specific commits from one branch to another
|
||||||
- Understand common use cases for cherry-picking
|
- Understand common use cases for cherry-picking
|
||||||
- Learn how cherry-pick creates new commits with different hashes
|
- Learn how cherry-pick creates new commits with different hashes
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ Participants need:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Pre-Workshop Setup
|
## Setup
|
||||||
|
|
||||||
### Step 1: Add User Accounts
|
### Step 1: Add User Accounts
|
||||||
|
|
||||||
@@ -131,15 +131,6 @@ git add numbers.txt
|
|||||||
git commit -m "feat: add shuffled numbers for challenge"
|
git commit -m "feat: add shuffled numbers for challenge"
|
||||||
git push
|
git push
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 4: Verify Student Access
|
|
||||||
|
|
||||||
Students added to the project automatically have access. Verify:
|
|
||||||
|
|
||||||
1. Go to **Project Settings** → **Repositories** → **number-challenge**
|
|
||||||
2. Click **Security** tab
|
|
||||||
3. Verify project team has **Contribute** permission
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## During the Workshop
|
## During the Workshop
|
||||||
@@ -153,12 +144,12 @@ Students added to the project automatically have access. Verify:
|
|||||||
### The Exercise Flow
|
### The Exercise Flow
|
||||||
|
|
||||||
1. **Students pull** the latest changes
|
1. **Students pull** the latest changes
|
||||||
2. **One person** moves a number to its correct position
|
2. **One person** creates a branch, moves a number to its correct position
|
||||||
3. **They commit and push**
|
3. **They commit and push**
|
||||||
4. **Others pull** and see the change
|
4. **Others pull** and see the change
|
||||||
5. **Repeat** until sorted
|
5. **Repeat** until sorted
|
||||||
|
|
||||||
### Creating Conflicts (The Learning Moment)
|
### Same branch conflicts
|
||||||
|
|
||||||
Conflicts happen naturally when multiple people edit at once. You can encourage this:
|
Conflicts happen naturally when multiple people edit at once. You can encourage this:
|
||||||
|
|
||||||
@@ -166,13 +157,6 @@ Conflicts happen naturally when multiple people edit at once. You can encourage
|
|||||||
- Watch them experience the push rejection
|
- Watch them experience the push rejection
|
||||||
- Guide them through pulling and resolving the conflict
|
- Guide them through pulling and resolving the conflict
|
||||||
|
|
||||||
### Monitoring Progress
|
|
||||||
|
|
||||||
Check progress in Azure DevOps:
|
|
||||||
|
|
||||||
- **Repos → Commits**: See who's contributing
|
|
||||||
- **Repos → Files → numbers.txt**: See current state
|
|
||||||
|
|
||||||
### Common Issues
|
### Common Issues
|
||||||
|
|
||||||
**"I can't push!"**
|
**"I can't push!"**
|
||||||
|
|||||||
@@ -20,15 +20,15 @@ SSH (Secure Shell) keys provide a secure way to authenticate with Azure DevOps w
|
|||||||
Before starting, ensure you have:
|
Before starting, ensure you have:
|
||||||
|
|
||||||
- **Git 2.23 or higher** installed
|
- **Git 2.23 or higher** installed
|
||||||
```powershell
|
```pwsh
|
||||||
git --version
|
git --version
|
||||||
```
|
```
|
||||||
|
|
||||||
- **Azure DevOps account** with access to your organization/project
|
- **Azure DevOps account** with access to your organization/project
|
||||||
- If you don't have one, create a free account at [dev.azure.com](https://dev.azure.com)
|
- If you don't ask your organisation for an invitation
|
||||||
|
|
||||||
- **PowerShell 7+ or Bash terminal** for running commands
|
- **PowerShell 7+ or Bash terminal** for running commands
|
||||||
```powershell
|
```pwsh
|
||||||
pwsh --version
|
pwsh --version
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -42,18 +42,18 @@ SSH authentication uses a key pair: a private key (stays on your computer) and a
|
|||||||
|
|
||||||
Open your terminal and run:
|
Open your terminal and run:
|
||||||
|
|
||||||
```powershell
|
```pwsh
|
||||||
ssh-keygen -t rsa
|
ssh-keygen -t rsa
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note about RSA:** Azure DevOps currently only supports RSA SSH keys. While newer algorithms like Ed25519 offer better security and performance, they are not yet supported by Azure DevOps. See the note at the end of this guide for more information.
|
**Note about RSA:** Azure DevOps currently only supports RSA SSH keys. While newer algorithms like Ed25519 offer better security and performance, they are not yet supported by Azure DevOps.
|
||||||
|
|
||||||
### Save Location
|
### Save Location
|
||||||
|
|
||||||
When prompted for the file location, press `Enter` to accept the default:
|
When prompted for the file location, press `Enter` to accept the default:
|
||||||
|
|
||||||
```
|
```
|
||||||
Enter file in which to save the key (/Users/yourname/.ssh/id_rsa):
|
Enter file in which to save the key (C:\Users\YourName\.ssh\id_rsa):
|
||||||
```
|
```
|
||||||
|
|
||||||
**Default locations:**
|
**Default locations:**
|
||||||
@@ -73,7 +73,7 @@ Enter same passphrase again:
|
|||||||
Check that your keys were created:
|
Check that your keys were created:
|
||||||
|
|
||||||
**Windows PowerShell:**
|
**Windows PowerShell:**
|
||||||
```powershell
|
```pwsh
|
||||||
dir $HOME\.ssh\
|
dir $HOME\.ssh\
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -108,27 +108,17 @@ Now you'll upload your public key to Azure DevOps.
|
|||||||
|
|
||||||
Open your terminal and display your public key:
|
Open your terminal and display your public key:
|
||||||
|
|
||||||
**Linux/Mac:**
|
|
||||||
```bash
|
|
||||||
cat ~/.ssh/id_rsa.pub
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows PowerShell:**
|
**Windows PowerShell:**
|
||||||
```powershell
|
```pwsh
|
||||||
type $HOME\.ssh\id_rsa.pub
|
type $HOME\.ssh\id_rsa.pub
|
||||||
```
|
```
|
||||||
|
|
||||||
**Windows Command Prompt:**
|
|
||||||
```cmd
|
|
||||||
type %USERPROFILE%\.ssh\id_rsa.pub
|
|
||||||
```
|
|
||||||
|
|
||||||
The output will look like this:
|
The output will look like this:
|
||||||
```
|
```
|
||||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2YbXnrSK5TTflZSwUv9KUedvI4p3JJ4dHgwp/SeJGqMNWnOMDbzQQzYT7E39w9Q8ItrdWsK4vRLGY2B1rQ+BpS6nn4KhTanMXLTaUFDlg6I1Yn5S3cTTe8dMAoa14j3CZfoSoRRgK8E+ktNb0o0nBMuZJlLkgEtPIz28fwU1vcHoSK7jFp5KL0pjf37RYZeHkbpI7hdCG2qHtdrC35gzdirYPJOekErF5VFRrLZaIRSSsX0V4XzwY2k1hxM037o/h6qcTLWfi5ugbyrdscL8BmhdGNH4Giwqd1k3MwSyiswRuAuclYv27oKnFVBRT+n649px4g3Vqa8dh014wM2HDjMGENIkHx0hcV9BWdfBfTSCJengmosGW+wQfmaNUo4WpAbwZD73ALNsoLg5Yl1tB6ZZ5mHwLRY3LG2BbQZMZRCELUyvbh8ZsRksNN/2zcS44RIQdObV8/4hcLse30+NQ7GRaMnJeAMRz4Rpzbb02y3w0wNQFp/evj1nN4WTz6l8= your@email.com
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2YbXnrSK5TTflZSwUv9KUedvI4p3JJ4dHgwp/SeJGqMNWnOMDbzQQzYT7E39w9Q8ItrdWsK4vRLGY2B1rQ+BpS6nn4KhTanMXLTaUFDlg6I1Yn5S3cTTe8dMAoa14j3CZfoSoRRgK8E+ktNb0o0nBMuZJlLkgEtPIz28fwU1vcHoSK7jFp5KL0pjf37RYZeHkbpI7hdCG2qHtdrC35gzdirYPJOekErF5VFRrLZaIRSSsX0V4XzwY2k1hxM037o/h6qcTLWfi5ugbyrdscL8BmhdGNH4Giwqd1k3MwSyiswRuAuclYv27oKnFVBRT+n649px4g3Vqa8dh014wM2HDjMGENIkHx0hcV9BWdfBfTSCJengmosGW+wQfmaNUo4WpAbwZD73ALNsoLg5Yl1tB6ZZ5mHwLRY3LG2BbQZMZRCELUyvbh8ZsRksNN/2zcS44RIQdObV8/4hcLse30+NQ7GRaMnJeAMRz4Rpzbb02y3w0wNQFp/evj1nN4WTz6l8= your@email.com
|
||||||
```
|
```
|
||||||
|
|
||||||
**Copy the entire output** (from `ssh-rsa` to your email address).
|
**Copy the entire output** (from `ssh-rsa` to and including your email address).
|
||||||
|
|
||||||
|
|
||||||
### Paste and Name Your Key
|
### Paste and Name Your Key
|
||||||
@@ -152,12 +142,12 @@ Now that SSH is configured, you can use it for all Git operations.
|
|||||||
|
|
||||||
To clone a repository using SSH:
|
To clone a repository using SSH:
|
||||||
|
|
||||||
```bash
|
```pwsh
|
||||||
git clone git@ssh.dev.azure.com:v3/{organization}/{project}/{repository}
|
git clone git@ssh.dev.azure.com:v3/{organization}/{project}/{repository}
|
||||||
```
|
```
|
||||||
|
|
||||||
**Example** (replace placeholders with your actual values):
|
**Example** (replace placeholders with your actual values):
|
||||||
```bash
|
```pwsh
|
||||||
git clone git@ssh.dev.azure.com:v3/myorg/git-workshop/great-print-project
|
git clone git@ssh.dev.azure.com:v3/myorg/git-workshop/great-print-project
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -175,7 +165,7 @@ git clone git@ssh.dev.azure.com:v3/myorg/git-workshop/great-print-project
|
|||||||
|
|
||||||
All standard Git commands now work seamlessly with SSH:
|
All standard Git commands now work seamlessly with SSH:
|
||||||
|
|
||||||
```bash
|
```pwsh
|
||||||
# Pull latest changes
|
# Pull latest changes
|
||||||
git pull
|
git pull
|
||||||
|
|
||||||
@@ -195,7 +185,6 @@ git push -u origin feature-branch
|
|||||||
|
|
||||||
## Additional Resources
|
## Additional Resources
|
||||||
- **Azure DevOps SSH Documentation**: [https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate](https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate)
|
- **Azure DevOps SSH Documentation**: [https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate](https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate)
|
||||||
- **SSH Key Best Practices**: [https://security.stackexchange.com/questions/tagged/ssh-keys](https://security.stackexchange.com/questions/tagged/ssh-keys)
|
|
||||||
- **Git with SSH**: [https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key](https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key)
|
- **Git with SSH**: [https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key](https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -204,17 +193,14 @@ git push -u origin feature-branch
|
|||||||
|
|
||||||
### Common Commands
|
### Common Commands
|
||||||
|
|
||||||
```bash
|
```pwsh
|
||||||
# Generate RSA key
|
# Generate RSA key
|
||||||
ssh-keygen -t
|
ssh-keygen -t
|
||||||
|
|
||||||
# Display public key (Linux/Mac)
|
# Display public key
|
||||||
cat ~/.ssh/id_rsa.pub
|
|
||||||
|
|
||||||
# Display public key (Windows)
|
|
||||||
type $HOME\.ssh\id_rsa.pub
|
type $HOME\.ssh\id_rsa.pub
|
||||||
|
|
||||||
# Clone with SSH
|
# Clone with SSH. You can find this url on Azure DevOps
|
||||||
git clone git@ssh.dev.azure.com:v3/{org}/{project}/{repo}
|
git clone git@ssh.dev.azure.com:v3/{org}/{project}/{repo}
|
||||||
|
|
||||||
# Check remote URL
|
# Check remote URL
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ Learn to collaborate on a shared repository using:
|
|||||||
|
|
||||||
```
|
```
|
||||||
1. Create branch → 2. Make changes → 3. Push branch
|
1. Create branch → 2. Make changes → 3. Push branch
|
||||||
↓
|
|
||||||
6. Delete branch ← 5. Merge PR ← 4. Create PR
|
6. Delete branch ← 5. Merge PR ← 4. Create PR
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -110,9 +109,15 @@ git pull
|
|||||||
|
|
||||||
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.
|
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 <the-branch>`
|
2. Now both people should push their respective branch `git push <the-branch>`
|
||||||
3. Now merge `feature-1` branch first, going throught the Pull Request flow.
|
1. Person A pushes their branch `git push feature-1`
|
||||||
|
2. Person B pushes their branch `git push feature-2`
|
||||||
|
3. Now merge `feature-1` branch first, going throught the Pull Request flow (see Step 5).
|
||||||
4. Then merge `feature-2` branch second, and notice you'll get a MERGE CONFLICT.
|
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
|
5. The owner of `feature-2` (Person B) is now tasked with resolving the conflict.
|
||||||
|
|
||||||
|
In order to solve merge conflicts through a Shared Server (Azure DevOps) you have to do merges in <q>reverse</q>, meaning: Instead of, like in module <q>03-branching-and-merging</q>, merging the feature-branch into the `main` branch, we merge the `main` branch into the feature branch.
|
||||||
|
|
||||||
|
Doing so ensures that the `main` branch maintains the integrity it's supposed to have and the conflicts are solved on the feature-branch side before being merged into the `main` branch. The idea here being that, we ONLY modify the main branch through merges facilitated (and reviewed) by Pull Requests. We want the `main` branch to be as stable as possible.
|
||||||
```pwsh
|
```pwsh
|
||||||
# First get the latest changes on main
|
# First get the latest changes on main
|
||||||
git switch main
|
git switch main
|
||||||
@@ -123,7 +128,8 @@ git pull
|
|||||||
|
|
||||||
# Now we resolve the merge. We're merging the main branch INTO the feature-2 branch.
|
# Now we resolve the merge. We're merging the main branch INTO the feature-2 branch.
|
||||||
git merge main
|
git merge main
|
||||||
# Resolve the merge conflict in numbers.txt
|
# Resolve the merge conflict in numbers.txt by opening in VSCode and choosing the changes you want.
|
||||||
|
# How you solve it is up to you.
|
||||||
# Once resolved
|
# Once resolved
|
||||||
git add numbers.txt
|
git add numbers.txt
|
||||||
git commit
|
git commit
|
||||||
@@ -137,30 +143,29 @@ git pull
|
|||||||
|
|
||||||
| Command | What It Does |
|
| Command | What It Does |
|
||||||
|---------|--------------|
|
|---------|--------------|
|
||||||
| `git switch -c <name>` | Create and switch to new branch |
|
| `git switch -c <branch-name>` | Create and switch to new branch |
|
||||||
| `git push -u origin <branch>` | Push branch to Azure DevOps |
|
| `git switch <branch-name>` | Switch to branch |
|
||||||
| `git switch main` | Switch to main branch |
|
| `git push` | Push branch to Azure DevOps |
|
||||||
| `git pull` | Get latest changes from remote |
|
| `git pull` | Get latest changes from remote |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Common Issues
|
## Cheatsheet
|
||||||
|
|
||||||
### "My PR has conflicts"
|
### Solving merge conflicts
|
||||||
1. Update your branch with latest main:
|
```pwsh
|
||||||
```powershell
|
|
||||||
git switch main
|
git switch main
|
||||||
git pull
|
git pull
|
||||||
git switch <branch-name>
|
git switch <branch-name>
|
||||||
git merge main
|
git merge main
|
||||||
|
# ... Solve the conflicts
|
||||||
|
git push
|
||||||
```
|
```
|
||||||
2. Resolve conflicts in VS Code
|
|
||||||
3. Commit and push again
|
|
||||||
|
|
||||||
### "I need to make more changes to my PR"
|
### "I need to make more changes to my PR"
|
||||||
|
|
||||||
Just commit and push to the same branch - the PR updates automatically:
|
Just commit and push to the same branch - the PR updates automatically:
|
||||||
```powershell
|
```pwsh
|
||||||
git add .
|
git add .
|
||||||
git commit -m "fix: address review feedback"
|
git commit -m "fix: address review feedback"
|
||||||
git push
|
git push
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
#!/usr/bin/env pwsh
|
#!/usr/bin/env pwsh
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Installs all prerequisites for Git Workshop using winget and clones the repository.
|
Installs all prerequisites for Git Workshop using winget (which is a CLI
|
||||||
|
tool to the Windows Package Manager Server) and clones the workshop
|
||||||
|
repository.
|
||||||
|
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
This script automates the installation of required tools for the Git Workshop:
|
This script automates the installation of required tools for the Git Workshop:
|
||||||
@@ -17,9 +19,11 @@ each installation succeeded. At the end, it clones the repository and can
|
|||||||
open it in VSCode for immediate workshop access.
|
open it in VSCode for immediate workshop access.
|
||||||
|
|
||||||
One-shot installation:
|
One-shot installation:
|
||||||
|
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||||
Invoke-RestMethod -Uri https://git.frod.dk/floppydiscen/git-workshop/raw/branch/main/install.ps1 | Invoke-Expression
|
Invoke-RestMethod -Uri https://git.frod.dk/floppydiscen/git-workshop/raw/branch/main/install.ps1 | Invoke-Expression
|
||||||
|
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
|
PS> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||||
PS> Invoke-RestMethod -Uri https://git.frod.dk/floppydiscen/git-workshop/raw/branch/main/install.ps1 | Invoke-Expression
|
PS> Invoke-RestMethod -Uri https://git.frod.dk/floppydiscen/git-workshop/raw/branch/main/install.ps1 | Invoke-Expression
|
||||||
Runs the complete installation and setup in one command.
|
Runs the complete installation and setup in one command.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user