Files
2026-06-23 17:02:26 +08:00

142 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🚀 WS 11 - Advanced Git & Github
---
## 📖 Overview
In this assignment, you will simulate multiple developers working on the same project using different Git branches.
You will create parallel development scenarios, encounter merge conflicts, and practice resolving them using Git. By the end, you should feel confident handling common conflict situations that occur in real-world software development.
---
## Prerequisites
- Git installed
- A GitHub account
- Java SDK 25
- Maven
---
## 🎯 Objectives
By completing this assignment, you will:
- Become comfortable creating and switching between Git branches
- Learn how to resolve same-line content conflicts
- Practice resolving:
- Modify/modify conflicts
- Modify/delete conflicts
- Rename conflicts
- Understand how Git tracks file changes across branches
---
## Project Structure
- **Calculator.java:** Interface which defines calculator methods
- **BasicCalculator.java:** Implements Calculator with basic arithmetic
- **MathHelper.java:** Static utility methods (multiply, square, max)
- **ReportGenerator.java:** Uses Calculator and MathHelper to produce formatted output
---
## 📦 Task 1 Refactoring Conflict
### Scenario:
Two developers are working in parallel:<br>
- Developer A refactors the code by renaming a method.
- Developer B continues developing a new feature using the old method name.
When their work is merged, a conflict will occur.
1. First fork & clone the repository and create develop branch:
```
git clone https://github.com/<your-username>/WS-11-Advanced-Git
git checkout -b develop
```
2. Create two feature branches(feature/refactor-multiply & feature/change-multiply). we will assume they are 2 separate developers working on project. One of them will refactor project by renaming a method across whole project, while other developer is still working with old name.
```
git checkout develop
git checkout -b feature/refactor-multiply
git checkout develop
git checkout -b feature/change-multiply
```
3. From feature/refactor-multiply branch, rename "multiply" method to "product" everywhere.
```
git checkout feature/refactor-multiply
# TODO: rename method "multiply" to "product" every where(BasicCalculator,ReportGenerator, test class, ...)
git add .
git commit -m "refactor: renamed multiply to product"
git checkout develop
git merge feature/refactor-multiply
```
4. From feature/change-multiply branch, change the body of multiply method
```
git checkout feature/change-multiply
# TODO: change the body of Calculator.multiply (e.g., loop-based multiplication)
git add .
git commit -m "multiply method body changed"
git checkout develop
git merge feature/change-multiply # CONFLICT
```
5. Resolve the conflict
```
# TODO: Open conflicted file(s), decide to keep the `product` name, and apply the new logic.
git add .
git commit -m "conflict resolved: keep rename, apply new multiply logic"
```
---
## 📦 Task 2 Deletion Conflict
### Scenario
Two developers are working on the same interface:
- Developer A decides that the `Calculator` interface is no longer needed and deletes it from the project.
- Developer B is still working on the interface and adds a new method to it.
When the branches are merged, Git will detect a **modify/delete conflict** because one branch deleted the file while the other modified it.
1. Create Two branches called feature/remove-calculator and feature/add-method-to-interface. We will delete interface file in project in first branch, while second one is working on it. Then we will solve conflict that happends in merging.
```
git checkout develop
git checkout -b feature/remove-calculator
git checkout develop
git checkout -b feature/add-method-to-interface
```
2. From feature/remove-calculator branch, delete interface file completely:
```
git checkout feature/remove-calculator
git rm src/main/java/com/ap/Calculator.java
git commit -m "remove Calculator interface"
git checkout develop
git merge feature/remove-calculator
```
3. From feature/add-method-to-interface add method to deleted interface
```
git checkout feature/add-method-to-interface
# TODO: add "double calculateArea(double a,double b)" to Calculator, implement in BasicCalculator
git add .
git commit -m "add calculateArea() method"
git checkout develop
git merge feature/add-method-to-interface # CONFLICT
```
4. Resolve
- Keep the `Calculator` interface with new added `calculateArea()` method.
```
git commit -m "resolved: Restored deleted interface and added calculateArea "
```
---
## 📤 Deliverable
- Push your branches with all merge commits. <br>
- Show output of your git history:
```
git log --oneline --graph --all --decorate
```