From 2667a3e516e7ecc574676a1a5f65d0c58077da2f Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 22:16:09 +0300 Subject: [PATCH 01/12] docs: add PR template Signed-off-by: G-Akleh --- .github/pull_request_template.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..1a68db5e5 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +## Goal + + +## Changes +- + +## Testing + + +## Checklist +- [ ] Title is a clear sentence (≤ 70 chars) +- [ ] Commits are signed (`git log --show-signature`) +- [ ] `submissions/labN.md` updated From 781ab23f23d6668aaa417ac5f5663dce7cc90190 Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 23:46:35 +0300 Subject: [PATCH 02/12] docs: upstream moved while you worked Signed-off-by: G-Akleh From ac2c2d2a70685f0be1858c4c7c6517d2839412e0 Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 05:45:24 +0300 Subject: [PATCH 03/12] docs(lab1): start submission Signed-off-by: G-Akleh --- submissions/lab1.md | Bin 0 -> 74 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 submissions/lab1.md diff --git a/submissions/lab1.md b/submissions/lab1.md new file mode 100644 index 0000000000000000000000000000000000000000..819ff88750ec9bcc59c2a50587c308aecfde6174 GIT binary patch literal 74 zcmezWPnki1!G|G{Aqhwu0&y`zDUhAZkO^cJ1Ic`bJO*9{E-=mnvNIV Date: Tue, 9 Jun 2026 22:03:34 +0300 Subject: [PATCH 04/12] docs(lab1): add submission content Signed-off-by: G-Akleh --- submissions/lab1.md | Bin 74 -> 4210 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/submissions/lab1.md b/submissions/lab1.md index 819ff88750ec9bcc59c2a50587c308aecfde6174..937328785b75149de4710facc1d36346f0162e6c 100644 GIT binary patch literal 4210 zcmb`KYi}Dx6o%(B68~Z4ekiC-6DLj5MhK`#NLv*OO{7X71ir;FabnAkQ_`w`9eAEO zUhg_2Rg0q4?#|AfIhXfb=IlRz-$_M!ky@$EyUBf!W{gkMAWgXjX_U^==jpS2-$`CY z`VN{&8s^am+EezQr7rXZ^s{uH#`!tDveUi$X)hh}UQNfT$G#!d$7yFl`A72l6JDj{ zcX_Q~PXj3<=zFX-*i)p3>3(f>%36ziwpedKe*&!*ywA_zziiR6UX_dwY4z(uZlz!7 zH~@*zu36JA*3Lon9GiP{ibi_Pc$hlqdCI6@b;R>$Y#1g+=3DGKgJ#0}E${oRb$O4W8nMUk(@d)k zBj}t7&lgB)F(dt1p6z6r#*j22shQUJ8uHy{{sDSlwa8sYg+A`4-}5N2Y@~H|ucxiF z!n?_{nKp?edG2tR&tKrGcSY!ZjsMMFTCY*vVrj*jzDdK zRp-}Ob=6M?8SM$r0wgYZ&fp|=!67h}d!Mz^iz0gth4f=&x-N%r@>Q_=EM4$@0c!Hm zJ7#d7c|8z5QqC~%?PrQUv@K$whXu1tHN}_aa2FYG*n7Kv+MIjq)BUvZ5q{dmj*IjX ze2lxOOJdgg2(LT?0W(KTML_=qiXu_2m;uJ9mF@@%QNK-us(Ai%gzDAsrbymH-|kZU zbaIt2=T@-SiqT{I-`u-sGKWe={S;Z2Zavla)=|%k+p0Czov1j=9Y#%2ZXWk@1UKxLLEM zfsI$s6fv>lj+U%$P-~XYi>hW-KB?o>0J)E=$5E9Z<5O$&PTEM@8KVty<00b>>hwl> z400uAH=oA#AZ69^ERSq^nQKz?73Jw2XL+0KHg27bbJXs|EcR4rvicYuTImt_x}CLI zXI6bSL1c?}m(dn8*1$(lwi#Oy*Vwtiw>GUaqlA4h6h*s{ewNcx~m1p?A}Ye$ll~?qD?_Z(90*lL3)~=E5r0GJ%{@?yR88CkgyG}JuL1)^BT<#S>J@J3Fm!e zJj(Vy$+)ZM1UY8+3UW&eiuBe0uHIZ#c~K9q6K4Jwl?oR9#97TKSdzp}nVPvRtfG(bMSRI%Ra6+U99w|D#-O zt0c6UDfg>w)b@6k7q~?49R1QM*7rF4Vuz*ddI$a{%a00HVH^E;{9^^jr~u1d_}#3hy_r=_#MCmz!yE@{ zTy^#Gu(Q)D>9ta7EvzbvE5XN3a?E%H)^$3 z)o~t1PZ-gmU0QQSRQRXqDPzSC#LN`&Rxde;pxG6FPvsxaa%79b44(cixu>pQM5~@W zflB1eYo*(@hkdc9%4_3M50=;(CwBCaP2y=Z+UF}vo!p`3QVy6=_-6+_&jMu^76LP9-5?baq}5V;^e+8p`O!*1)`zX Date: Tue, 9 Jun 2026 22:14:24 +0300 Subject: [PATCH 05/12] docs(lab1): add badge screenshot Signed-off-by: G-Akleh --- submissions/lab1.md | Bin 4210 -> 4392 bytes .../screenshots/lab1/verifiedBadge.png | Bin 0 -> 16593 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 submissions/screenshots/lab1/verifiedBadge.png diff --git a/submissions/lab1.md b/submissions/lab1.md index 937328785b75149de4710facc1d36346f0162e6c..6253f4487230e2db4a2721e64537114c265bf8d5 100644 GIT binary patch delta 179 zcmeyQutI6W0`B@ShE#?khD?SuAWmgSVNhUjVn_ti=|G+WLq013ta63>pl23^5GF49P(AQ-LrK$j$(oSOTPD7;=ENBrzDO0hwh$Nn|G= T9H7Tg0MwSwpt-r9`!NduS=b`- delta 12 TcmZ3X^hsgE0`ARWJeODiB)bJ8 diff --git a/submissions/screenshots/lab1/verifiedBadge.png b/submissions/screenshots/lab1/verifiedBadge.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa28fd08acea3ee1bb8437c2ed9aa0f074bd59d GIT binary patch literal 16593 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 literal 0 HcmV?d00001 From 9574fad8ccd74bae7b0f2ba2b5a5bdf344269c08 Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 22:23:14 +0300 Subject: [PATCH 06/12] docs(lab1): finish submission Signed-off-by: G-Akleh --- submissions/lab1.md | Bin 4392 -> 4470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/submissions/lab1.md b/submissions/lab1.md index 6253f4487230e2db4a2721e64537114c265bf8d5..04e921ddaeb64f8bcbef8f6d93df199447425e6a 100644 GIT binary patch delta 135 zcmZ3X^i64knQ90_216=?0z*DSDMJZE0hlZX^V5K2GLT=ykh3w~m^V;?A(0`EAq6O! v4irrUii7wiK;5YfARQ%8lQN;A=|B~kK+#ILX)qPZK-*FnQa4ZJoz4sZ)Sn!k delta 57 zcmeySv_ffunWi&CDMJxM4ub-NGebT@E)XU% Date: Tue, 9 Jun 2026 22:32:35 +0300 Subject: [PATCH 07/12] docs(lab1): fix screenshot path Signed-off-by: G-Akleh --- submissions/lab1.md | Bin 4470 -> 4470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/submissions/lab1.md b/submissions/lab1.md index 04e921ddaeb64f8bcbef8f6d93df199447425e6a..c98b43968e632743d307eaec9c21f4afcf3e42e6 100644 GIT binary patch delta 48 zcmeyS^i65QFK%UhhGK?fh9ZVkAj|`@GZ^w2N`SOJLk>eCLlT1_gZ^e&o=8>zSuhLX delta 48 zcmeyS^i65QFK*=+hGK?fh9ZVkAj|`@GZ^w2N`Q0>Lk>eCLlT1_L(FDbo=8>zWEKo) From 151c85bd650eaea97bfc4fc9f5ebdd2bb6c6249f Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 22:48:13 +0300 Subject: [PATCH 08/12] docs(lab1): add community engagement Signed-off-by: G-Akleh --- submissions/lab1.md | Bin 4470 -> 5388 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/submissions/lab1.md b/submissions/lab1.md index c98b43968e632743d307eaec9c21f4afcf3e42e6..c71b4a8e58b8a7ce107b4af8ab4d607c15b49dca 100644 GIT binary patch delta 875 zcmZvaJx;?w5QRsgLqdoXU=fKTB2duLA^t)|!3mtiP7HP&*-oNV7Cl`q!rhRl`QA8= z3(#uqo!Pff#RW`JxjV!P`%PnIqZSMXJz6Z`z3)vAj z5mx04V(GJ9u|q3ZkxjtszksK7h8#P=Q`(KtwLcvIOCXv98}KNy6{iKDfu)d*I9=Jj z`(JkcXAfL}Q(!SDK*ntfZeU|>lv?P_5n&r&22%(s@poSTEg>g3Dz+YlP^6|>V{Dys zTSKa9Dw}aqFj2>>fdAa@uKhm3mS!Oc)p@yBr&C77PC*w#ApeQeR5RTrQvzL3L2hs0 z#}Ef7q%@bF40PM?<6f;h3BB?3)SfOmrJceeE)`okc7?atvuEyaldIrT`6?l>M?W`G zw1}ot;#Iez8YOV delta 7 OcmeCt`lhs@Ob`GKIs*m( From 4fc459f854cb94cabbfabaa575febb312d9337a0 Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 23:12:12 +0300 Subject: [PATCH 09/12] wip(lab2): start Signed-off-by: G-Akleh --- submissions/lab2.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 submissions/lab2.md diff --git a/submissions/lab2.md b/submissions/lab2.md new file mode 100644 index 000000000..6d4f7506b --- /dev/null +++ b/submissions/lab2.md @@ -0,0 +1 @@ +important work From 08b2f41b5ec3b0ce220e547b7f25de742af553e2 Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 23:13:10 +0300 Subject: [PATCH 10/12] wip(lab2): more progress Signed-off-by: G-Akleh --- submissions/lab2.md | 1 + 1 file changed, 1 insertion(+) diff --git a/submissions/lab2.md b/submissions/lab2.md index 6d4f7506b..5b09dc7e7 100644 --- a/submissions/lab2.md +++ b/submissions/lab2.md @@ -1 +1,2 @@ important work +more important work From 391b7d628c69eba36a3fe283c46c3a80452688ad Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 23:43:26 +0300 Subject: [PATCH 11/12] docs(lab2): add task 1 Signed-off-by: G-Akleh --- submissions/lab2.md | 268 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 266 insertions(+), 2 deletions(-) diff --git a/submissions/lab2.md b/submissions/lab2.md index 5b09dc7e7..e8b093d26 100644 --- a/submissions/lab2.md +++ b/submissions/lab2.md @@ -1,2 +1,266 @@ -important work -more important work +# Lab 2 Submission — Version Control Deep Dive + +## Task 1 + +### 1.1: Repo's plumbing + +#### 1.1.1: Get current HEAD commit SHA + +```bash +$ git rev-parse HEAD +e9bc7088d25ea989726a77230742c39c8d260f32 +``` + +#### 1.1.2: Verify HEAD is a commit object + +```bash +$ git cat-file -t HEAD +commit +``` + +#### 1.1.3: Examine the commit object + +```bash +$ git cat-file -p HEAD +tree 372acf29ff043f6dce3127bc7ce818813d390180 +parent 7b7fe1d0e628331350f5209e79da47b89ef05f57 +author G-Akleh 1781034493 +0300 +committer G-Akleh 1781034493 +0300 +gpgsig -----BEGIN SSH SIGNATURE----- + U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1NTE5AAAAg93Kab0J+rIsoM7iW4Zz96y6NmI + 1+pOooheU4wkebZ3MAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5 + AAAAQPLy1Fr8bp4htF/ZerGmE1SfeSvMkEGriFUAgtiKZodpUeaybGWsx3Dn1NRN0X8O6o + w1ZsZocRsX2NzZH5F3wg0= + -----END SSH SIGNATURE----- + +docs(lab1): add community engagement + +Signed-off-by: G-Akleh +``` + +**Observation:** This commit contains a tree SHA `372acf29ff043f6dce3127bc7ce818813d390180`, a parent commit SHA, author information, and a cryptographic signature. + +#### 1.1.4: Examine the tree object + +```bash +$ git cat-file -p 372acf29ff043f6dce3127bc7ce818813d390180 +100644 blob 1c0a1e94b7bbdd951f456cda51af6b8484cc3cee .gitignore +100644 blob d10c04c6e7e0014f4fe883599c11747c15012d4e README.md +040000 tree 7d0898a908e274ea809722844cdbd836f3b1c05a app +040000 tree 6db686e340ecdd318fa43375e26254293371942a labs +040000 tree 3f11973a71be5915539cb53313149aa319d69cb5 lectures +040000 tree 772d6f22bc4f6e93c96e371b9c881633e861d07b submissions +``` + +**Observation:** The tree object contains file mode, type (blob/tree), SHA, and name. Blobs represent file content; trees represent directories. + +#### 1.1.5: Examine a blob (README.md (first lines)) + +```bash +$ git cat-file -p d10c04c6e7e0014f4fe883599c11747c15012d4e +# DevOps Intro — Modern DevOps Practices Through One Project + +[![Course](https://img.shields.io/badge/Course-DevOps%20Intro-blue)](#course-roadmap) +[![Project](https://img.shields.io/badge/Project-QuickNotes%20(Go)-success)](#the-project-quicknotes) +[![Duration](https://img.shields.io/badge/Duration-10%20Weeks-lightgrey)](#course-roadmap) +[![Grading](https://img.shields.io/badge/Grading-70--14--5--30--30-orange)](#grading) +... +``` + +**Observation:** The blob contains the raw, compressed file content. This is what Git stores and retrieves when you check out files. (provided output includes only first couple of lines) + +#### Chain Summary + +The full object chain for this commit is: + +- **Commit** `e9bc708` → **Tree** `372acf2` → **Blobs** like `1c0a1e9` (`.gitignore`), `d10c04c` (README.md), etc. +- Each commit is immutable; the SHA changes if any content (tree, parent, author, message) changes +- This forms the foundation of Git's content-addressable storage + +--- + +### 1.2: Inside `.git/` + +#### High-level directory structure + +**Note**: I used Windows PowerShell for this lab so some commands are different. + +```bash +$ Get-ChildItem .git -Force + + Directory: D:\VSCodeProjects\DevOps-Intro\.git + +Mode LastWriteTime Length Name +---- ------------- ------ ---- +d----- 6/9/2026 4:48 AM hooks +d----- 6/9/2026 4:48 AM info +d----- 6/9/2026 4:48 AM logs +d----- 6/9/2026 10:48 PM objects +d----- 6/9/2026 10:14 PM refs +-a---- 6/9/2026 10:48 PM 89 COMMIT_EDITMSG +-a---- 6/9/2026 11:03 PM 626 config +-a---- 6/9/2026 4:48 AM 73 description +-a---- 6/9/2026 5:35 AM 679 FETCH_HEAD +-a---- 6/9/2026 11:03 PM 29 HEAD +-a---- 6/9/2026 10:48 PM 3356 index +-a---- 6/9/2026 10:13 PM 41 ORIG_HEAD +-a---- 6/9/2026 4:48 AM 112 packed-refs +``` + +#### HEAD file + +```bash +$ Get-Content .git/HEAD +ref: refs/heads/feature/lab2 +``` + +The HEAD file is a symbolic reference pointing to the current branch. + +#### Branch references + +```bash +$ Get-ChildItem .git/refs/heads/ -Recurse + Directory: D:\VSCodeProjects\DevOps-Intro\.git\refs\heads\feature + +Mode LastWriteTime Length Name +-a---- 6/9/2026 10:48 PM 41 lab1 +-a---- 6/9/2026 11:03 PM 41 lab2 + + Directory: D:\VSCodeProjects\DevOps-Intro\.git\refs\heads + +-a---- 6/9/2026 10:16 PM 41 main +``` + +Each file contains the SHA-1 of the commit it points to. + +#### Git objects storage + +```bash +$ Get-ChildItem .git/objects/ | Measure-Object +Count : 55 # Number of subdirectories (0-9, a-f pairs) + +$ Get-ChildItem .git/objects -Recurse -File | Measure-Object +Count : 60 # Total loose object files +``` + +**Interpretation:** + +- **objects/** contains all git objects (commits, trees, blobs, tags) +- Objects are stored in subdirectories named after the first 2 characters of their SHA +- **60 loose objects** are currently stored; this includes commits, trees, and blobs +- The **index** file (3356 bytes) is the staging area; it lists files tracked and ready to commit +- **logs/** contains reflog entries, enabling recovery from hard resets +- **config** holds repository-specific settings (e.g., user info, signing settings) + +--- + +### 1.3: Disaster + recover simulation + +#### Two commits created for the scenario + +```bash +$ echo "important work" | Out-File -Encoding UTF8 submissions/lab2.md +$ git add submissions/lab2.md +$ git commit -S -s -m "wip(lab2): start" +[feature/lab2 6e915db] wip(lab2): start + 1 file changed, 1 insertion(+) + create mode 100644 submissions/lab2.md + +$ Add-Content -Path submissions/lab2.md -Value "more important work" +$ git commit -S -s -am "wip(lab2): more progress" +[feature/lab2 3cd6061] wip(lab2): more progress + 1 file changed, 1 insertion(+) +``` + +#### Commits verified are in the log + +```bash +$ git log --oneline -5 +3cd6061 (HEAD -> feature/lab2) wip(lab2): more progress +6e915db wip(lab2): start +e9bc708 (origin/feature/lab1, feature/lab1) docs(lab1): add community engagement +7b7fe1d docs(lab1): fix screenshot path +2bcc1d7 docs(lab1): finish submission +``` + +#### Simulate catastrophe: hard reset + +```bash +$ git reset --hard HEAD~2 +HEAD is now at e9bc708 docs(lab1): add community engagement +``` + +#### The commits appear "lost" + +```bash +$ git status +On branch feature/lab2 +nothing to commit, working tree clean + +$ git log --oneline -5 +e9bc708 (HEAD -> feature/lab2, origin/feature/lab1, feature/lab1) docs(lab1): add community engagement +7b7fe1d docs(lab1): fix screenshot path +2bcc1d7 docs(lab1): finish submission +d79f289 docs(lab1): add badge screenshot +0d4720a docs(lab1): add submission content +``` + +**Observations:** The two commits (`3cd6061` and `6e915db`) are no longer in the commit history. The file `submissions/lab2.md` was also reset. + +#### Reflog to find the lost commits + +```bash +$ git reflog +e9bc708 (HEAD -> feature/lab2, origin/feature/lab1, feature/lab1) HEAD@{0}: reset: moving to HEAD~2 +3cd6061 HEAD@{1}: commit: wip(lab2): more progress +6e915db HEAD@{2}: commit: wip(lab2): start +e9bc708 (HEAD -> feature/lab2, origin/feature/lab1, feature/lab1) HEAD@{3}: checkout: moving from feature/lab1 to feature/lab2 +e9bc708 (HEAD -> feature/lab2, origin/feature/lab1, feature/lab1) HEAD@{4}: commit: docs(lab1): add community engagement +[... additional reflog history ...] +``` + +The reflog shows the **chain of HEAD movements**: + +- `HEAD@{1}` points to commit `3cd6061` (the most recent lost commit) +- `HEAD@{2}` points to commit `6e915db` (the earlier lost commit) +- These entries prove the commits still exist in the object database, even though they're unreachable from the current branch + +#### Recovery: reset to the lost commit + +```bash +$ git reset --hard 3cd6061 +HEAD is now at 3cd6061 wip(lab2): more progress +``` + +#### Recovery success verified + +```bash +$ git status +On branch feature/lab2 +nothing to commit, working tree clean + +$ git log --oneline -5 +3cd6061 (HEAD -> feature/lab2) wip(lab2): more progress +6e915db wip(lab2): start +e9bc708 (origin/feature/lab1, feature/lab1) docs(lab1): add community engagement +7b7fe1d docs(lab1): fix screenshot path +2bcc1d7 docs(lab1): finish submission +``` + +**Revovery was successful** Both commits are restored and the working tree matches. + +--- + +### Analysis: What if `git gc` had run? + +If `git gc` had run between the bad reset and recovery: + +Git's garbage collection (`git gc`) repacks loose objects and cleans up unreachable objects older than a default grace period (typically 2 weeks for loose objects). The critical factor is the **reflog expiration window**, which defaults to 90 days for unreachable objects. + +In this scenario: + +- Before `git gc`: The reflog entry `HEAD@{1}` still references commit `3cd6061`, keeping it and its tree/blob objects alive. +- After `git gc`: If the reflog entry is still within its grace period, `git gc` would preserve these objects because they are reachable from the reflog. The objects would be repacked but remain in the repository. +- However: If a system administrator has configured aggressive garbage collection (`--aggressive` or `--prune=now`), or if the reflog entries had expired (beyond 90 days), the objects would be permanently deleted and unrecoverable. + +The reflog is Git's safety net for recovery, but it is not permanent. Always create branches or tags for important work rather than relying on reflog for long-term recovery. From 42c879b32a46efdacc33d55736f77abd979fbded Mon Sep 17 00:00:00 2001 From: G-Akleh Date: Tue, 9 Jun 2026 23:53:21 +0300 Subject: [PATCH 12/12] docs(lab2): add task 2 Signed-off-by: G-Akleh --- submissions/lab2.md | 173 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) diff --git a/submissions/lab2.md b/submissions/lab2.md index e8b093d26..fec1952b5 100644 --- a/submissions/lab2.md +++ b/submissions/lab2.md @@ -264,3 +264,176 @@ In this scenario: - However: If a system administrator has configured aggressive garbage collection (`--aggressive` or `--prune=now`), or if the reflog entries had expired (beyond 90 days), the objects would be permanently deleted and unrecoverable. The reflog is Git's safety net for recovery, but it is not permanent. Always create branches or tags for important work rather than relying on reflog for long-term recovery. + +--- + +## Task 2 — Tag a Release & Rebase a Feature + +### 2.1: Annotated, signed release tag + +Created an annotated, signed tag for the release: + +```bash +$ git switch main +Switched to branch 'main' +Your branch is up to date with 'origin/main'. + +$ git pull --ff-only upstream main +From github.com:inno-devops-labs/DevOps-Intro + * branch main -> FETCH_HEAD +Already up to date. + +$ git tag -a -s "v0.1.0-lab2-Ghadeer" -m "Lab 2 milestone — version control deep dive" +# (tag created successfully) + +$ git push origin "v0.1.0-lab2-Ghadeer" +To github.com:G-Akleh/DevOps-Intro.git + * [new tag] v0.1.0-lab2-Ghadeer -> v0.1.0-lab2-Ghadeer +``` + +#### Verify tag is annotated and signed + +```bash +$ git tag -l --format='%(refname:short) %(objecttype) %(*objecttype)' | Select-String lab2 +v0.1.0-lab2-Ghadeer tag commit +``` + +**Interpretation:** The format shows: + +- Tag name: `v0.1.0-lab2-Ghadeer` +- `objecttype: tag` → It's an annotated tag (not lightweight) +- `*objecttype: commit` → The tag points to a commit + +#### Verify the signature + +```bash +$ git tag -v "v0.1.0-lab2-Ghadeer" +object 2667a3e516e7ecc574676a1a5f65d0c58077da2f +type commit +tag v0.1.0-lab2-Ghadeer +tagger G-Akleh 1781037881 +0300 + +Lab 2 milestone — version control deep dive +Good "git" signature for ghadeer_akleh@hotmail.com with ED25519 key SHA256:F+2/0O65nDRR6Zz2lIJc7eEn+w7kEfeZWrTc5J1HGy8 +``` + +**Success:** The tag is verified with a **"Good" signature** using the ED25519 SSH key. + +--- + +### 2.2: Rebase + force-with-lease + +#### Before rebase: branch graph + +```bash +$ git log --oneline --graph --all -10 +* 5622c8c (feature/lab2) docs(lab2): add task 1 +* 3cd6061 wip(lab2): more progress +* 6e915db wip(lab2): start +* e9bc708 (origin/feature/lab1, feature/lab1) docs(lab1): add community engagement +* 7b7fe1d docs(lab1): fix screenshot path +* 2bcc1d7 docs(lab1): finish submission +* d79f289 docs(lab1): add badge screenshot +* 0d4720a docs(lab1): add submission content +* 001a94a docs(lab1): start submission +| * 2667a3e (HEAD -> main, tag: v0.1.0-lab2-Ghadeer, origin/main, origin/HEAD) docs: add PR template +|/ +``` + +**Analysis:** feature/lab2 is 3 commits ahead of main and has diverged. The branches have a common ancestor but have separate histories. + +#### Simulate upstream moving while you worked + +```bash +$ git switch main +Switched to branch 'main' + +$ git commit -S -s --allow-empty -m "docs: upstream moved while you worked" +[main 781ab23] docs: upstream moved while you worked + +$ git push origin main +To github.com:G-Akleh/DevOps-Intro.git + 2667a3e..781ab23 main -> main +``` + +Now upstream/main is ahead of the feature branch's base. + +#### Perform the rebase + +```bash +$ git switch feature/lab2 +Switched to branch 'feature/lab2' + +$ git fetch origin +# (fetched remote updates) + +$ git rebase origin/main +Successfully rebased and updated refs/heads/feature/lab2. +``` + +**No conflicts** — rebase completed cleanly. + +#### After rebase: branch graph + +```bash +$ git log --oneline --graph --all -10 +* 391b7d6 (HEAD -> feature/lab2) docs(lab2): add task 1 +* 08b2f41 wip(lab2): more progress +* 4fc459f wip(lab2): start +* 151c85b docs(lab1): add community engagement +* 2429c8d docs(lab1): fix screenshot path +* 9574fad docs(lab1): finish submission +* 202bab1 docs(lab1): add badge screenshot +* 1687725 docs(lab1): add submission content +* ac2c2d2 docs(lab1): start submission +* 781ab23 (origin/main, origin/HEAD, main) docs: upstream moved while you worked +``` + +**Analysis:** feature/lab2 is now **linearly on top** of origin/main: + +- The three lab2 commits have **new SHAs** (expected: rebase replays commits) +- Old SHAs: `5622c8c`, `3cd6061`, `6e915db` +- New SHAs: `391b7d6`, `08b2f41`, `4fc459f` +- The common ancestor is now the "upstream moved" commit `781ab23` +- No branching — clean linear history + +#### Push with force-with-lease + +```bash +$ git push --force-with-lease origin feature/lab2 +To github.com:G-Akleh/DevOps-Intro.git + * [new branch] feature/lab2 -> feature/lab2 + +remote: Create a pull request for 'feature/lab2' on GitHub by visiting: +remote: https://github.com/G-Akleh/DevOps-Intro/pull/new/feature/lab2 +``` + +**Successfully pushed** with `--force-with-lease` (lease protection prevented accidental overwrites of concurrent work). + +--- + +### 2.3: Merge vs Rebase + +#### rebase is better for: + +- **Feature branch development:** Keeping a clean, linear history on a feature branch before merging makes code review clearer +- **Avoiding merge commits:** If we want a "flat" history without "Merge branch" commits, we rebase first then merge with `--ff-only` +- **Local branches:** On branches only we're working on, rebase is safe and clean +- **CI/CD pipelines:** Linear history makes bisect and blame operations easier to interpret +- **Before merging to main:** We rebase a feature branch onto main, then fast-forward merge to keep main's history linear + +#### merge is better for: + +- **Shared branches:** we should never rebase a branch that multiple people are working on; we merge instead (rewriting history breaks others' work) +- **Preserving history:** Merge commits document _when_ and _how_ branches were integrated (useful for release management) +- **Distributed teams:** Merge is safer for collaborative branches; it explicitly documents integration points +- **Merging into main:** Some teams use `git merge --no-ff` to main to preserve evidence of each feature + +#### In this lab: + +**Rebase was the right choice** because: + +1. `feature/lab2` was a solo, local branch with no other collaborators +2. The rebase was before a PR (integration), not after collaboration +3. The result is a clean, linear history that will be easy to review in the PR +4. Once pushed as a PR, rebasing again would be problematic; at that point, further changes would use merge if main moved again