<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged version-control</title>
<link>https://coderlegion.com/tag/version-control</link>
<description>Powered by Question2Answer</description>
<item>
<title>No, Git Isn't Dead. Anthropic's Robots Just Needed a Bigger One.</title>
<link>https://coderlegion.com/33058/no-git-isnt-dead-anthropics-robots-just-needed-a-biggerone</link>
<description>&lt;p&gt;The viral version says Git died in 2026. &lt;/p&gt;
&lt;p&gt;The real story is funnier: seven humans spent five months building a version control system so their AI could keep merging 30,000 changes a day and it works by banning the two features Git is most famous for.&lt;/p&gt;
&lt;p&gt;A post went around this week with the energy of a tabloid that just found out your marriage is over before you did. &quot;Git is DEAD in 2026?&quot; Two screaming-face emojis. &lt;/p&gt;
&lt;p&gt;Anthropic has replaced Git with its own system called Scion, the robots write too much code, Git simply couldn't keep up, pour one out for the little distributed version control system that could.&lt;/p&gt;
&lt;p&gt;And here's the thing that ruins a perfectly good funeral: the story is basically true. Anthropic did build an in-house source control system called Scion. They did move their internal monorepo off Git.&lt;/p&gt;
&lt;p&gt;They are, by their own numbers, merging more than 30,000 code changes a day. I read their actual engineering write-up, because somebody has to, and it's a genuinely great piece of engineering.&lt;/p&gt;
&lt;p&gt;It's also not a eulogy for Git. It's a note from the office saying the robots need a bigger desk. Let me show you the difference, because the difference is the whole joke.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The clickbait says &quot;Git is dead.&quot; The footnotes say &quot;please do not try this at home.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here's the first thing the viral version conveniently loses. Anthropic goes out of its way to say Scion is not for everyone, is built only for one absurd situation, and is not going to be released. &lt;br&gt;
This is the software equivalent of a Formula 1 team explaining that yes, the car does 370 km/h, and no, you cannot drive it to Big Bazaar.&lt;/p&gt;
&lt;p&gt;So Git isn't dead. Git is fine. Git is running on your laptop right now, serenely, the way it has for twenty years, handling your eleven commits a week without filing a complaint. &lt;br&gt;
What actually happened is narrower and far more interesting: one company hit a scale so ridiculous that a core assumption of Git stopped being free, and they had to pay to make it go away.&lt;/p&gt;
&lt;p&gt;That assumption is the one every Git tutorial sells as the feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;The feature that became the bill&lt;/strong&gt;&lt;/strong&gt;&lt;br&gt;
Git is decentralized. Everyone who clones the repo gets the entire repo - every file, every branch, all of history, the whole cathedral - on their own machine. In 2005 this was revolutionary and correct. &lt;/p&gt;
&lt;p&gt;It's why your internet going out doesn't stop you from committing. It's the thing we all fled Subversion and Perforce to get.&lt;/p&gt;
&lt;p&gt;Now put a number on &quot;the entire repo&quot; at Anthropic scale. Their main branch history is pushing 100 GB. A compressed working copy is over 25 GB. And they run roughly 25 million CI checkouts a day. Do the naive multiplication and you get an estimate of more than 600 petabytes of Git traffic. Daily. To check out code.&lt;/p&gt;
&lt;p&gt;Image: 100 GB history × 25M checkouts/day = 600 PB Press enter or click to view image in full size&lt;br&gt;
Sit with the comedy of that. The beautiful, democratic idea - everybody gets a full copy! - is wonderful right up until your contributors are a swarm of always-online machines that don't need a full copy, don't go on holiday, and want to clone the cathedral every eight seconds. At that point &quot;everybody gets everything&quot; stops being empowerment and starts being a DDoS you're running against yourself, on purpose, with a straight face.&lt;/p&gt;
&lt;p&gt;At peak, Anthropic was babysitting several hundred Git mirrors just to survive its own enthusiasm.&lt;br&gt;
The robots didn't kill Git. The robots just took the one thing we loved about Git - you always have the whole thing - and used it ten million times a day until it showed us the bill.&lt;/p&gt;
&lt;p&gt;Scion, or: we have reinvented Perforce and we feel great about it&lt;br&gt;
So what did seven engineers build over five months? Reader, they went back to the office.&lt;/p&gt;
&lt;p&gt;Scion is centralized. The authoritative servers are backed by Google's Spanner and cloud storage. Clients keep a small bounded cache. Most CI jobs don't even hold a local copy of the repo - they just ask the server over an API, like a civilised person ordering off a menu instead of being handed the entire kitchen.&lt;/p&gt;
&lt;p&gt;Twenty years of the industry sprinting away from centralized version control, and the most advanced AI lab on Earth looked at its robot-generated code tsunami and sprinted straight back, yelling &quot;it's fine, it's different when WE do it.&quot; &lt;/p&gt;
&lt;p&gt;And - annoyingly - it is different when they do it. The wheel of history is round for a reason.&lt;br&gt;
But here's my favourite detail, the one I want cross-stitched on a pillow. In Scion, branches and tags are discouraged.&lt;/p&gt;
&lt;p&gt;Read that again. They built a version control system whose official guidance is to go easy on the two features that, for most of us, ARE version control. The reasoning is airtight - branches and tags are global state every server has to agree on, and global agreement is exactly the thing that doesn't scale when you're content-addressing immutable changesets across three tiers of cache.&lt;/p&gt;
&lt;p&gt;But stripped of the justification, the sentence is pure deadpan poetry: welcome to our new version control system, please try not to control any versions.&lt;br&gt;
The rest is seriously elegant, and I mean that with no snark left over. Commits are &quot;changesets&quot; that store only what changed. Everything is content-addressed and immutable, so any cache or server can answer a request without phoning a friend. &lt;/p&gt;
&lt;p&gt;Checkouts are sparse and virtualized - a job pulls only the files it actually reads. Three tiers: a daemon on every node, regional caches, authoritative servers, each reportedly landing a cache hit rate above 99%. The payoff Anthropic reports: 200× less CPU and memory than the old mirror fleet, checkouts that went from minutes to seconds, and 25% of CI capacity handed back like finding money in a coat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The part that should make every architect a little uneasy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here's the detail the hot-takes skip, and it's the one I can't stop poking. Claude wrote most of Scion. The AI wrote the version control system that exists because the AI writes too much code for the old version control system.&lt;/p&gt;
&lt;p&gt;That's not a dunk. It's an ouroboros, and it's genuinely where we are: the tooling layer is now being rebuilt, in real time, by the thing that broke the tooling layer. The system's workload created the system's solution and also authored it. Somewhere in there is a snake eating its tail while filing a pull request against itself - sorry, merging a changeset, there are no pull requests, we discourage branches.&lt;/p&gt;
&lt;p&gt;And one more quietly radical bit: they dropped the merge queue. The old model - line up, test, then merge - stopped making sense at 30,000 a day, so Scion leans on post-merge testing and rollback instead. Merge first, find out later, roll back if it screamed. Which, if you've watched how agents write code, is also precisely how the agents write code. The tool didn't just scale to the robots. It started thinking like them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steal this (the you-are-not-Anthropic edition)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Architect hat on. The single most expensive mistake you can make with this story is to read &quot;Anthropic replaced Git&quot; and feel even a flicker of FOMO. You do not have this problem. If you build Scion for your fourteen-person team and your 400 MB repo, you have not future-proofed anything; you have cosplayed a scaling crisis and billed it to your runway.&lt;/p&gt;
&lt;p&gt;The transferable lesson isn't centralize your VCS. It's this:&lt;/p&gt;
&lt;p&gt;Your tool's killer feature and your tool's eventual bill are the same line item, read from different distances. &quot;Every clone is a full repo&quot; was the pitch and the tombstone. Audit your own stack: which beloved convenience becomes a catastrophe at 100× your current volume? That's your Git-history-is-100-GB moment, waiting.&lt;/p&gt;
&lt;p&gt;Scale doesn't just break your performance; it breaks your assumptions. Anthropic didn't need a faster Git. They needed to delete the premise that everyone holds everything. Faster is an optimization. Deleting the premise is an architecture.&lt;/p&gt;
&lt;p&gt;When the workload changes species, the tool has to change species. Humans and agents are not the same kind of client. Most of your tools were designed for the first and are about to be flooded by the second. That is the actual headline, and it has nothing to do with Git.&lt;/p&gt;
&lt;p&gt;So no, Git isn't dead. Git got the highest compliment our industry gives: it was pushed until the exact shape of its one big idea became visible, and the only people it broke for were the ones running a code-generation operation the size of a small nation's power grid.&lt;/p&gt;
&lt;p&gt;The robots didn't bury Git.&lt;br&gt;
They just found the edge of the map - and politely, in a five-month sprint, drew a little more of it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hardik&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've spent about two decades building data and AI systems, long enough to have personally fled Perforce for Git and to now watch the industry's most advanced lab speedrun the return trip with a straight face. I write about AI in production: the parts that are genuinely new, and the parts that are just the wheel of history turning one more honest rotation.&lt;br&gt;
If this made you want to go check how big your repo history actually is - follow me here, and clap a few times so Medium shows it to the next person about to build Scion for their to-do app.&lt;/p&gt;
&lt;p&gt;Sources / further reading: Anthropic Engineering, &quot;Creating in-house source control&quot; (the primary source for Scion's architecture, the merge-volume figures, and the self-reported performance numbers). Coverage and analysis: DevOps.com, &quot;Anthropic Builds Its Own Source Control After AI Agents Outgrow Git&quot;; Crypto Briefing, &quot;Anthropic replaces Git with custom source control system Scion&quot;; AlphaSignal, &quot;Anthropic Ditched Git and Built Scion After Claude Caused 12x Merge Surge.&quot; A note on the numbers: the 200× and 25% figures are Anthropic's own, measured against their previous Git mirror fleet - not against Git in general - and are not independently verified. The ~600 PB figure is a hypothetical estimate for naive fetching, not measured traffic. The viral &quot;nearly 100× faster checkouts&quot; is a rounding-up of Anthropic's actual phrasing, &quot;minutes to seconds.&quot; And the separate &quot;20× less memory, 4× faster&quot; stat floating around belongs to a different ingestion-pipeline rewrite, not Scion. The practice is real and impressive; the funeral is editorial.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/33058/no-git-isnt-dead-anthropics-robots-just-needed-a-biggerone</guid>
<pubDate>Fri, 30 Oct 2026 07:44:39 +0000</pubDate>
</item>
<item>
<title>Beyond the Pull Request: Why Delta Could Reframe AI Code Review</title>
<link>https://coderlegion.com/28158/beyond-the-pull-request-why-delta-could-reframe-ai-code-review</link>
<description>&lt;p&gt;Let’s be honest: the traditional pull request (PR) was designed for a different era of software development. It worked well when people wrote relatively small, self-contained changes and review could focus on a neat diff. But as AI coding agents generate larger changes faster, a diff alone can leave reviewers reconstructing &lt;em&gt;why&lt;/em&gt; a solution was chosen.&lt;/p&gt;
&lt;p&gt;Nathan Sobo—Zed’s CEO and co-founder, who led GitHub’s Atom team—argues that development is moving toward a richer unit of work: the conversation that produced the code. In September 2026, Zed launched &lt;strong&gt;Delta&lt;/strong&gt; in public beta, a separate multiplayer environment for working with coding agents and reviewing their output. Delta is not a finished GitHub replacement, but it is a serious attempt to rethink one core GitHub workflow: the pull request.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“It seems like everyone is in a race to replace GitHub right now.” — Nathan Sobo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;the-pr-problem-in-the-age-of-ai&quot;&gt;The PR problem in the age of AI&lt;/h3&gt;
&lt;p&gt;A pull request is excellent at presenting a proposed change, but it usually does not retain the chain of reasoning behind it. That gap is more noticeable with agents: the important context may include the initial task, alternative approaches, failed experiments, review feedback, and the prompts that produced the final implementation.&lt;/p&gt;
&lt;p&gt;This does &lt;strong&gt;not&lt;/strong&gt; make PRs obsolete for every team or repository. They remain a familiar, durable coordination layer—especially for open-source communities. Delta’s point is narrower and more interesting: a review should not force a teammate or their agent to reverse-engineer decisions that the original conversation already contains.&lt;/p&gt;
&lt;h3 id=&quot;delta-s-central-idea-the-thread&quot;&gt;Delta’s central idea: the thread&lt;/h3&gt;
&lt;p&gt;Delta makes the &lt;strong&gt;thread&lt;/strong&gt;—the connected conversation, worktree, review, and landing process—the primary unit of collaboration. A developer can work with an agent, invite teammates into that thread, and let them inspect the context as well as the code.&lt;/p&gt;
&lt;p&gt;Reviewers can create a dedicated review subthread. Each review receives an isolated copy of the parent thread’s worktrees, so a reviewer can ask an agent to investigate a concern or try a fix without disrupting the original work. Accepted fixes can then be incorporated before the change is landed.&lt;/p&gt;
&lt;h3 id=&quot;what-deltadb-actually-changes&quot;&gt;What DeltaDB actually changes&lt;/h3&gt;
&lt;p&gt;Underneath Delta is &lt;strong&gt;DeltaDB&lt;/strong&gt;, which Zed describes as extending Git’s content-based versioning with incremental versions based on deltas. It records edits and human/agent messages between commits, preserving how the code evolved during a thread.&lt;/p&gt;
&lt;p&gt;That distinction matters. DeltaDB does not eliminate Git commits: commits remain the checkpoints teams can push, pull, and build from. Instead, DeltaDB retains the context and intermediate work that normally disappears between those checkpoints. Participants get synchronized local copies of the worktree, while the conversation and code stay connected in real time.&lt;/p&gt;
&lt;h3 id=&quot;dogfooding-the-model&quot;&gt;Dogfooding the model&lt;/h3&gt;
&lt;p&gt;Zed has turned off pull requests for Delta’s own repository and says the team now builds Delta entirely within Delta. At the time of the public-beta announcement, Sobo reported that &lt;strong&gt;33 people had landed 570 changes to main&lt;/strong&gt; since that switch.&lt;/p&gt;
&lt;p&gt;It is an encouraging operational data point, not proof that every organization should abandon PRs. Still, it shows that the workflow can support real product development rather than only a polished demo.&lt;/p&gt;
&lt;h3 id=&quot;github-is-still-part-of-the-picture&quot;&gt;GitHub is still part of the picture&lt;/h3&gt;
&lt;p&gt;Zed is keeping its public Zed repository on GitHub for now. The reason is practical: the repository is where the wider community files issues and contributes changes. Zed is encouraging contributors to share Delta threads alongside normal pull requests during this transition.&lt;/p&gt;
&lt;p&gt;Sobo told &lt;em&gt;The New Stack&lt;/em&gt; that Zed is moving more cautiously with the public repository because hundreds of monthly contributors depend on the existing workflow. GitHub’s community and social layer are not incidental features, and Zed has not claimed to have replaced them.&lt;/p&gt;
&lt;h3 id=&quot;the-bottom-line&quot;&gt;The bottom line&lt;/h3&gt;
&lt;p&gt;The provocative claim is not that commits or Git vanish. It is that the &lt;strong&gt;thread&lt;/strong&gt; may become the richer record of software work: a place where the idea, implementation, review, and revision remain connected.&lt;/p&gt;
&lt;p&gt;For teams reviewing agent-generated code, that is a compelling direction. Delta’s real test will be whether this context-rich model improves review quality without creating new overhead or fragmenting the collaboration ecosystems developers already rely on. For now, it is best understood as a promising public-beta experiment in continuous, agent-native engineering—not GitHub’s obituary.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;sources&quot;&gt;Sources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://zed.dev/blog/delta-public-beta&quot;&gt;Zed: “Replace PRs with Delta – Now in Public Beta”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://zed.dev/blog/introducing-delta&quot;&gt;Zed: “Introducing Delta”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://zed.dev/blog/introducing-deltadb&quot;&gt;Zed: “Software Is Made Between Commits”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://thenewstack.io/zed-delta-github-alternative/&quot;&gt;The New Stack: Zed launches Delta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;about-the-author&quot;&gt;About the Author&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Jarno S. AEOvara&lt;/strong&gt; is a technology professional specializing in software development, AI integration, and modern engineering workflows. He helps teams navigate the rapidly evolving landscape of software engineering.&lt;/p&gt;
&lt;p&gt;Connect with Jarno: &lt;a rel=&quot;nofollow&quot; href=&quot;https://aeovara.fi/asiantuntija/&quot;&gt;aeovara.fi/asiantuntija&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28158/beyond-the-pull-request-why-delta-could-reframe-ai-code-review</guid>
<pubDate>Tue, 22 Sep 2026 12:09:49 +0000</pubDate>
</item>
<item>
<title>Git &amp; GitHub Basics Every Beginner Developer Should Know</title>
<link>https://coderlegion.com/22997/git-github-basics-every-beginner-developer-should-know</link>
<description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I avoided learning Git properly for way longer than I should have. I'd just zip my project folder and rename it &lt;strong&gt;project-final-v2-ACTUAL-FINAL&lt;/strong&gt; whenever I wanted a backup. It worked, technically, until it very much didn't.&lt;/p&gt;
&lt;p&gt;Git solves exactly this problem, and you genuinely only need about 10 commands to be productive with it. Here's everything you actually need, skipping the theory you won't use day-to-day.&lt;/p&gt;
&lt;h2 id=&quot;git-vs-github-what-s-the-difference-&quot;&gt;Git vs GitHub — What's the Difference?&lt;/h2&gt;
&lt;p&gt;Git is the version control tool that runs on your computer. It tracks changes to your files over time.&lt;br&gt;
GitHub is a website that hosts your Git projects online, so you can back them up, share them, and collaborate with others.&lt;/p&gt;
&lt;p&gt;You can use Git without GitHub. You can't really use GitHub without understanding Git.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-one-time-&quot;&gt;Setting Up (One-Time)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &quot;Your Name&quot;
git config --global user.email &quot;*Emails are not allowed*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;the-core-workflow&quot;&gt;The Core Workflow&lt;/h2&gt;
&lt;h3 id=&quot;1-initialize-a-repository&quot;&gt;1. Initialize a repository&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run this once, inside your project folder, to start tracking it with Git.&lt;/p&gt;
&lt;h3 id=&quot;2-check-what-s-changed&quot;&gt;2. Check what's changed&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Shows you which files are modified, new, or staged. You'll run this constantly — it's your &quot;what's going on right now&quot; command.&lt;/p&gt;
&lt;h3 id=&quot;3-stage-your-changes&quot;&gt;3. Stage your changes&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git add .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This stages all changed files, preparing them to be committed. Use git add filename.js to stage just one file.&lt;/p&gt;
&lt;h3 id=&quot;4-commit-your-changes&quot;&gt;4. Commit your changes&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git commit -m &quot;Add contact form component&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This saves a snapshot of your staged changes, with a message describing what you did. Write clear, specific messages — future you will thank present you.&lt;/p&gt;
&lt;h2 id=&quot;connecting-to-github&quot;&gt;Connecting to GitHub&lt;/h2&gt;
&lt;h3 id=&quot;5-create-a-repository-on-github&quot;&gt;5. Create a repository on GitHub&lt;/h3&gt;
&lt;p&gt;Go to github.com, click &quot;New Repository,&quot; give it a name. Don't initialize it with a README if you already have a local project — you'll connect them next.&lt;/p&gt;
&lt;h3 id=&quot;6-link-your-local-project-to-github&quot;&gt;6. Link your local project to GitHub&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git remote add origin https://github.com/yourusername/your-repo.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;7-push-your-code&quot;&gt;7. Push your code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;-u&lt;/strong&gt; flag remembers this connection, so future pushes just need &lt;strong&gt;git push&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;branches-working-without-breaking-things&quot;&gt;Branches — Working Without Breaking Things&lt;/h3&gt;
&lt;p&gt;A branch lets you work on a new feature without touching your main, working code.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout -b new-feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Creates and switches to a new branch called &lt;strong&gt;new-feature&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Switches back to your main branch.&lt;/p&gt;
&lt;p&gt;Once your feature works, merge it back:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout main
git merge new-feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; if you're experimenting with something risky, do it on a branch. If it breaks, your main branch stays untouched and safe.&lt;/p&gt;
&lt;h3 id=&quot;pulling-changes&quot;&gt;Pulling Changes&lt;/h3&gt;
&lt;p&gt;If you're working across multiple machines, or collaborating with others:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Downloads and merges the latest changes from GitHub into your local project.&lt;/p&gt;
&lt;h2 id=&quot;common-beginner-mistakes&quot;&gt;Common Beginner Mistakes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Committing giant, vague changes. &quot;fixed stuff&quot; tells you nothing six months later. Commit small, logical chunks with clear messages.&lt;/li&gt;
&lt;li&gt;Forgetting to pull before pushing when working with others — leads to avoidable merge conflicts.&lt;/li&gt;
&lt;li&gt;Committing sensitive files like &lt;strong&gt;.env&lt;/strong&gt; with API keys. Always set up a &lt;strong&gt;.gitignore&lt;/strong&gt; file before your first commit.&lt;/li&gt;
&lt;li&gt;Never using branches. Working directly on &lt;strong&gt;main&lt;/strong&gt; for every experiment is how small mistakes become big headaches.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;a-basic-gitignore-for-frontend-projects&quot;&gt;A Basic .gitignore for Frontend Projects&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;node_modules/
.env
dist/
.DS_Store
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save this as &lt;strong&gt;.gitignore&lt;/strong&gt; in your project root before your first commit — it stops these files/folders from ever being tracked.&lt;/p&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;You don't need to memorize every Git command that exists&lt;strong&gt;. status, add, commit, push, pull,&lt;/strong&gt; and basic branching cover probably 90% of real, everyday use. Learn these solidly, and the rest you can look up as you go.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Muhammad Farhan&lt;/strong&gt; is a Frontend Developer specializing in React.js and Tailwind CSS, based in Dera Ismail Khan, Pakistan.&lt;br&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;em&gt;muhammad-farhan-dev.github.io/muhammadfarhan.dev&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22997/git-github-basics-every-beginner-developer-should-know</guid>
<pubDate>Tue, 04 Aug 2026 05:00:00 +0000</pubDate>
</item>
<item>
<title>Git Branch Pinning and Auto-Archiving: What's New in Tower 13 for Windows</title>
<link>https://coderlegion.com/22761/git-branch-pinning-and-auto-archiving-whats-new-in-tower-13-for-windows</link>
<description>&lt;p&gt;Every long-running repo ends up with the same problem: a branch list full of stuff that's already merged or long abandoned, with the branches you actually need buried somewhere in the middle. &lt;/p&gt;
&lt;p&gt;Tower 13 for Windows adds two features built specifically to deal with that — Branch Pinning and Automatic Branch Management. Both have existed on Tower for Mac for a while (Pinning since Tower 8, Auto Branch Management since Tower 15) and are now available on Windows.&lt;/p&gt;
&lt;h3 id=&quot;branch-pinning&quot;&gt;Branch Pinning&lt;/h3&gt;
&lt;p&gt;Right-click a branch to pin it, and it moves into a dedicated &quot;Pinned&quot; section at the top of the sidebar. You can pin or unpin several branches in one go, pinned branches are automatically protected from auto-archiving, and pins are stored in your Git config so they persist reliably.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=11151841218578869273&quot; alt=&quot;Branch Pinning&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;fully-merged-and-stale-badges&quot;&gt;Fully Merged and Stale badges&lt;/h3&gt;
&lt;p&gt;New badges flag branches as &lt;strong&gt;Fully Merged&lt;/strong&gt; (every commit integrated into the parent, and the tracked remote branch already deleted) or &lt;strong&gt;Stale&lt;/strong&gt; (no recent activity). Selecting a flagged branch brings up a hint view with a one-click delete option, so you can confirm cleanup without digging through menus.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=7001012891353511530&quot; alt=&quot;Fully Merged and Stale badges&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;automatic-branch-management&quot;&gt;Automatic Branch Management&lt;/h3&gt;
&lt;p&gt;A new &quot;Archived Branches&quot; view holds branches you've set aside — added manually via drag-and-drop or the context menu, or moved there automatically based on a stale interval you configure in settings. Clicking the notification counter in the footer opens a dialog to review and approve archiving in bulk before anything happens. Archived branches can be unarchived at any time, and any branch can be flagged &quot;Skips Auto-Archiving&quot; if you want to protect it without formally pinning it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=17161274194899496502&quot; alt=&quot;Automatic Branch Management&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;other-changes-in-this-release&quot;&gt;Other changes in this release&lt;/h3&gt;
&lt;p&gt;Untracked files now show their contents directly in the diff view, the Windows build has been updated to run on .NET 10, and there are various fixes across the diff view, submodule handling, and multi-branch/tag operations.&lt;/p&gt;
&lt;p&gt;Full details: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.git-tower.com/blog/tower-windows-13&quot;&gt;Tower 13 for Windows release notes&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22761/git-branch-pinning-and-auto-archiving-whats-new-in-tower-13-for-windows</guid>
<pubDate>Wed, 15 Jul 2026 17:21:47 +0000</pubDate>
</item>
<item>
<title>Git Err: Updates were rejected because a pushed branch tip is behind its remote</title>
<link>https://coderlegion.com/7694/git-err-updates-were-rejected-because-a-pushed-branch-tip-is-behind-its-remote</link>
<description>&lt;p&gt;Git is a powerful tool for version control, allowing developers to collaborate seamlessly on projects. However, it's not uncommon to encounter errors and issues along the way. One such error that often bothers developers is &quot;&lt;strong&gt;Updates were rejected because a pushed branch tip is behind its remote.&lt;/strong&gt;&quot; . This error is seen when you're attempting to push changes to a remote branch that has progressed beyond your local branch's commit history. &lt;strong&gt;Fix&lt;/strong&gt;: Pull before pushing. In this article, we'll delve into what this error means, how to recreate it, and various solutions to resolve it.&lt;/p&gt;
&lt;h3 id=&quot;index-&quot;&gt;Index:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;What is this problem?&lt;/li&gt;
&lt;li&gt;How to recreate this issue?&lt;/li&gt;
&lt;li&gt;What was wrong here?&lt;/li&gt;
&lt;li&gt;Solutions&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;what-is-this-problem-&quot;&gt;What is this problem?&lt;/h2&gt;
&lt;p&gt;When you encounter the error message &quot;&lt;strong&gt;Updates were rejected because a pushed branch tip is behind its remote&lt;/strong&gt;&quot; it means that you're attempting to push changes to a remote branch that has progressed beyond your local branch's commit history. Essentially, the remote branch has received new commits that your local branch doesn't have, causing a conflict during the &lt;code&gt;push&lt;/code&gt; operation.&lt;/p&gt;
&lt;h2 id=&quot;how-to-recreate-this-issue-&quot;&gt;How to recreate this issue?&lt;/h2&gt;
&lt;p&gt;There are many scenarios in which this error can occur:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Parallel Development&lt;/strong&gt;: When multiple developers are working on the same branch concurrently and one developer pushes changes to the remote before another developer pulls and integrates those changes locally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reverting Commits&lt;/strong&gt;: If you revert commits locally and then attempt to push without reconciling the changes with the remote branch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Force Push&lt;/strong&gt;: Trying to force push changes without considering the implications, especially when working in a collaborative environment.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;div-green&quot;&gt;
&lt;span class=&quot;alert-header&quot;&gt;Tip:&lt;/span&gt;
&lt;span class=&quot;alert-body&quot;&gt;Regular communication can help avoid conflicts and ensure everyone is aware of ongoing changes.&lt;/span&gt;&lt;/div&gt;
&lt;h3 id=&quot;example-&quot;&gt;Example:&lt;/h3&gt;
&lt;p&gt;Suppose you're working on a collaborative project with a remote repository hosted on GitHub. You make some changes to a file locally and commit those changes to your branch.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git add .
$ git commit -m &quot;Updated feature X&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, when you attempt to push your changes to the remote repository,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; you encounter the error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;! [rejected]        main -&amp;gt; main (non-fast-forward)
error: failed to push some refs to 'https://github.com/username/repository.git'
hint: Updates were rejected because a pushed branch tip is behind its remote counterpart.
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;div-green&quot;&gt;
&lt;span class=&quot;alert-header&quot;&gt;Tip:&lt;/span&gt;&lt;span class=&quot;alert-body&quot;&gt; Pull changes from the remote branch frequently to keep your local repository up to date.&lt;/span&gt;&lt;/div&gt;
&lt;h3 id=&quot;error-message-&quot;&gt;Error message:&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=17962898645078665880&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-was-wrong-here-&quot;&gt;What was wrong here?&lt;/h2&gt;
&lt;p&gt;The error occurred because the remote branch has progressed since your last local commit. Therefore, Git refuses to accept the push to avoid overwriting changes made by others.&lt;/p&gt;
&lt;div class=&quot;div-blue&quot;&gt;
&lt;span class=&quot;alert-header&quot;&gt;Note:&lt;/span&gt;
&lt;span class=&quot;alert-body&quot;&gt;It's essential to understand the implications of Git operations like push and force push, especially in collaborative settings. Regularly syncing your local repository with the remote and communicating with your team can mitigate many issues.&lt;/span&gt;&lt;/div&gt;
&lt;h2 id=&quot;solutions-&quot;&gt;Solutions:&lt;/h2&gt;
&lt;h3 id=&quot;1-pull-changes-&quot;&gt;1. Pull Changes:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Steps using Command Line:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Terminal and navigate to your project directory.&lt;/li&gt;
&lt;li&gt;Run the command:&lt;code&gt;git pull origin &amp;lt;branch_name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If there are any conflicts, resolve them using next method or manually edit the conflicting files.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once conflicts are resolved, commit the changes and push them to the remote repository.&lt;/p&gt;
&lt;p&gt; $ git pull origin &lt;br&gt;
 $ git push&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Steps using Visual Studio Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;div class=&quot;div-blue&quot;&gt;&lt;span class=&quot;alert-header&quot;&gt;Note:&lt;/span&gt;&lt;span class=&quot;alert-body&quot;&gt; Ensure you have the Git extension installed (you can find it in the Extensions view by searching for &quot;Git&quot;).&lt;/span&gt;&lt;/div&gt;&lt;br&gt;
&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=4336068856119820402&quot; alt=&quot;&quot;&gt;
&lt;ol&gt;
&lt;li&gt;Open Visual Studio Code and navigate to your project directory.&lt;/li&gt;
&lt;li&gt;Open the Source Control view by clicking on the Git icon in the Activity Bar on the side.&lt;/li&gt;
&lt;li&gt;Click on the three dots (...) to open the More Actions menu.&lt;/li&gt;
&lt;li&gt;Click on &quot;Pull&quot; to fetch and integrate changes from the remote repository.&lt;/li&gt;
&lt;li&gt;If there are any conflicts, Visual Studio Code will prompt you to resolve them using its built-in merge tool.&lt;/li&gt;
&lt;li&gt;Resolve conflicts and stage the changes.&lt;/li&gt;
&lt;li&gt;Commit the changes using the check mark icon in the Source Control view.&lt;/li&gt;
&lt;li&gt;Push the changes to the remote repository by clicking on the &quot;Push&quot; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=14479811573394604736&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-rebase-&quot;&gt;2. Rebase:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Steps using Command Line::&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open terminal and navigate to your project directory.&lt;/li&gt;
&lt;li&gt;Run the command: &lt;code&gt;git rebase origin/&amp;lt;branch_name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Resolve any conflicts that arise during the rebase process. You will see prompts to resolve conflicts.&lt;/li&gt;
&lt;li&gt;Once conflicts are resolved, continue the rebase process by running: &lt;code&gt;git rebase --continue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After the rebase is complete, push your changes to the remote repository.&lt;/p&gt;
&lt;p&gt; $ git rebase origin/&lt;br&gt;
 $ git rebase --continue&lt;br&gt;
 $ git push&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Steps using Visual Studio Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;div class=&quot;div-blue&quot;&gt;&lt;span class=&quot;alert-header&quot;&gt;Note:&lt;/span&gt;&lt;span class=&quot;alert-body&quot;&gt; Ensure you have the Git extension installed (you can find it in the Extensions view by searching for &quot;Git&quot;).&lt;/span&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Open Visual Studio Code and navigate to your project directory.&lt;/li&gt;
&lt;li&gt;Open the Source Control view by clicking on the Git icon in the Activity Bar on the side.&lt;/li&gt;
&lt;li&gt;Click on the three dots (...) to open the More Actions menu.&lt;/li&gt;
&lt;li&gt;Click on &quot;Pull&quot; to fetch and integrate changes from the remote repository.&lt;/li&gt;
&lt;li&gt;Once the pull is complete, click on the three dots (...) again and select &quot;Rebase&quot; from the More Actions menu.&lt;/li&gt;
&lt;li&gt;If there are any conflicts during the rebase process, Visual Studio Code will prompt you to resolve them using its built-in merge tool.&lt;/li&gt;
&lt;li&gt;Resolve conflicts and stage the changes.&lt;/li&gt;
&lt;li&gt;Continue the rebase process by clicking on the &quot;Continue&quot; button in the Source Control view.&lt;/li&gt;
&lt;li&gt;Once the rebase is complete, push the changes to the remote repository by clicking on the &quot;Push&quot; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=5539620579975289607&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-force-push-with-caution-&quot;&gt;3. Force Push (with caution):&lt;/h3&gt;
&lt;div class=&quot;div-red&quot;&gt;
&lt;span class=&quot;alert-header&quot;&gt;Caution:&lt;/span&gt;
&lt;span class=&quot;alert-body&quot;&gt;Force pushing should be used sparingly and only when necessary. Always communicate with your team before force pushing to avoid conflicts and data loss.
&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Steps using Command Line:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Terminal and navigate to your project directory.&lt;/li&gt;
&lt;li&gt;Run the command: &lt;code&gt;git push -f origin &amp;lt;branch_name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Confirm that you understand the consequences of force pushing and ensure that you're not overwriting any important changes.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push your changes to the remote repository using force push.&lt;/p&gt;
&lt;p&gt; $ git push -f origin &lt;br&gt;
 $ git push&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Steps using Visual Studio Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;div class=&quot;div-blue&quot;&gt;&lt;span class=&quot;alert-header&quot;&gt;Note:&lt;/span&gt;&lt;span class=&quot;alert-body&quot;&gt; Ensure you have the Git extension installed (you can find it in the Extensions view by searching for &quot;Git&quot;).&lt;/span&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Open Visual Studio Code and navigate to your project directory.&lt;/li&gt;
&lt;li&gt;Open the Source Control view by clicking on the Git icon in the Activity Bar on the side.&lt;/li&gt;
&lt;li&gt;Make sure you have the latest changes by pulling from the remote repository (click on the three dots (...) and select &quot;Pull&quot;).&lt;/li&gt;
&lt;li&gt;After ensuring that you're not overwriting any important changes, click on the &quot;...&quot; button and select &quot;Push&quot; from the More Actions menu.&lt;/li&gt;
&lt;li&gt;In the confirmation dialog, check the box labelled &quot;Force Push&quot; and click on the &quot;Push&quot; button to force push your changes to the remote repository.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=8334307239769144953&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;div class=&quot;div-faq&quot;&gt;
&lt;span class=&quot;faq-header&quot;&gt;FAQs&lt;/span&gt;
   &lt;span class=&quot;faq-body&quot;&gt;Q. Can I lose my changes by force pushing?&lt;br&gt;
A. Yes, force pushing can overwrite commits on the remote branch, potentially losing others' work. Use it judiciously and communicate with your team.
  &lt;br&gt;&lt;br&gt;Q. Why does Git reject non-fast-forward pushes?&lt;br&gt;A. Non-fast-forward pushes are rejected to prevent unintentional overwriting of commit history. They can lead to data loss and conflicts in collaborative environments.
&lt;/span&gt;&lt;/div&gt;
&lt;h2 id=&quot;conclusion-&quot;&gt;Conclusion:&lt;/h2&gt;
&lt;p&gt;The &quot;&lt;strong&gt;Updates were rejected because a pushed branch tip is behind its remote&lt;/strong&gt;&quot; error in &lt;code&gt;Git&lt;/code&gt; can be frustrating, but understanding its causes and solutions can help you overcome it effectively. By following best practices like regular pulls, communication, and cautious use of force push, you can streamline your development workflow and minimize conflicts.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;references-&quot;&gt;References:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://git-scm.com/doc&quot;&gt;Git Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://guides.github.com/&quot;&gt;GitHub Guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.atlassian.com/git&quot;&gt;Atlassian Git Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/7694/git-err-updates-were-rejected-because-a-pushed-branch-tip-is-behind-its-remote</guid>
<pubDate>Mon, 24 Nov 2025 00:19:50 +0000</pubDate>
</item>
<item>
<title>Git Basics: A Beginner's Guide to Branches</title>
<link>https://coderlegion.com/7212/git-basics-a-beginners-guide-to-branches</link>
<description>&lt;h5 id=&quot;this-article-explores-git-branches-and-their-role-in-version-control-you-ll-learn-about-team-practices-of-creating-merging-and-managing-branches-gaining-essential-skills-for-collaborative-projects-&quot;&gt;This article explores Git branches and their role in version control. You'll learn about team practices of creating, merging, and managing branches, gaining essential skills for collaborative projects!&lt;/h5&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1762817008465/2fbf2984-19a6-4d23-b41c-7d804d10346e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-is-version-control-&quot;&gt;What is Version Control?&lt;/h4&gt;
&lt;p&gt;Version control is a system that helps track changes to files over time. It allows multiple people to collaborate on a project, keeping a history of modifications, so you can revert to previous versions if needed. This is especially useful in software development, where teams collaborate on code, ensuring everyone is on the same page and changes are managed efficiently.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-are-git-branches-&quot;&gt;What are Git Branches?&lt;/h4&gt;
&lt;p&gt;In the context of version control, Git branches are like separate workspaces within a project. They allow you to work on different features or fixes without affecting the main codebase. Each branch can be developed independently, and once the work is complete, it can be merged back into the main branch. This system enables teams to collaborate efficiently, allowing multiple people to work on different tasks simultaneously without interfering with each other's work.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;merge-develop-into-the-master-branch&quot;&gt;Merge Develop into the Master Branch&lt;/h4&gt;
&lt;p&gt;When working alone, you'll likely build your projects directly on the default master (main) branch. Even when you start to create individual branches, they will be made from the master branch and be merged back into it. However, when working on a team project, there is usually a development (develop) branch in addition to the master branch, and it is vital to understand how to work with them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In my recent experience, when implementing a professional Agile workflow in my personal project, I finally understood the concept of having both a develop and master branch. Now that I was creating individual branches for each of my issues, each time I pushed to the default master branch, a deployment was triggered (though Netlify). So I initially thought, “Why am I bothering to make new branches, since I am not working in isolation?” Then I realized that is precisely what the develop branch is for. The purpose of the develop branch is to serve as an integration branch for features before they are ready for production.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In a team-based environment, once you have finished working on your individual issue branch, push and merge it into the develop branch (not the master branch). When all the individual issue branches are merged into the develop branch, yours and presumably those of fellow team members, it is the “develop branch” that gets merged into the “master branch,” which will then trigger a deployment if configured to do so. The master branch is typically the production-ready branch, which is why merging into it triggers deployment.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By following this workflow, you and other team members can confidently work on your own individual branches, contributing to the project simultaneously. Then, when all of the branches are accepted and merged into the develop branch, the team’s work will be deployed to the project once the develop branch is merged into the master branch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; Note:&lt;/strong&gt; &lt;em&gt;When working on issue branches, it is essential to follow a team-based Agile workflow, which includes testing and code review to ensure quality before merging them into the develop branch.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;make-your-issue-branch-from-develop&quot;&gt;Make Your Issue Branch from Develop&lt;/h4&gt;
&lt;p&gt;As I am sure you know, it's crucial to pull all changes from the remote branches first to ensure all files are updated with the latest versions. If you've been working alone for a long time, it might take some time to get used to pulling changes first.&lt;/p&gt;
&lt;p&gt;When working on a team project, you'll need to create branches to address individual issues. Generally, these issue branches are created from the develop branch rather than the master branch. So, be sure that you clarify with your team which branch to use as the base for your issue branches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; Note:&lt;/strong&gt; &lt;em&gt;To maintain consistency and avoid conflicts, it's essential to pull changes from both the master and develop branches regularly. This practice ensures that your branch is synchronized with the latest updates from the main codebase and the develop branch. By doing so, you minimize the risk of merge conflicts and ensure a smoother integration process when your work is ready to be merged back into the main branches.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;agile-development&quot;&gt;Agile Development&lt;/h4&gt;
&lt;p&gt;Having covered the overall concept of working with branches, it's important to note that there are specific conventions and workflows for creating them. These conventions are often guided by Agile development principles, which emphasize flexibility, collaboration, and iterative progress in software projects —principles that my team follows.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Members of the&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/blog-posts/bridging-the-skills-gap-empowering-junior-developers-through-apprenticeship-programs&quot;&gt;&lt;em&gt;Gridiron Survivor apprenticeship program&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, of which I am a part, work on individual issue branches of our current project,&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/LetsGetTechnical/elecretanta&quot;&gt;&lt;em&gt;Elfgorithm&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, a&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://elfgorithm.vercel.app/&quot;&gt;&lt;em&gt;Secret Santa-style gift exchange app&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. We use naming conventions for the branches and organize our work into Sprints, which are time-boxed periods during which specific tasks or features are developed. Each individual issue branch undergoes review and testing to ensure quality and functionality.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The naming conventions we use for branches include the programmer’s name, issue number, type (the kind of work), and a short description of the branch’s purpose:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;\[YourName\]/\[IssueNumber\]-\[type\]-\[IssueDescription\]&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using naming conventions for branches enhances project organization and efficiency, allowing branches to be quickly identified and facilitating collaboration.&lt;/p&gt;
&lt;p&gt;These conventions also improve Git automation. Scripts can recognize branch patterns to trigger actions, such as tests or notifications, resulting in reduced manual effort and ensuring consistency. Linking Sprint ticket numbers to issue branches connects the code to project management tools, simplifying progress tracking and aligning work with tasks.&lt;/p&gt;
&lt;p&gt;Overall, structured naming conventions improve organization, communication, and workflow efficiency in software development.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;deleting-with-an-individual-issue-branch&quot;&gt;Deleting with an Individual Issue Branch&lt;/h4&gt;
&lt;p&gt;Once your individual issue branch is accepted and merged into the develop, it is then safe to delete it. GitHub provides a “Delete Branch“ button for easy removal on the remote repository. You will also need to delete your issue branch in your local repository.&lt;/p&gt;
&lt;p&gt;Once your issue branch is deleted from both the remote and local repositories, remember to pull the changes from the master and the newly merged develop branch. This ensures your local repository is up-to-date with the latest changes. Afterward, you can use &lt;code&gt;git fetch --prune&lt;/code&gt; to clean up your local repository by removing any remote-tracking references that no longer exist on the remote.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;merge-conflicts&quot;&gt;Merge Conflicts&lt;/h4&gt;
&lt;p&gt;Dealing with merge conflicts deserves its own article, but it’s important to understand, so I will provide a brief overview.&lt;/p&gt;
&lt;p&gt;A merge conflict occurs when Git is unable to resolve differences in code between two branches automatically. This typically happens when two team members make changes to the same part of a file. For example, imagine two team members both update the README file and change the same line. Git doesn't know which change to keep, so it flags this as a conflict.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To fix a merge conflict, you'll need to manually review the conflicting changes and decide which version to keep. Here's a simple way to handle it:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identify the Conflict&lt;/strong&gt;: When you try to merge, Git will notify you of the conflict and mark the conflicting areas in the file. You'll see markers like &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;=======&lt;/code&gt;, and &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; indicating the different changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resolve the Conflict&lt;/strong&gt;: Open the file in a text editor and look for these markers. Decide which changes to keep or if you need to combine them. Remove the markers and ensure the file appears as you want it to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mark as Resolved&lt;/strong&gt;: Once you've resolved the conflict, save the file and use &lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt; to mark it as resolved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complete the Merge&lt;/strong&gt;: Finally, commit the changes with &lt;code&gt;git commit&lt;/code&gt; to complete the merge process.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By understanding and resolving merge conflicts, you ensure that your team's work is integrated smoothly and accurately!&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;about-us&quot;&gt;About Us&lt;/h4&gt;
&lt;h5 id=&quot;what-is-gridiron-survivor-&quot;&gt;What is Gridiron Survivor?&lt;/h5&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/blog-posts/bridging-the-skills-gap-empowering-junior-developers-through-apprenticeship-programs&quot;&gt;&lt;em&gt;Gridiron Survivor&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is an apprenticeship program created by Shashi Lo, a Senior UX Engineer at Microsoft. It aims to provide developers entering the tech industry with vital work experience. The program focuses on practical training in project management, coding practices, and team collaboration, offering mentorship and skills essential for success in their initial tech roles.&lt;/em&gt;&lt;/p&gt;
&lt;h5 id=&quot;what-is-the-elfgorithm-app-&quot;&gt;What is the Elfgorithm App?&lt;/h5&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/LetsGetTechnical/elecretanta&quot;&gt;&lt;em&gt;Elfgorithm&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is an AI-driven Secret Santa app set to launch in winter 2025. It streamlines gift exchanges by removing the guesswork from Secret Santa activities. The app manages gift-giving details and provides personalized gift suggestions, ensuring you find the perfect presents for everyone.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1762879391246/c68671cf-87e7-49a2-af0e-ca5d3f3ac7cf.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;gridiron-survivor-sponsors&quot;&gt;Gridiron Survivor Sponsors&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;A very special thanks to our sponsors!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.gitkraken.com/&quot;&gt;GitKraken&lt;/a&gt;: &lt;em&gt;A popular Git client that provides a graphical interface to manage Git repositories. It is known for its user-friendly design and features that simplify version control, making it easier for developers to collaborate and manage their code.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.frontendmentor.io/&quot;&gt;Frontend Mentor&lt;/a&gt;: &lt;em&gt;An online platform that offers front-end coding challenges. It helps developers improve their skills by providing real-world projects to work on, along with a supportive community for feedback and learning.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;: &lt;em&gt;A cloud platform for static sites and serverless functions. It is designed to optimize the workflow of developers by providing tools for building, deploying, and scaling modern web applications with ease. Vercel is known for its seamless integration with frameworks like Next.js.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;my-other-related-articles&quot;&gt;My other related articles&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/11-25/git-basics-a-beginners-guide-to-naming-conventions/&quot;&gt;Git Basics: A Beginner's Guide to Naming Conventions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/10-25/sprint-workflow-a-beginners-guide-to-agile-development/&quot;&gt;Sprint Workflow: A Beginner's Guide to Agile Development&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/blog-posts/bridging-the-skills-gap-empowering-junior-developers-through-apprenticeship-programs&quot;&gt;Bridging the Skills Gap: Empowering Junior Developers Through Apprenticeship Programs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/04-25/gridiron-survivor's-elfgorithm-introduction-and-team-installation/&quot;&gt;Gridiron Survivor's Elfgorithm: Introduction and Team Installation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/05-25/software-versioning-a-developers-guide-to-semantic-and-github-releases/&quot;&gt;Software Versioning: A Developer's Guide to Semantic and GitHub Releases&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/05-25/creating-cohesive-design-systems-with-atomic-design-principles/&quot;&gt;Creating Cohesive Design Systems with Atomic Design Principles&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740168177634/1ff578a9-5d03-4800-9c0c-9092e4e60c4f.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;be-sure-to-listen-to-the-html-all-the-things-podcast-&quot;&gt;&lt;strong&gt;Be sure to listen to the HTML All The Things Podcast!&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id=&quot;i-also-write-articles-for-the-html-all-the-things-podcast-which-you-can-read-on-their-website-https-www-htmlallthethings-com-&quot;&gt;&lt;em&gt;I also write articles for the HTML All The Things Podcast, which you can read on their website:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/&quot;&gt;&lt;em&gt;https://www.htmlallthethings.com/&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/h5&gt;
&lt;h5 id=&quot;be-sure-to-check-out-html-all-the-things-on-socials-&quot;&gt;&lt;strong&gt;Be sure to check out HTML All The Things on socials!&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/htmleverything&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/company/html-all-the-things/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.tiktok.com/@htmlallthethings&quot;&gt;TikTok&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.instagram.com/htmlallthethings/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;affiliate-amp-discount-links-&quot;&gt;Affiliate &amp;amp; Discount Links!&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740168473785/c85789c9-1594-4000-aa2f-43e842f9825f.jpeg&amp;quot;&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With CodeMonkey, learning can be all fun and games!&lt;/strong&gt; CodeMonkey transforms education into an engaging experience, enabling children to evolve from tech consumers to creators. Use CodeMonkey's &lt;strong&gt;FREE trial&lt;/strong&gt; to unlock the incredible potential of young tech creators!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With a structured learning path tailored for various age groups, kids progress from block coding to more advanced topics like data science and artificial intelligence, using languages such as CoffeeScript and Python. The platform includes features for parents and teachers to track progress, making integrating coding into home and classroom settings easy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Through fun games, hands-on projects, and community interaction, CodeMonkey helps young learners build teamwork skills and receive recognition for their achievements. It fosters a love for coding and prepares children for future career opportunities in an ever-evolving tech landscape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;To learn more about CodeMonkey, you can read my detailed&lt;/em&gt;&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/02-25/inspiring-young-coders-how-codemonkey-turns-kids-into-tech-creators/&quot;&gt;&lt;strong&gt;&lt;em&gt;review article&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affiliate Links:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919057/12259&quot;&gt;Sign Up for Parents&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919060/12259&quot;&gt;Sign Up for Teachers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740169191630/ac8c5360-d1c5-4c85-8504-18b9c755841e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;advance-your-career-with-a-20-discount-on-scrimba-pro-using-this-affiliate-link-&quot;&gt;Advance your career with a 20% discount on Scrimba Pro using this &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;affiliate link&lt;/a&gt;!&lt;/h4&gt;
&lt;p&gt;Become a hireable developer with Scrimba Pro! Discover a world of coding knowledge with full access to all courses, hands-on projects, and a vibrant community. You can &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2021/06-21/06-07-21/&quot;&gt;read my article&lt;/a&gt; to learn more about my exceptional experiences with Scrimba and how it helps many become confident, well-prepared web developers!&lt;/p&gt;
&lt;h6 id=&quot;important-this-discount-is-for-new-accounts-only-if-a-higher-discount-is-currently-available-it-will-be-applied-automatically-&quot;&gt;&lt;strong&gt;&lt;em&gt;Important:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;This discount is for new accounts only. If a higher discount is currently available, it will be applied automatically.&lt;/em&gt;&lt;/h6&gt;
&lt;p&gt;&lt;strong&gt;How to Claim Your Discount:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;the link&lt;/a&gt; to explore the new Scrimba 2.0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrade to Pro; the 20% discount will automatically apply.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id=&quot;disclosure-this-article-contains-affiliate-links-i-will-earn-a-commission-from-any-purchases-made-through-these-links-at-no-extra-cost-to-you-your-support-helps-me-continue-creating-valuable-content-thank-you-&quot;&gt;&lt;strong&gt;&lt;em&gt;Disclosure:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;This article contains affiliate links. I will earn a commission from any purchases made through these links at no extra cost to you. Your support helps me continue creating valuable content. Thank you!&lt;/em&gt;&lt;/h6&gt;
&lt;hr&gt;
&lt;h4 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Version control is a system that tracks changes to files over time, enabling multiple people to collaborate on a project and revert to previous versions if necessary. In development, branches provide separate workspaces within a project, enabling the independent development of features or fixes without affecting the main codebase. In a team project, there are typically both a development branch and a master branch. The team works on the development branch, which is eventually merged into the master branch.&lt;/p&gt;
&lt;p&gt;Individual issue branches are created from the development branch. Once a team member completes an issue branch, it undergoes review and testing as part of Agile development practices before being merged back into the development branch. These issue branches are deleted from both the remote and local repositories after they are merged to maintain a clean codebase.&lt;/p&gt;
&lt;p&gt;When working with a team, merge conflicts happen when multiple developers change the same part of a file in different branches. You need to manually resolve these conflicts by reviewing the changes, deciding which ones to keep, and removing the conflict markers. Handling merge conflicts effectively is crucial for maintaining a smooth workflow and ensuring the accurate integration of team members' work.&lt;/p&gt;
&lt;p&gt;Practicing is the best way to learn! Even if you're working solo, you can apply Agile workflows to your personal projects by creating, merging, and managing branches. This approach will help you develop marketable skills as you learn and implement Agile workflows!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Let’s connect! I’m active on&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/michaeljudelarocca/&quot;&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/MikeJudeLarocca&quot;&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:700/0*WkkMi-AgjubeODf8.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h6 id=&quot;are-you-now-confident-in-managing-git-branches-for-collaborative-projects-do-you-have-other-tips-for-handling-merge-conflicts-effectively-please-share-the-article-and-comment-&quot;&gt;&lt;em&gt;Are you now confident in managing Git branches for collaborative projects? Do you have other tips for handling merge conflicts effectively? Please share the article and comment!&lt;/em&gt;&lt;/h6&gt;
&lt;hr&gt;
</description>
<category>GitHub</category>
<guid isPermaLink="true">https://coderlegion.com/7212/git-basics-a-beginners-guide-to-branches</guid>
<pubDate>Tue, 11 Nov 2025 21:49:11 +0000</pubDate>
</item>
<item>
<title>Why Every Developer Should Learn Git Early</title>
<link>https://coderlegion.com/6499/why-every-developer-should-learn-git-early</link>
<description>&lt;h3 id=&quot;why-every-developer-should-learn-git-early&quot;&gt;&lt;strong&gt;Why Every Developer Should Learn Git Early&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&quot;introduction-1&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;When I started coding, I focused only on writing code that &lt;em&gt;worked&lt;/em&gt;. But soon, I realized that writing code is just half the journey  &lt;strong&gt;managing it&lt;/strong&gt; is equally important. That’s when I discovered &lt;strong&gt;Git&lt;/strong&gt;, and it completely changed how I approached development.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-is-git-and-why-it-matters&quot;&gt;&lt;strong&gt;What Is Git and Why It Matters&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Git is a &lt;strong&gt;version control system&lt;/strong&gt; that tracks changes in your code. It allows you to save versions of your project, collaborate with others, and recover previous states if something breaks.&lt;/p&gt;
&lt;p&gt;Whether you’re a solo developer or part of a team, Git helps you stay organized and confident in your workflow.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;how-git-makes-a-difference&quot;&gt;&lt;strong&gt;How Git Makes a Difference&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Here’s what learning Git early taught me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mistakes aren’t scary anymore&lt;/strong&gt; — you can always roll back to a working version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teamwork becomes easier&lt;/strong&gt; — multiple people can work on the same project without overwriting each other’s code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean progress tracking&lt;/strong&gt; — you can see &lt;em&gt;when&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt; changes were made.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confidence in deployment&lt;/strong&gt; — version history ensures that production code is safe and traceable.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;tools-and-platforms-that-helped-me&quot;&gt;&lt;strong&gt;Tools and Platforms That Helped Me&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt; — for storing and showcasing my projects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VS Code + Git Integration&lt;/strong&gt; — for smooth commit and push actions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command Line / Terminal&lt;/strong&gt; — for mastering essential commands like &lt;code&gt;git init&lt;/code&gt;, &lt;code&gt;git add&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, and &lt;code&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’re new, start by creating a small project and pushing it to GitHub  that’s how I built my first repository, and it helped me understand how professional developers manage their work.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;my-advice-to-beginners&quot;&gt;&lt;strong&gt;My Advice to Beginners&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Learning Git early builds discipline and confidence. You stop being afraid of “breaking things” and start experimenting more  which is exactly how growth happens.&lt;/p&gt;
&lt;p&gt;Don’t wait until you join a team to learn Git. &lt;strong&gt;Start now&lt;/strong&gt;, even if you’re coding alone.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;let-s-connect&quot;&gt;&lt;strong&gt;Let’s Connect&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;I’d love to hear how Git has impacted your developer journey or if you’re just getting started.&lt;br&gt;
Share your thoughts or connect with me on&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/the_duchess_of_hackers&quot;&gt;dev.to&lt;/a&gt; • &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/gracequaye1&quot;&gt;GitHub&lt;/a&gt; • &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/grace-okailey-quaye&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Signature&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;The Duchess of Hackers&lt;/em&gt; &lt;br&gt;
Full-Stack Developer | Digital Marketer&lt;/p&gt;
&lt;hr&gt;
</description>
<category>Git &amp; Version Control</category>
<guid isPermaLink="true">https://coderlegion.com/6499/why-every-developer-should-learn-git-early</guid>
<pubDate>Thu, 16 Oct 2025 00:26:56 +0000</pubDate>
</item>
<item>
<title>Git Conventions (part 1/3)</title>
<link>https://coderlegion.com/5649/git-conventions-part-1-3</link>
<description>&lt;p&gt;Over the last decade or so, I have had the opportunity to experiment with various git usage strategies and styles. Ranging from branch names, to pull request descriptions, a lot of time has been spent thinking about how to best describe our work to convey as much information clearly and concisely to others. There are a wealth of strategies or style guides on how to best utilise the git ecosystem but there is no silver bullet that solves all potential scenarios. What follows is an outline of some of the rules and guides I have incorporated into my daily git life which has best worked for my team and me.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: This is an evolving document which has been altered and tuned over the years. It may not apply to you and your situation but perhaps there is a nugget or two here that could improve your workflow and developer happiness.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;branches&quot;&gt;Branches&lt;/h3&gt;
&lt;p&gt;99% of the time, code changes fall into one of a handful of categories/types. When creating a new branch, naming it something clear and meaningful can help other developers know at a glance what sort of changes are been introduced. It can also simplify finding a branch using tab completion locally when jumping between branches.&lt;/p&gt;
&lt;h4 id=&quot;branch-types&quot;&gt;Branch Types&lt;/h4&gt;
&lt;p&gt;The following branch &lt;strong&gt;types&lt;/strong&gt; should suit most use cases. These can be refined or altered depending on your use case (for instance, one might not utilise the &lt;strong&gt;style&lt;/strong&gt; type if they work on CLI scripts for a living)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;feature&lt;/strong&gt; &lt;em&gt;- a new feature&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fix&lt;/strong&gt; &lt;em&gt;- bug fixes, hotfixes, typos, etc&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;style&lt;/strong&gt; &lt;em&gt;- UI / UX style changes&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;test&lt;/strong&gt; &lt;em&gt;- adding or refactoring tests; no production code changes&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;housekeeping&lt;/strong&gt; &lt;em&gt;- everything from code refactoring to updating documentation&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;devops&lt;/strong&gt; &lt;em&gt;- updates to configuration files, software versions, etc&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;branch-format&quot;&gt;Branch Format&lt;/h4&gt;
&lt;p&gt;The proposed branch format will make it easy to see at a glance what type of work has been done in the branch with a clean and easy-to-read branch name. The max length of a branch name is 255 characters but where possible, I try to keep the length to no more than 50 characters for readability purposes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;type-name_of_branch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The type is separated from the branch name with a &lt;code&gt;-&lt;/code&gt; while the rest of the name is done in snake case (words separated by &lt;code&gt;_&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Alternatively, if using a task/issue tracking application, like JIRA or GitHub projects, it adds additional visibilty to include the issue/ticket number in with the branch, and using a &lt;code&gt;/&lt;/code&gt; instead of &lt;code&gt;-&lt;/code&gt; can aid in making the branch name a little easier to read, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;type/ticket#-name_of_branch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Examples branch names:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;feature-add_user_authentication
fix-about_page_infinite_redirect

// or

feature/21-add_user_authentication
fix/42-about_page_infinite_redirect
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;commits&quot;&gt;Commits&lt;/h3&gt;
&lt;p&gt;Developing a structured format for our commit messages will clarify each commit's purpose resulting in a cleaner git history. At a glance, one will know if a commit is intended to add a feature, fix a bug or just improve code quality. We should aim to keep the work done within a branch small and testable, often resulting in there only being a single commit per branch, however, it's better to have lots of small atomic commits within a branch than having all the commits squashed into one before merging. This makes bisecting introduced bugs a lot easier.&lt;/p&gt;
&lt;h4 id=&quot;commit-message-template-&quot;&gt;Commit Message Template:&lt;/h4&gt;
&lt;p&gt;This is a sample commit template I have been using for a while now. As I try to keep my commits granular and bespoke, I define the first line leaving everything else commented out. However, if you are pushing up a commit that involves a lot of changes, perhaps references a specific issue or task item, or includes changes that could affect future development, it is recommended to flesh out the commit message with as much information as possible to help future you (or team members) get a clear picture of the work done by looking at your commit alone.&lt;/p&gt;
&lt;p&gt;The commit subject, as seen below, has the convention of starting with the type of work being committed (bug, feature, housekeeping, etc) all in lowercase, followed by a semicolon, space and commit message, starting capitalised, in the imperative form, without any full stop at the end.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt; type: [Ticket#](Optional) Summary of change

 # **--- Proposed Changes ---**
 #
 #
 # Issue / Task: [name](url)

 # --- COMMIT END --- (informational only, do not uncomment)
 # &amp;lt;type&amp;gt;: &amp;lt;subject&amp;gt; (Approx 50 characters)
 # |&amp;lt;----  Using a Maximum Of 50 Characters  ----&amp;gt;|
 # Explain why this change is being made
 # |&amp;lt;----   Try To Limit Each Line to a Maximum Of 72 Characters   ----&amp;gt;|
 # --------------------
 # Type can be
 #    feature      (new feature)
 #    fix          (bug fix)
 #    style        (UI / UX style changes)
 #    test         (adding or refactoring tests; no production code change)
 #    housekeeping (refactoring code or adding documentation)
 #    devops       (background / architecture changes)
 # --------------------
 # Remember to
 #   - Use the imperative mood in the subject line
 #   - Do not end the subject line with a period
 #   - Separate subject from body with a blank line
 #   - Use the body to explain what and why vs. how
 # --------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All the lines starting with a &lt;code&gt;#&lt;/code&gt; are commented out and will not be displayed when viewing the commit message so if you intend to add future detail to your commit message, be sure to uncomment the lines necessary.&lt;/p&gt;
&lt;p&gt;You can set up your default git commit message template with&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;git config --global commit.template ~/.gitmessage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Example commit messages:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;feature: Add user authentication
fix: About page infinite redirect

// or

feature: [21] Adds user authentication
fix: [42] About page infinite redirect
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Very often when jumping into a piece of work, I might not know right off the bat what the commit message will be as it tends to evolve as the work gets completed. In this case, I usually start my commit with something like&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;wip: Not sure what the issue is
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and later on, once having completed the work and getting the branch ready for review, rename the commit messages appropriately during an interactive rebase (&lt;code&gt;git rebase -i&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&quot;closing-comments&quot;&gt;Closing Comments&lt;/h3&gt;
&lt;p&gt;This is by no means the definitive git convention standard to employ and it is something that is continually evolving and morphing as I find myself working on new and different projects. Everyone's experience is different and must be dealt with accordingly but, perhaps there are a few nuggets here that could help you guide a more structured and concise git workflow.&lt;/p&gt;
&lt;p&gt;To further the conventions, I have also put together standard workflows, processes, and templates when it comes to GitHub Pull Requests (PR) and Issues affecting code reviews, QA testing, and deployment, but that is a story for another post.&lt;/p&gt;
&lt;h3 id=&quot;additional-resources&quot;&gt;Additional Resources&lt;/h3&gt;
&lt;p&gt;1.) A lot of the inspiration for these conventions has been taken from &quot;Conventional Commits&quot;.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.conventionalcommits.org/en/v1.0.0/#why-use-conventional-commits&quot;&gt;https://www.conventionalcommits.org/en/v1.0.0/#why-use-conventional-commits&lt;/a&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://marcodenisi.dev/en/blog/why-you-should-use-conventional-commits/&quot;&gt;https://marcodenisi.dev/en/blog/why-you-should-use-conventional-commits/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2.) A classic article on how best to write commit messages. I have gleaned a lot of the commit message advice in this article to supplement my variation.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cbea.ms/git-commit/#imperative&quot;&gt;https://cbea.ms/git-commit/#imperative&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3.) A commit linting tool you can incorporate into your workflow to enforce a standard of commit messages. Can be configured in a pre-commit GIT hook.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://commitlint.js.org/#/&quot;&gt;https://commitlint.js.org/#/&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/5649/git-conventions-part-1-3</guid>
<pubDate>Fri, 26 Sep 2025 14:48:55 +0000</pubDate>
</item>
<item>
<title>GitHub Repo Security: Your Easy Go-To Checklist</title>
<link>https://coderlegion.com/4758/github-repo-security-your-easy-go-to-checklist</link>
<description>&lt;p&gt;Hey there! If you’re managing a GitHub repo, you know it’s more than just a place to stash code—it’s your project’s home. I’ve put together a checklist of GitHub settings to keep your repo secure and organized, sticking to the exact options you’ll see in GitHub’s interface. For each section, I’ve added a few tips to make your life easier based on what I’ve learned messing around with repos. Let’s dive in!&lt;/p&gt;
&lt;h3 id=&quot;a-general-settings&quot;&gt;A. General Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository Visibility&lt;/strong&gt;: Set to &lt;em&gt;Public&lt;/em&gt; (if intended) or &lt;em&gt;Private&lt;/em&gt; for restricted access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository name&lt;/strong&gt;: Keep it clear and descriptive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: Add a brief description.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Topics&lt;/strong&gt;: Add relevant topics for better discoverability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default Branch&lt;/strong&gt;: Set to &lt;em&gt;main&lt;/em&gt; (or another preferred default).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Archiving&lt;/strong&gt;: Disable if the repo is active.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For the repo name, think about future-proofing—something like &lt;code&gt;project-v2&lt;/code&gt; can avoid confusion if you iterate later.&lt;/li&gt;
&lt;li&gt;Use topics strategically (e.g., “javascript”, “open-source”) to attract contributors searching for projects like yours.&lt;/li&gt;
&lt;li&gt;If archiving, consider leaving a note in the README about why it’s archived and where to find active forks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;b-branch-protection-rules&quot;&gt;B. Branch Protection Rules&lt;/h3&gt;
&lt;p&gt;Go to: &lt;code&gt;Settings → Branches → Branch protection rules → Add rule&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Configure for &lt;em&gt;main&lt;/em&gt; (or default branch):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☑ Require a pull request before merging&lt;/li&gt;
&lt;li&gt;☑ Require approvals (at least 1-2)&lt;/li&gt;
&lt;li&gt;☑ Dismiss stale pull request approvals&lt;/li&gt;
&lt;li&gt;☑ Require review from Code Owners&lt;/li&gt;
&lt;li&gt;☑ Require status checks to pass before merging (e.g., CI/CD checks)&lt;/li&gt;
&lt;li&gt;☑ Require branches to be up to date before merging&lt;/li&gt;
&lt;li&gt;☑ Require conversation resolution before merging&lt;/li&gt;
&lt;li&gt;☑ Require linear history (optional but prevents merge commits)&lt;/li&gt;
&lt;li&gt;☑ Do not allow bypassing the above settings (even for admins)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set up a &lt;code&gt;CODEOWNERS&lt;/code&gt; file in your repo to auto-assign reviewers for specific files or folders.&lt;/li&gt;
&lt;li&gt;For status checks, integrate tools like GitHub Actions or external CI/CD platforms to catch bugs early.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;c-actions-amp-workflows-permissions&quot;&gt;C. Actions &amp;amp; Workflows Permissions&lt;/h3&gt;
&lt;p&gt;Go to: &lt;code&gt;Settings → Actions → General&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actions permissions&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☑ Allow all actions (or restrict to only verified actions if security is critical).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Workflow permissions&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☑ Read repository contents and packages permissions (least privilege).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you’re restricting actions, check the GitHub Marketplace for verified actions to avoid reinventing the wheel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;d-collaborators-amp-teams&quot;&gt;D. Collaborators &amp;amp; Teams&lt;/h3&gt;
&lt;p&gt;Go to: &lt;code&gt;Settings → Collaborators &amp;amp; Teams&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only grant &lt;em&gt;Write&lt;/em&gt;/&lt;em&gt;Admin&lt;/em&gt; access to trusted contributors.&lt;/li&gt;
&lt;li&gt;Prefer Pull Requests (PRs) over direct commits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create teams for different roles (e.g., “Developers”, “Maintainers”) to streamline access management.&lt;/li&gt;
&lt;li&gt;If you’re open-source, clearly document how contributors can request access in your CONTRIBUTING.md.&lt;/li&gt;
&lt;li&gt;Regularly review collaborator lists to remove inactive users—trust me, it’s easy to forget!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;e-security-amp-moderation&quot;&gt;E. Security &amp;amp; Moderation&lt;/h3&gt;
&lt;p&gt;Go to: &lt;code&gt;Settings → Advanced Security&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☑ Enable vulnerability alerts (Dependabot).&lt;/li&gt;
&lt;li&gt;☑ Enable Dependabot security updates.&lt;/li&gt;
&lt;li&gt;☑ Enable secret scanning (GitHub Advanced Security, if available).&lt;/li&gt;
&lt;li&gt;☑ Enable push protection (blocks commits with exposed secrets).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set up Dependabot to auto-update your &lt;code&gt;dependabot.yml&lt;/code&gt; file for regular dependency checks.&lt;/li&gt;
&lt;li&gt;If secret scanning catches something, act fast—rotate any exposed keys and check commit history for leaks.&lt;/li&gt;
&lt;li&gt;Consider enabling Dependabot version updates (not just security) to keep your dependencies fresh.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;f-merge-button-behavior&quot;&gt;F. Merge Button Behavior&lt;/h3&gt;
&lt;p&gt;Go to: &lt;code&gt;Settings → General → Pull Requests&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☑ Allow merge commits / Squash merging / Rebase merging (choose as needed).&lt;/li&gt;
&lt;li&gt;☑ Always suggest updating pull request branches.&lt;/li&gt;
&lt;li&gt;☑ Allow auto-merge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Squash merging is great for keeping a clean history, but merge commits can help track context for bigger changes.&lt;/li&gt;
&lt;li&gt;Auto-merge is a lifesaver for busy repos—just make sure your status checks are robust to avoid bad merges.&lt;/li&gt;
&lt;li&gt;Encourage contributors to update their PR branches to reduce merge conflicts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;g-issue-amp-discussion-settings&quot;&gt;G. Issue &amp;amp; Discussion Settings&lt;/h3&gt;
&lt;p&gt;Go to: &lt;code&gt;Settings → Features&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;☑ Enable Issues (if needed).&lt;/li&gt;
&lt;li&gt;☑ Enable Discussions (optional).&lt;/li&gt;
&lt;li&gt;☑ Enable Projects (optional).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use issue templates (via &lt;code&gt;.github/ISSUE_TEMPLATE&lt;/code&gt;) to guide contributors on reporting bugs or features.&lt;/li&gt;
&lt;li&gt;Discussions are great for open-ended ideas—pin active threads to keep the community engaged.&lt;/li&gt;
&lt;li&gt;Projects can help you visualize workflows, but keep them simple to avoid overwhelming new contributors.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;wrapping-up&quot;&gt;Wrapping Up&lt;/h3&gt;
&lt;p&gt;That’s the rundown! These settings and tips should help you secure your GitHub repo while making it a welcoming spot for collaboration. I’m no expert, but this setup has saved me headaches on my own projects. Got questions about any of these settings or a GitHub hack you want to share? Drop them in the comments below—I’d love to hear your thoughts and help with any setup snags!&lt;/p&gt;
</description>
<category>Git &amp; Version Control</category>
<guid isPermaLink="true">https://coderlegion.com/4758/github-repo-security-your-easy-go-to-checklist</guid>
<pubDate>Sat, 16 Aug 2025 19:41:28 +0000</pubDate>
</item>
<item>
<title>Versioning Your API the Right Way (REST Best Practices)</title>
<link>https://coderlegion.com/4597/versioning-your-api-the-right-way-rest-best-practices</link>
<description>&lt;p&gt;When you build and maintain a REST API, change is inevitable. New features, improvements, and fixes are part of growth — but making changes without breaking existing integrations that is where the real challenge lies.&lt;br&gt;
That’s where &lt;strong&gt;API versioning&lt;/strong&gt; comes in.&lt;/p&gt;
&lt;p&gt;Versioning is simply the practice of &lt;strong&gt;managing changes to your API without breaking existing clients&lt;/strong&gt;. It ensures that developers using your API can keep working without disruption, while giving you the flexibility to introduce updates at your own pace.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;why-version-your-api-&quot;&gt;&lt;strong&gt;Why Version Your API?&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backward compatibility&lt;/strong&gt; – Prevent breaking changes for existing consumers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controlled rollout&lt;/strong&gt; – Introduce new features gradually.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear change tracking&lt;/strong&gt; – Developers can easily know what’s changed between versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easier deprecation&lt;/strong&gt; – Old versions can be sunset without surprise.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;common-api-versioning-strategies&quot;&gt;&lt;strong&gt;Common API Versioning Strategies&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;There are several ways to version an API. Each has its strengths and trade-offs.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;1-uri-path-versioning-most-common-&quot;&gt;&lt;strong&gt;1. URI Path Versioning&lt;/strong&gt; (Most Common)&lt;/h4&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /api/v1/users
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Very clear and easy to understand.&lt;/li&gt;
&lt;li&gt;Works well with caching and routing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can lead to duplication of routes across versions.&lt;/li&gt;
&lt;li&gt;URL changes when upgrading versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best practice&lt;/strong&gt;: Use for major, breaking changes. Avoid unnecessary version bumps for small non-breaking updates.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;2-query-parameter-versioning&quot;&gt;&lt;strong&gt;2. Query Parameter Versioning&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /api/users?version=1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easy to implement.&lt;/li&gt;
&lt;li&gt;URL doesn’t drastically change.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Less ideal for caching in some setups.&lt;/li&gt;
&lt;li&gt;Not as visible/explicit as URI versioning.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;3-header-versioning-a-k-a-content-negotiation-&quot;&gt;&lt;strong&gt;3. Header Versioning&lt;/strong&gt; (a.k.a. Content Negotiation)&lt;/h4&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /api/users
Accept: application/vnd.myapi.v1+json
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean URLs (no version in path).&lt;/li&gt;
&lt;li&gt;Supports multiple representations for the same resource.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Harder for humans to discover versioning.&lt;/li&gt;
&lt;li&gt;Requires clients to manage headers explicitly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;4-media-type-versioning&quot;&gt;&lt;strong&gt;4. Media Type Versioning&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Similar to header versioning, but versions are embedded in the media type format, e.g.:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;application/vnd.github.v3+json
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;choosing-the-right-approach&quot;&gt;&lt;strong&gt;Choosing the Right Approach&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public APIs&lt;/strong&gt;: URI path versioning is usually best — it’s explicit and developer-friendly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internal APIs&lt;/strong&gt;: Header versioning or media type versioning works well when you want clean URLs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frequent Small Changes&lt;/strong&gt;: Use semantic versioning within responses and documentation instead of changing the version in the URL for every update.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;best-practices-for-api-versioning&quot;&gt;&lt;strong&gt;Best Practices for API Versioning&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Follow Semantic Versioning Principles&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;MAJOR.MINOR.PATCH&lt;/strong&gt; format internally.&lt;br&gt;
Example: v2.1.4 means major version 2, minor update 1, patch 4.&lt;/li&gt;
&lt;li&gt;Only increment MAJOR when introducing breaking changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document Every Version&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintain changelogs so developers know what’s different.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Communicate Deprecations Early&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Announce when an old version will be retired.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avoid Version Explosion&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don’t create new versions for minor changes — use backward-compatible updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test for Backward Compatibility&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automated regression tests help avoid breaking old clients accidentally.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;example-a-sensible-versioning-workflow&quot;&gt;&lt;strong&gt;Example: A Sensible Versioning Workflow&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Start with &lt;code&gt;v1&lt;/code&gt; in the URI.&lt;/li&gt;
&lt;li&gt;Add new, &lt;strong&gt;non-breaking&lt;/strong&gt; endpoints or fields without changing the version.&lt;/li&gt;
&lt;li&gt;When you introduce a &lt;strong&gt;breaking change&lt;/strong&gt; (e.g., removing a field, changing response format), release &lt;code&gt;v2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;v1&lt;/code&gt; live for a deprecation period while encouraging migration.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;conclusion-1&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;API versioning isn’t just about sticking a “v1” in your URL — it’s about &lt;strong&gt;responsible change management&lt;/strong&gt;.&lt;br&gt;
When done right, it protects both your developers and your users, allowing innovation without chaos.&lt;/p&gt;
&lt;p&gt;Whether you choose &lt;strong&gt;path, query, or header versioning&lt;/strong&gt;, the key is &lt;strong&gt;consistency, documentation, and communication&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;div-blue&quot;&gt;
&lt;span class=&quot;alert-header&quot;&gt;PS:&lt;/span&gt;
&lt;span class=&quot;alert-body&quot;&gt;That’s how you version your REST API the right way.&lt;/span&gt;
&lt;/div&gt;
</description>
<category>Performance</category>
<guid isPermaLink="true">https://coderlegion.com/4597/versioning-your-api-the-right-way-rest-best-practices</guid>
<pubDate>Mon, 11 Aug 2025 19:28:36 +0000</pubDate>
</item>
<item>
<title>Fixing mistakes with Git</title>
<link>https://coderlegion.com/4593/fixing-mistakes-with-git</link>
<description>&lt;blockquote&gt;&lt;p&gt;Bob is my uncle… &lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;He dropped his ice cream. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;He didn’t know how to git.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;Now he has no ice cream.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;DONT BE LIKE BOB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lucky for you I am here to share some ways to fix your mistakes on your project. This is assuming you already know git, if not read these articles:&lt;/p&gt;
&lt;p&gt;If you are new to git, maybe start with these first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/3484/understanding-the-basics-of-git&quot;&gt;Understanding the basics of GIT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/3525/rewinding-time-in-git-exploring-commits-branching&quot;&gt;Rewinding Time in Git: Exploring Commits &amp;amp; Branching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you prefer video: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/watch?v=RGOj5yH7evk&quot;&gt;Git and GitHub for Beginners — Crash Course — YouTube&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;how-git-can-fix-my-project-&quot;&gt;How git can fix my project?&lt;/h3&gt;
&lt;p&gt;Well, git has a full history(from the day of git init to today) of your project development. All you have to do is view the history and select the day you wanna go back and boom. This all will workout assuming you’ve named your commits properly.&lt;/p&gt;
&lt;p&gt;You can not fix the mistakes once you pushed the changes to remote, theoretically of course. I mean you could, but it will mess up everyone else working on the branch so it is not advised not to fix something that is already on the remote unless all the contributors agree to it.&lt;/p&gt;
&lt;h4 id=&quot;reset&quot;&gt;reset&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;git reset&lt;/code&gt; undo’s changes by removing the commits from the branch.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git reset --soft
git reset --mixed
git reset --hard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each command above moves your current version of your project to the last recent version. You can go back to a specific commit by appending HEAD~n where n is the number of commits to go back.&lt;/p&gt;
&lt;p&gt;i.e., &lt;code&gt;git reset --soft HEAD~3&lt;/code&gt; to go back in 3 commits.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--soft&lt;/code&gt; flag only moves the HEAD pointer to the commit but doesn’t affect the working directory and staged changes, meaning if you have created some files but that doesn’t exist on the older commit now it will be there because it still exists in the staging area and the working directory.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--mixed&lt;/code&gt; flag is the default and this moves the HEAD but it resets the staging area but not the working directory. So, if you have issued agit add . before reset it will be removed from the staging area but it will still be in the working directory.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--hard&lt;/code&gt; flag will do a factory reset to the specific commit. Anything and everything and between is vaporized.&lt;br&gt;
Please do not do this in a public branch(a branch that is already pushed to remote) instead use the safer version revert.&lt;/p&gt;
&lt;p&gt;You can also use &lt;code&gt;git reset &amp;lt;filename&amp;gt;&lt;/code&gt; or &lt;code&gt;git reset &amp;lt;commit-hash&amp;gt; &amp;lt;filename&amp;gt;&lt;/code&gt; to unstage a file without removing it from the filesystem.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:1100/format:webp/1*go-1D2jYwa6zIFK8BVPYTg.gif&quot; alt=&quot;git reset by Visualizing Git (git-school.github.io)&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;revert&quot;&gt;revert&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;git revert&lt;/code&gt; is a safer version of undoing a commit. Revert works by finding a way to create a new commit without the changes introduced by the specified commit and appends it to the current tree. &lt;/p&gt;
&lt;p&gt;Meaning it will not delete any commits instead it will create an inverse version of the specified commit.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git revert HEAD
git revert &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unlike reset, revert requires a commit hash to act.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:1100/format:webp/1*zX7tg4ye5euuytZ4dsLm7w.gif&quot; alt=&quot;git revert by Visualizing Git (git-school.github.io)&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can see in the above image that unlike reset it doesn’t just remove the previous commits instead creates a new commit and preserves the commits and doesn’t create problems with other branch contributors.&lt;/p&gt;
&lt;p&gt;If revert and reset do the same which should I use?&lt;/p&gt;
&lt;h5 id=&quot;reset-&quot;&gt;&lt;em&gt;Reset:&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;Don’t use it in a public branch.&lt;br&gt;
Will remove all the commits after the specified commit (i.e., resetting to two days old commit will remove all the commits made in the last two days).&lt;br&gt;
Use it if you are the only one using the branch or if the commits haven’t reached the remote repo.&lt;/p&gt;
&lt;h5 id=&quot;revert-&quot;&gt;&lt;em&gt;Revert:&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;Use it anywhere. Afterall it just gonna look like a new commit…&lt;br&gt;
Edit commit messages&lt;br&gt;
Sometimes you make a silly spelling mistake in your most recent commit message and if you want to edit you can re-commit with the &lt;code&gt;--amend&lt;/code&gt; flag. You can also add new files and use amend to update the most recent commit snapshot.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git commit --amend -m &quot;new message that doesn't trigger your OCD&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Again, do not amend a commit that is pushed to a remote.&lt;/p&gt;
&lt;p&gt;But the &lt;code&gt;--amend&lt;/code&gt; the flag will only work for the most recent commit, what if you want to edit a commit message that is older than the most recent commit?&lt;/p&gt;
&lt;p&gt;You can use rebase to change older commit messages. Rebase is also used to integrate changes from other branches just like git merge but rebase gives you finer control on how the history of the base branch should look after integrating.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git rebase -i HEAD~n&lt;/code&gt; n is the number of commits to go back.&lt;/p&gt;
&lt;p&gt;This will open your default editor and show n number of commits with the work “pick” before it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:1100/format:webp/1*PyG_V89w1QZsHoSOTu6-Rg.png&quot; alt=&quot;git rebase -i HEAD~5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now change the word “pick” to “reword” from the commits that you want to change the message. &lt;strong&gt;DO NOT CHANGE THE COMMIT MESSAGE HERE YET…&lt;/strong&gt; Just change the word “pick” -&amp;gt; “reword”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:1100/format:webp/1*VvIcYyEt6Jmj3KNdMmoQOw.png&quot; alt=&quot;Like this&quot;&gt;&lt;/p&gt;
&lt;p&gt;Save the file and close the editor.&lt;/p&gt;
&lt;p&gt;Now you will get a new editor with the commit message. Change it to your new commit message and save it, then close the editor. If you have are trying to reword multiple commits, then you will get each editor windows one by one. That’s it. R&lt;strong&gt;emember, rebase will rewrite the history not just update the message so avoid it in remote branches.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;move-a-commit-to-a-new-branch&quot;&gt;Move a commit to a new branch&lt;/h3&gt;
&lt;p&gt;Sometimes you wanna work on a specific commit but you don’t want to mess with the main/master branch by performing a reset. For this, you can create a branch that contains that specific commit and work there and merge it later.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git branch -b fix
git checkout fix
git reset --hard &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or you can do it in one line: &lt;code&gt;git checkout -b fix &amp;lt;commit-hash&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;cherry-pick&quot;&gt;cherry-pick&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;git cherry-pick&lt;/code&gt; is used to pick a specific commit from a branch and place it in the current branch.&lt;/p&gt;
&lt;h4 id=&quot;why-in-the-world-would-i-do-that-&quot;&gt;Why in the world would I do that?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;You created a commit in the wrong branch. Oops.&lt;/li&gt;
&lt;li&gt;You want to include a commit from your branch “fix_contrast” to your main/master branch but you don’t want to merge the whole branch just yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Checkout to your base branch where you want the picked commit to be and then issue the command.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git cherry-pick &amp;lt;commit-hash-from-other-branch&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Vr8u9FxwYMZ0-6xCHe3-VQ.gif&quot; alt=&quot;git cherry-pick by Visualizing Git (git-school.github.io)&quot;&gt;&lt;/p&gt;
&lt;p&gt;This will copy that commit from the target branch to your current/base branch. This will not delete the commit on the target branch, it just makes a copy. This will have the same commit message as the target branch commit message, if you want to edit it you can use -edit the flag to rename it before cherry-picking finishes. Or if you don’t want to commit the target branch commit, use &lt;code&gt;--no-commit&lt;/code&gt; the flag to copy only the changes to the working directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Even though the reset did remove the commits it looked like it left a phantom of the commits behind…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:1100/format:webp/1*5xBw1OjqBAfdiHNJDrSXqQ.png&quot; alt=&quot;spooky ghost boi…&quot;&gt;&lt;/p&gt;
&lt;p&gt;If the commits are removed then it shouldn’t have its hash right? YES and NO.&lt;/p&gt;
&lt;p&gt;Although you reset your branch history every time you make critical actions like reset or merge git stores these actions in a special record called reference logs (aka &lt;code&gt;reflog&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;So, if for some reason you think you made a mistake by hard resetting a branch and if you want the commits back, you can get it back.&lt;/p&gt;
&lt;p&gt;Issue the command git reflog and it will return the log of all critical mistakes you’ve done so far.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Gy4pt-12TZQ58jGVYJR1dQ.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can again use the git resetto get back to the previous stage but this time the syntax is a little different, &lt;code&gt;git reset HEAD@{n}&lt;/code&gt; where n is the number shown in &lt;code&gt;reflog&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And that’s it. You can fix mistakes and fix the fixed mistakes that turned out to be a mistake by themselves. Also, remember to avoid any of these operations on a public branch with multiple collaborators working on it.&lt;/p&gt;
&lt;p&gt;There are some other ways too but I only used the above commands for the most part and I hope this article should give you an intro to cleaning up yours's and your colleges’ mess.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExZHF1bm41czk3YWl6MHhxMG9xanZqamgxMmE4am1yaDN1ZGNteWNjaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/YfOP4V0GugHohdb4US/giphy.gif&quot; alt=&quot;That’s it baby (giphy.com)&quot;&gt;&lt;/p&gt;
</description>
<category>Command Line Tools</category>
<guid isPermaLink="true">https://coderlegion.com/4593/fixing-mistakes-with-git</guid>
<pubDate>Mon, 11 Aug 2025 19:10:50 +0000</pubDate>
</item>
<item>
<title>Git default options</title>
<link>https://coderlegion.com/4359/git-default-options</link>
<description>&lt;p&gt;Git has become a fundamental part of our developers' daily routine that it's hard to remember our lives without it. And yet, most of us use a limited set of commands &lt;strong&gt;and&lt;/strong&gt; options. Today, I want to focus on two commands most developers probably use &lt;strong&gt;every&lt;/strong&gt; day and look at the defaults behind them.&lt;/p&gt;
&lt;h3 id=&quot;git-push&quot;&gt;git push&lt;/h3&gt;
&lt;p&gt;After &lt;code&gt;git commit&lt;/code&gt;, &lt;code&gt;git push&lt;/code&gt; is probably the second most used command. I don't think I'll teach you anything with this excerpt from the documentation:&lt;/p&gt;
&lt;p&gt;&amp;gt;git-push - Update remote refs along with associated objects&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;gt;-- &lt;a rel=&quot;nofollow&quot; href=&quot;https://git-scm.com/docs/git-push&quot;&gt;Git documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The default options pushes the &lt;em&gt;current branch&lt;/em&gt; to the &lt;code&gt;origin&lt;/code&gt; remote; it assumes a branch of the same name as the local branch exists on the latter. If it doesn't exist, you need to use &lt;code&gt;-u&lt;/code&gt; option to create it.&lt;/p&gt;
&lt;p&gt;Also, the default assumes a &lt;em&gt;single&lt;/em&gt; upstream named &lt;code&gt;origin&lt;/code&gt;. If you want to push the current branch to another upstream, you need to specify it explicitly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push other_upstream
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Likewise, the default assumes pushing to a remote branch with the same name. To push to another branch, we also must specify it along with the upstream.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout my_branch
git push other_upstream master
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;git-rebase&quot;&gt;git rebase&lt;/h3&gt;
&lt;p&gt;The default &lt;code&gt;git push&lt;/code&gt; options are straightforward. The default ones for &lt;code&gt;git rebase&lt;/code&gt; aren't the reason why we probably use one of them all the time.&lt;/p&gt;
&lt;p&gt;&amp;gt;git-rebase - Reapply commits on top of another base tip&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;gt;-- &lt;a rel=&quot;nofollow&quot; href=&quot;https://git-scm.com/docs/git-rebase&quot;&gt;Git documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let's try the &lt;code&gt;git rebase&lt;/code&gt; command on a simple tree:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;A   B   C   D
o---o---o---o master
     \
      E   F   G
      o---o---o branch1 [HEAD]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nothing happens. Or more precisely, &quot;it depends&quot;&amp;#8482;. If we didn't set an &lt;code&gt;origin&lt;/code&gt; remote, &lt;code&gt;git&lt;/code&gt; complains.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;There is no tracking information for the current branch.
Please specify which branch you want to rebase against.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Imagine the following remote repo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;A   B   C   D
o---o---o---o master
     \
      E   F   G   H
      o---o---o---o branch1 [HEAD]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let's configure the remote and bind the local branch to the remote branch.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git fetch
git branch --set-upstream-to=origin/branch1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If we call &lt;code&gt;rebase&lt;/code&gt; again, git tries to apply every commit from the &lt;strong&gt;remote&lt;/strong&gt; branch, starting from the root one. Since &lt;code&gt;H&lt;/code&gt; doesn't exist on the local branch, it just adds it to the tip of it.&lt;/p&gt;
&lt;p&gt;Let's try with &lt;code&gt;master&lt;/code&gt; and test again:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git rebase -i master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-i&lt;/code&gt; allows rebasing interactively.&lt;br&gt;
Here's the proposal.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pick 5529dc4 E
pick 93af602 F
pick 7f79811 G
pick c6f853b H
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As per the documentation, the command switched branch, got the commits from &lt;code&gt;master&lt;/code&gt;, and now applies the commits in the current branch.&lt;/p&gt;
&lt;p&gt;The result is the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;A   B   C   D
o---o---o---o master
             \
              E   F   G   H
              o---o---o---o branch1 [HEAD]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Git is a huge beast. Most developers, including me, only use a fraction of its features. In this post, we described the default of two of the most common Git commands. I hope it sheds some light on them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To go further:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://git-scm.com/docs/git-push/&quot;&gt;git-push&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://git-scm.com/docs/git-rebase&quot;&gt;git-rebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.frankel.ch/multiple-usages-git-rebase-onto/&quot;&gt;The multiple usages of git rebase --onto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://stackoverflow.com/questions/50643026/why-does-git-rebase-with-no-arguments-work-the-way-that-it-does&quot;&gt;Why does git rebase with no arguments work the way that it does?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://superuser.com/questions/788912/what-does-command-git-rebase-mean-when-no-arguments-followed&quot;&gt;What does command 'git rebase' mean when no arguments followed?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.frankel.ch/git-default-options/&quot;&gt;A Java Geek&lt;/a&gt; on July 27&lt;sup&gt;th&lt;/sup&gt;, 2025&lt;/em&gt;&lt;/p&gt;
</description>
<category>Full-stack Dev</category>
<guid isPermaLink="true">https://coderlegion.com/4359/git-default-options</guid>
<pubDate>Thu, 31 Jul 2025 07:54:19 +0000</pubDate>
</item>
<item>
<title>Git &amp; GitHub: Your First Steps to Version Control</title>
<link>https://coderlegion.com/3950/git-github-your-first-steps-to-version-control</link>
<description>&lt;h3 id=&quot;follow-me-for-more-content-&quot;&gt;Follow Me for More Content!&lt;/h3&gt;
&lt;p&gt;Before we dive into Git and GitHub, let's connect! I regularly share programming tutorials, tips, and insights:&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://abdelhakim-baalla.vercel.app/&quot;&gt;abdelhakim-baalla.vercel.app&lt;/a&gt;&lt;br&gt;
 &lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/abdelhakimbaalla/&quot;&gt;abdelhakimbaalla&lt;/a&gt;&lt;br&gt;
️ &lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.instagram.com/abdelhakim.baalla/&quot;&gt;abdelhakim.baalla&lt;/a&gt;&lt;br&gt;
 &lt;strong&gt;Dev.to:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/abdelhakim_baalla&quot;&gt;abdelhakim_baalla&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;introduction-2&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Have you ever worked on a project and wished you could go back to a previous version? Or maybe you're collaborating with friends on a coding project and keeping track of changes is becoming a nightmare? &lt;/p&gt;
&lt;p&gt;Welcome to the world of &lt;strong&gt;version control&lt;/strong&gt;! Today, we're going to explore Git and GitHub – two powerful tools that will revolutionize how you manage your code and collaborate with others.&lt;/p&gt;
&lt;p&gt;Don't worry if you've never used a command line before or if terms like &quot;repository&quot; sound foreign. By the end of this guide, you'll understand what Git and GitHub are, why they're essential for developers, and how to use them step by step.&lt;/p&gt;
&lt;h3 id=&quot;what-is-version-control--1&quot;&gt;What is Version Control?&lt;/h3&gt;
&lt;p&gt;Imagine you're writing a book. You start with Chapter 1, then add Chapter 2, make some edits to Chapter 1, add Chapter 3, and so on. Now imagine you want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;See what your book looked like last week&lt;/li&gt;
&lt;li&gt;Compare two different versions of Chapter 2&lt;/li&gt;
&lt;li&gt;Work with a co-author without overwriting each other's changes&lt;/li&gt;
&lt;li&gt;Keep a backup of your work that's accessible from anywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is exactly what version control does for your code! It's like having a time machine and collaboration tool rolled into one.&lt;/p&gt;
&lt;h3 id=&quot;what-is-git-&quot;&gt;What is Git?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; is a distributed version control system created by Linus Torvalds (the same person who created Linux) in 2005. Think of Git as a super-smart filing system that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tracks every change you make to your files&lt;/li&gt;
&lt;li&gt;Lets you create different versions (called &quot;branches&quot;) of your project&lt;/li&gt;
&lt;li&gt;Helps you merge changes from different contributors&lt;/li&gt;
&lt;li&gt;Keeps a complete history of your project&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;key-git-concepts&quot;&gt;Key Git Concepts&lt;/h4&gt;
&lt;p&gt;Let's break down the essential Git terminology:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Repository (Repo):&lt;/strong&gt; A folder that contains your project files and all the version history. It's like a project folder with superpowers!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Commit:&lt;/strong&gt; A snapshot of your project at a specific point in time. Each commit has a unique ID and a message describing what changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Branch:&lt;/strong&gt; A separate line of development. The main branch is usually called &quot;main&quot; or &quot;master.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clone:&lt;/strong&gt; Making a copy of a repository on your computer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Push:&lt;/strong&gt; Uploading your local changes to a remote repository.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pull:&lt;/strong&gt; Downloading changes from a remote repository to your local computer.&lt;/p&gt;
&lt;h3 id=&quot;what-is-github-&quot;&gt;What is GitHub?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; is a web-based platform that hosts Git repositories in the cloud. While Git is the tool that tracks changes, GitHub is the online service where you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Store your repositories online&lt;/li&gt;
&lt;li&gt;Share your code with others&lt;/li&gt;
&lt;li&gt;Collaborate on projects&lt;/li&gt;
&lt;li&gt;Showcase your work to potential employers&lt;/li&gt;
&lt;li&gt;Contribute to open-source projects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of GitHub as Google Drive for programmers, but with powerful collaboration features built specifically for code.&lt;/p&gt;
&lt;h3 id=&quot;getting-started-installation-and-setup&quot;&gt;Getting Started: Installation and Setup&lt;/h3&gt;
&lt;h4 id=&quot;step-1-install-git&quot;&gt;Step 1: Install Git&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;For Windows:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a rel=&quot;nofollow&quot; href=&quot;https://git-scm.com/&quot;&gt;git-scm.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download the installer&lt;/li&gt;
&lt;li&gt;Run the installer with default settings&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;For Mac:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Terminal&lt;/li&gt;
&lt;li&gt;Type: &lt;code&gt;git --version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If Git isn't installed, it will prompt you to install it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;For Linux:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get update
sudo apt-get install git
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-2-configure-git&quot;&gt;Step 2: Configure Git&lt;/h4&gt;
&lt;p&gt;After installation, you need to tell Git who you are:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global user.name &quot;Your Name&quot;
git config --global user.email &quot;*Emails are not allowed*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-3-create-a-github-account&quot;&gt;Step 3: Create a GitHub Account&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com&quot;&gt;github.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Click &quot;Sign up&quot;&lt;/li&gt;
&lt;li&gt;Choose a username (this will be part of your GitHub profile URL)&lt;/li&gt;
&lt;li&gt;Enter your email and create a password&lt;/li&gt;
&lt;li&gt;Verify your account&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;your-first-git-repository&quot;&gt;Your First Git Repository&lt;/h3&gt;
&lt;p&gt;Let's create your first project and track it with Git!&lt;/p&gt;
&lt;h4 id=&quot;step-1-create-a-project-folder&quot;&gt;Step 1: Create a Project Folder&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir my-first-repo
cd my-first-repo
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-2-initialize-git&quot;&gt;Step 2: Initialize Git&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates a hidden &lt;code&gt;.git&lt;/code&gt; folder that will track all your changes.&lt;/p&gt;
&lt;h4 id=&quot;step-3-create-your-first-file&quot;&gt;Step 3: Create Your First File&lt;/h4&gt;
&lt;p&gt;Create a simple file called &lt;code&gt;README.md&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# My First Project

Hello, Git and GitHub!

This is my first repository.
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-4-check-status&quot;&gt;Step 4: Check Status&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You'll see that Git has detected your new file but isn't tracking it yet.&lt;/p&gt;
&lt;h4 id=&quot;step-5-add-files-to-staging&quot;&gt;Step 5: Add Files to Staging&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add README.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or to add all files:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-6-make-your-first-commit&quot;&gt;Step 6: Make Your First Commit&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git commit -m &quot;Add README file&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Congratulations! You've made your first commit.&lt;/p&gt;
&lt;h3 id=&quot;connecting-to-github-1&quot;&gt;Connecting to GitHub&lt;/h3&gt;
&lt;p&gt;Now let's put your repository on GitHub so others can see it and you can access it from anywhere.&lt;/p&gt;
&lt;h4 id=&quot;step-1-create-a-github-repository&quot;&gt;Step 1: Create a GitHub Repository&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Go to GitHub and click the &quot;+&quot; icon in the top right&lt;/li&gt;
&lt;li&gt;Select &quot;New repository&quot;&lt;/li&gt;
&lt;li&gt;Name it &quot;my-first-repo&quot;&lt;/li&gt;
&lt;li&gt;Keep it public&lt;/li&gt;
&lt;li&gt;Don't initialize with README (we already have one)&lt;/li&gt;
&lt;li&gt;Click &quot;Create repository&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;step-2-connect-your-local-repository&quot;&gt;Step 2: Connect Your Local Repository&lt;/h4&gt;
&lt;p&gt;GitHub will show you commands to run. They'll look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add origin https://github.com/yourusername/my-first-repo.git
git branch -M main
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-3-verify-the-upload&quot;&gt;Step 3: Verify the Upload&lt;/h4&gt;
&lt;p&gt;Refresh your GitHub page, and you should see your README file!&lt;/p&gt;
&lt;h3 id=&quot;essential-git-commands&quot;&gt;Essential Git Commands&lt;/h3&gt;
&lt;p&gt;Here are the commands you'll use most often:&lt;/p&gt;
&lt;h4 id=&quot;checking-status-and-history&quot;&gt;Checking Status and History&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git status          # See current status of files
git log             # View commit history
git log --oneline   # Compact view of commits
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;making-changes&quot;&gt;Making Changes&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add filename    # Stage a specific file
git add .           # Stage all changes
git commit -m &quot;message&quot;  # Commit with message
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;working-with-remote-repositories&quot;&gt;Working with Remote Repositories&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push            # Upload changes to GitHub
git pull            # Download changes from GitHub
git clone &amp;lt;url&amp;gt;     # Copy a repository to your computer
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;branching&quot;&gt;Branching&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git branch                    # List all branches
git branch feature-name       # Create new branch
git checkout feature-name     # Switch to branch
git checkout -b feature-name  # Create and switch to branch
git merge feature-name        # Merge branch into current branch
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;working-with-branches&quot;&gt;Working with Branches&lt;/h3&gt;
&lt;p&gt;Branches let you work on different features without affecting your main code.&lt;/p&gt;
&lt;h4 id=&quot;creating-a-new-feature&quot;&gt;Creating a New Feature&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout -b new-feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make your changes, then:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &quot;Add new feature&quot;
git push origin new-feature
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;merging-changes&quot;&gt;Merging Changes&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout main
git merge new-feature
git push origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;collaboration-workflow&quot;&gt;Collaboration Workflow&lt;/h3&gt;
&lt;p&gt;Here's how teams typically work with Git and GitHub:&lt;/p&gt;
&lt;h4 id=&quot;the-fork-and-pull-request-workflow&quot;&gt;The Fork and Pull Request Workflow&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fork&lt;/strong&gt; the repository on GitHub&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clone&lt;/strong&gt; your fork to your computer&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;branch&lt;/strong&gt; for your changes&lt;/li&gt;
&lt;li&gt;Make your changes and &lt;strong&gt;commit&lt;/strong&gt; them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Push&lt;/strong&gt; your branch to your fork&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Pull Request&lt;/strong&gt; on GitHub&lt;/li&gt;
&lt;li&gt;The maintainer reviews and &lt;strong&gt;merges&lt;/strong&gt; your changes&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;basic-collaboration-commands&quot;&gt;Basic Collaboration Commands&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Start working on someone else's project
git clone https://github.com/username/project.git
cd project

# Before starting work, get latest changes
git pull origin main

# Create your feature branch
git checkout -b my-contribution

# Make changes, add, and commit
git add .
git commit -m &quot;Add my contribution&quot;

# Push your branch
git push origin my-contribution
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;best-practices-for-beginners&quot;&gt;Best Practices for Beginners&lt;/h3&gt;
&lt;h4 id=&quot;commit-messages&quot;&gt;Commit Messages&lt;/h4&gt;
&lt;p&gt;Write clear, descriptive commit messages:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Good
git commit -m &quot;Fix login button styling&quot;
git commit -m &quot;Add user authentication feature&quot;

# Bad
git commit -m &quot;fix&quot;
git commit -m &quot;changes&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;commit-frequently&quot;&gt;Commit Frequently&lt;/h4&gt;
&lt;p&gt;Make small, frequent commits rather than large ones:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Do this
git commit -m &quot;Add header component&quot;
git commit -m &quot;Style header with CSS&quot;
git commit -m &quot;Make header responsive&quot;

# Not this
git commit -m &quot;Complete entire website&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;use-gitignore&quot;&gt;Use .gitignore&lt;/h4&gt;
&lt;p&gt;Create a &lt;code&gt;.gitignore&lt;/code&gt; file to exclude files you don't want to track:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# .gitignore
node_modules/
*.log
.env
.DS_Store
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;common-mistakes-and-how-to-fix-them&quot;&gt;Common Mistakes and How to Fix Them&lt;/h3&gt;
&lt;h4 id=&quot;mistake-1-committing-too-much&quot;&gt;Mistake 1: Committing Too Much&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# If you accidentally added files
git reset HEAD filename

# If you committed but haven't pushed
git reset --soft HEAD~1
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;mistake-2-wrong-commit-message&quot;&gt;Mistake 2: Wrong Commit Message&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Change the last commit message
git commit --amend -m &quot;New message&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;mistake-3-working-on-wrong-branch&quot;&gt;Mistake 3: Working on Wrong Branch&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Save your work temporarily
git stash

# Switch to correct branch
git checkout correct-branch

# Apply your work
git stash pop
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;practical-example-building-a-simple-website&quot;&gt;Practical Example: Building a Simple Website&lt;/h3&gt;
&lt;p&gt;Let's walk through a real example of using Git and GitHub to build a simple website.&lt;/p&gt;
&lt;h4 id=&quot;step-1-set-up-the-project&quot;&gt;Step 1: Set Up the Project&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir my-website
cd my-website
git init
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-2-create-basic-files&quot;&gt;Step 2: Create Basic Files&lt;/h4&gt;
&lt;p&gt;Create &lt;code&gt;index.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;My Website&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Welcome to My Website&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;This is my first website tracked with Git!&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create &lt;code&gt;style.css&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 20px;
    background-color: #f4f4f4;
}

h1 {
    color: #333;
    text-align: center;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-3-track-your-progress&quot;&gt;Step 3: Track Your Progress&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &quot;Initial website structure&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-4-add-a-feature&quot;&gt;Step 4: Add a Feature&lt;/h4&gt;
&lt;p&gt;Create a new branch for navigation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout -b add-navigation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Update &lt;code&gt;index.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;My Website&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;nav&amp;gt;
        &amp;lt;ul&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#home&quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#about&quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;a href=&quot;#contact&quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/nav&amp;gt;
    &amp;lt;h1&amp;gt;Welcome to My Website&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;This is my first website tracked with Git!&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-5-commit-and-merge&quot;&gt;Step 5: Commit and Merge&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &quot;Add navigation menu&quot;
git checkout main
git merge add-navigation
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;step-6-push-to-github&quot;&gt;Step 6: Push to GitHub&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add origin https://github.com/yourusername/my-website.git
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;advanced-tips-for-beginners&quot;&gt;Advanced Tips for Beginners&lt;/h3&gt;
&lt;h4 id=&quot;viewing-changes&quot;&gt;Viewing Changes&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git diff                    # See unstaged changes
git diff --staged          # See staged changes
git show                   # See last commit details
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;undoing-changes&quot;&gt;Undoing Changes&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout -- filename   # Discard changes to a file
git reset HEAD filename    # Unstage a file
git revert &amp;lt;commit-hash&amp;gt;   # Undo a specific commit
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;working-with-remote-repositories-1&quot;&gt;Working with Remote Repositories&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote -v              # List remote repositories
git remote add upstream &amp;lt;url&amp;gt;  # Add another remote
git fetch origin           # Download changes without merging
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;github-features-for-beginners&quot;&gt;GitHub Features for Beginners&lt;/h3&gt;
&lt;h4 id=&quot;issues&quot;&gt;Issues&lt;/h4&gt;
&lt;p&gt;Use GitHub Issues to track bugs and feature requests:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your repository&lt;/li&gt;
&lt;li&gt;Click &quot;Issues&quot; tab&lt;/li&gt;
&lt;li&gt;Click &quot;New issue&quot;&lt;/li&gt;
&lt;li&gt;Describe the problem or feature&lt;/li&gt;
&lt;li&gt;Add labels and assign to team members&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;pull-requests&quot;&gt;Pull Requests&lt;/h4&gt;
&lt;p&gt;Pull Requests let you propose changes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Push your branch to GitHub&lt;/li&gt;
&lt;li&gt;Click &quot;Compare &amp;amp; pull request&quot;&lt;/li&gt;
&lt;li&gt;Add a description of your changes&lt;/li&gt;
&lt;li&gt;Request reviews from team members&lt;/li&gt;
&lt;li&gt;Merge when approved&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;github-pages&quot;&gt;GitHub Pages&lt;/h4&gt;
&lt;p&gt;Host your website for free:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your repository settings&lt;/li&gt;
&lt;li&gt;Scroll to &quot;Pages&quot;&lt;/li&gt;
&lt;li&gt;Select source branch (usually main)&lt;/li&gt;
&lt;li&gt;Your site will be available at &lt;code&gt;username.github.io/repository-name&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;troubleshooting-common-issues&quot;&gt;Troubleshooting Common Issues&lt;/h3&gt;
&lt;h4 id=&quot;problem-permission-denied-&quot;&gt;Problem: &quot;Permission denied&quot;&lt;/h4&gt;
&lt;p&gt;This usually means you need to set up SSH keys or use HTTPS authentication.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote set-url origin https://github.com/username/repository.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;problem-merge-conflict-&quot;&gt;Problem: &quot;Merge conflict&quot;&lt;/h4&gt;
&lt;p&gt;This happens when Git can't automatically merge changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the conflicted file&lt;/li&gt;
&lt;li&gt;Look for conflict markers (&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;=======&lt;/code&gt;, &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Choose which changes to keep&lt;/li&gt;
&lt;li&gt;Remove the conflict markers&lt;/li&gt;
&lt;li&gt;Add and commit the resolved file&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;problem-nothing-to-commit-&quot;&gt;Problem: &quot;Nothing to commit&quot;&lt;/h4&gt;
&lt;p&gt;This means all your changes are already committed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git status  # Check what's happening
git push    # Maybe you need to push to GitHub
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;what-s-next-&quot;&gt;What's Next?&lt;/h3&gt;
&lt;p&gt;Now that you understand the basics, here are some next steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Practice Daily&lt;/strong&gt;: Use Git for all your projects, even small ones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contribute to Open Source&lt;/strong&gt;: Find beginner-friendly projects on GitHub&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learn Git GUIs&lt;/strong&gt;: Try tools like GitHub Desktop or GitKraken&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explore Advanced Features&lt;/strong&gt;: Learn about rebasing, cherry-picking, and hooks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Join Communities&lt;/strong&gt;: Participate in coding communities and collaborate on projects&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;conclusion-2&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Congratulations! You've just learned the fundamentals of Git and GitHub. These tools might seem overwhelming at first, but with practice, they'll become second nature.&lt;/p&gt;
&lt;p&gt;Remember these key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Git tracks changes&lt;/strong&gt; to your files over time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub hosts&lt;/strong&gt; your repositories online&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commits&lt;/strong&gt; are snapshots of your project&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branches&lt;/strong&gt; let you work on features safely&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull Requests&lt;/strong&gt; facilitate collaboration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Start small, practice regularly, and don't be afraid to make mistakes. Every developer has accidentally deleted something or created a merge conflict. The beauty of Git is that you can almost always recover from these situations.&lt;/p&gt;
&lt;p&gt;Your journey with version control has just begun, and it's going to make you a more organized, confident, and collaborative developer. Happy coding!&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;let-s-stay-connected-&quot;&gt;Let's Stay Connected!&lt;/h3&gt;
&lt;p&gt;Found this guide helpful? I'd love to connect with you and share more programming content!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; Main Links:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://abdelhakim-baalla.vercel.app/&quot;&gt;abdelhakim-baalla.vercel.app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/abdelhakimbaalla/&quot;&gt;abdelhakimbaalla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Twitter:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://x.com/Abdelhakim99891&quot;&gt;@Abdelhakim99891&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev.to:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/abdelhakim_baalla&quot;&gt;abdelhakim_baalla&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt; More Platforms:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Abdelhakim-Baalla&quot;&gt;Abdelhakim-Baalla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medium:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://medium.com/@abdelhakimbaalla50&quot;&gt;abdelhakimbaalla50&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instagram:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.instagram.com/abdelhakim.baalla/&quot;&gt;abdelhakim.baalla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/@Dinocrafting&quot;&gt;Dinocrafting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt; Community:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reddit:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.reddit.com/user/Abdelhakim-Baalla430/&quot;&gt;Abdelhakim-Baalla430&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stack Overflow:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://stackoverflow.com/users/28245534/abdelhakim-baalla?tab=profile&quot;&gt;abdelhakim-baalla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hashnode:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://abdelhakimbaalla.hashnode.dev/&quot;&gt;abdelhakimbaalla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Substack:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://substack.com/@abdelhakimbaalla&quot;&gt;abdelhakimbaalla&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Follow me for more beginner-friendly tutorials, coding tips, and tech insights. Let's learn and grow together in this amazing world of programming!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/3950/git-github-your-first-steps-to-version-control</guid>
<pubDate>Sun, 13 Jul 2025 21:32:41 +0000</pubDate>
</item>
<item>
<title>Git Under the Hood</title>
<link>https://coderlegion.com/3612/git-under-the-hood</link>
<description>&lt;p&gt;I decided to write a short introduction to Git — and more specifically, what’s going on under the hood. Understanding the internal mechanics of Git can help you better grasp its basic behavior and make it easier to understand commands used in everyday workflows.&lt;/p&gt;
&lt;h3 id=&quot;did-you-know-that-git-is-fundamentally-a-key-value-store-&quot;&gt;Did you know that Git is fundamentally a key-value store?&lt;/h3&gt;
&lt;p&gt;In Git, the key is a SHA-1 (or SHA-256) hash, and the value is a Git object.&lt;/p&gt;
&lt;h3 id=&quot;what-is-a-hash-&quot;&gt;What is a hash?&lt;/h3&gt;
&lt;p&gt;SHA stands for Secure Hash Algorithm. It’s a family of cryptographic hash functions designed to take input data of any size and produce a fixed-size string of characters — a &quot;digest&quot; or &quot;hash&quot; — that looks like a random sequence of letters and numbers.&lt;/p&gt;
&lt;p&gt;Key Properties of a Hash&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;same input always produces the same output hash&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It’s &lt;strong&gt;fast to compute a hash&lt;/strong&gt; for any given input.&lt;/li&gt;
&lt;li&gt;Given a hash, it's &lt;strong&gt;computationally infeasible to reverse it&lt;/strong&gt; and recover the original input — doing so would require an impractical amount of time and energy.&lt;/li&gt;
&lt;li&gt;It's extremely unlikely that two different inputs will produce the same hash (this is called a collision).&lt;/li&gt;
&lt;li&gt;Even &lt;strong&gt;small changes in the input result in completely different hashes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each Git object's hash is calculated from its content. This guarantees data integrity — meaning the content can’t be modified without changing its hash. It also enables deduplication, where identical content is stored only once.&lt;br&gt;
Historically, Git has used SHA-1 hashes for its internal objects — such as blobs, trees, commits, and tags. Each object is identified by a 40-character SHA-1 hash. SHA-1 is a cryptographic hash function that produces a 160-bit (20-byte) hash.&lt;/p&gt;
&lt;p&gt;However, due to growing concerns about vulnerabilities in SHA-1, newer versions of Git support SHA-256, a more secure hashing algorithm.&lt;/p&gt;
&lt;p&gt;Git isn't the only tool that uses hashes — there are many other use cases for verifying data integrity. A common method is to generate a digest (hash) of a file or message and later recheck the digest to confirm that the content hasn't been modified.&lt;/p&gt;
&lt;p&gt;For example, when downloading a file or disk image, you’ll often see a checksum (like SHA-256) provided alongside it. After the download, you can compute the digest of the file on your machine and compare it to the provided value. If they match, the file hasn't been altered.&lt;/p&gt;
&lt;p&gt;It’s also important to remember that a digest is a one-way function: you cannot retrieve the original data from the hash.&lt;/p&gt;
&lt;h3 id=&quot;what-are-git-objects-&quot;&gt;What Are Git Objects?&lt;/h3&gt;
&lt;p&gt;Git stores all of its data as a set of objects in its internal database. These objects form the foundation of Git’s version control system.&lt;/p&gt;
&lt;p&gt;The four main Git object types are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blob (Binary Large Object)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Represents the content of a file.&lt;/li&gt;
&lt;li&gt;Stores only the raw data — not the filename or metadata.&lt;/li&gt;
&lt;li&gt;Each version of a file’s content is stored as a separate blob.&lt;/li&gt;
&lt;li&gt;Think of it as a snapshot of the file's content at a specific point in time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tree&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Represents a directory.&lt;/li&gt;
&lt;li&gt;Contains pointers to blobs (files) and other trees (subdirectories).&lt;/li&gt;
&lt;li&gt;Stores:&lt;/li&gt;
&lt;li&gt;Filenames&lt;/li&gt;
&lt;li&gt;File modes (permissions)&lt;/li&gt;
&lt;li&gt;References to blobs and other trees&lt;br&gt;
Think of it as a snapshot of a folder’s structure and contents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Commit&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Represents a snapshot of the entire project at a given point in time. Points to a single tree object (the project’s root directory).&lt;/li&gt;
&lt;li&gt;Contains metadata:&lt;/li&gt;
&lt;li&gt;Author and committer info&lt;/li&gt;
&lt;li&gt;Commit message&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;References to parent commits (the project’s history)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tag&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A human-readable label or bookmark that points to another Git object, usually a commit.&lt;br&gt;
Can be lightweight (just a reference) or annotated (with metadata).&lt;/li&gt;
&lt;li&gt;Annotated tags include:&lt;/li&gt;
&lt;li&gt;Tagger name&lt;/li&gt;
&lt;li&gt;Date&lt;/li&gt;
&lt;li&gt;Optional message&lt;/li&gt;
&lt;li&gt;Often used for marking releases (e.g. v1.0.0).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, this is why &lt;strong&gt;Git tracks content, not directories&lt;/strong&gt;. If a directory contains no files or subdirectories, Git has nothing to store — the directory itself doesn't exist in Git's object database. That's why developers often create an empty file like .gitkeep to force Git to track an otherwise empty directory.&lt;/p&gt;
&lt;p&gt;It's also worth noting that Git does not track full file permissions. It only stores limited permission bits — mainly whether a file is executable or not (i.e., the +x bit).&lt;/p&gt;
&lt;p&gt;Since a &lt;strong&gt;blob represents only the content&lt;/strong&gt; of a file (without its name or path), you can’t retrieve the filename directly from a blob object. The filename and path information are stored in the tree object that references the blob.&lt;/p&gt;
&lt;p&gt;This design means that &lt;strong&gt;two files with different names but identical content will share the same hash&lt;/strong&gt; — and therefore the same blob. This is one of the ways Git achieves storage efficiency through deduplication.&lt;/p&gt;
</description>
<category>Git &amp; Version Control</category>
<guid isPermaLink="true">https://coderlegion.com/3612/git-under-the-hood</guid>
<pubDate>Sat, 28 Jun 2025 19:28:23 +0000</pubDate>
</item>
<item>
<title>Rewinding Time in Git: Exploring Commits &amp; Branching</title>
<link>https://coderlegion.com/3525/rewinding-time-in-git-exploring-commits-branching</link>
<description>&lt;p&gt;In the &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/3484/understanding-the-basics-of-git&quot;&gt;last story&lt;/a&gt;, we created a new repository on GitHub and pushed our code to the main branch. In this one, let’s rewind a bit, I'll walk you through how to look back at your development history and test new features safely using Git.&lt;/p&gt;
&lt;p&gt;By now, you’ve probably updated your project and pushed changes quite a few times. Every commit you've made is like a snapshot, a version of your project frozen in time.&lt;/p&gt;
&lt;p&gt;But how do you go back and look at an old version, maybe just to check a single line of code?&lt;/p&gt;
&lt;p&gt;Most people head to GitHub -&amp;gt; Commits tab. But you don’t need to leave the terminal for that. Here's how you can do it right from the command line.&lt;/p&gt;
&lt;h2 id=&quot;see-your-project-s-history&quot;&gt;See Your Project’s History&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This shows a list of commits made by you and your collaborators. Each commit is identified by a unique 40-character SHA-1 hash. This hash acts like a version ID.&lt;/p&gt;
&lt;p&gt;A sample log entry looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit 7abd5964ad8ef67ac20f5c52eea34e0d3bebe110
Author: hiruthicShaSS &amp;lt;*Emails are not allowed*&amp;gt;
Date: Fri Jun 25 16:42:07 2021 +0530

    Opening articles in new tab and card title fixed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s a lot of info! Let’s trim it down.&lt;/p&gt;
&lt;h3 id=&quot;get-specific-commits&quot;&gt;Get Specific Commits&lt;/h3&gt;
&lt;p&gt;Want just the last few entries?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git log -3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Want logs after a specific date?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git log --after=&quot;2021-05-01&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Combine with &lt;code&gt;--before&lt;/code&gt; to get a date range!&lt;/p&gt;
&lt;p&gt;Want Less Detail? Use &lt;code&gt;--oneline&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git log --oneline
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This condenses each commit into a single line:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;7abd596 Opening articles in new tab and card title fixed
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;to-include-branch-and-tag-info-too-&quot;&gt;To include branch and tag info too:&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git log --oneline --decorate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or if you're just looking for a human-friendly summary:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git shortlog
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;enter-branches&quot;&gt;Enter Branches&lt;/h2&gt;
&lt;p&gt;Every Git project starts with the default main branch. But you shouldn’t develop or test directly on it. That’s what branches are for.&lt;/p&gt;
&lt;h3 id=&quot;check-your-current-branches-&quot;&gt;Check your current branches:&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git branch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let’s create a new one for development:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git branch development
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But wait, this doesn’t switch to the new branch yet. To move to it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout development
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or do both in one shot:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout -b development
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Honestly, this is what I always use .&lt;/p&gt;
&lt;h3 id=&quot;why-branching-matters&quot;&gt;Why Branching Matters&lt;/h3&gt;
&lt;p&gt;Each branch is an isolated version of your code. You can try out features, break stuff, go wild, and it won't affect your main branch. When you're done and happy with your changes, you can merge it back.&lt;/p&gt;
&lt;p&gt;If it all goes south? Just delete the branch and start over from main (just kidding, we'll talk how to fix f*ckups in git later).&lt;/p&gt;
&lt;p&gt;Working with Git branches is like owning the Eye of Agamotto, every time you mess up, you can just rewind time and try again. Cool, right? &lt;/p&gt;
&lt;p&gt;Until then:&lt;/p&gt;
&lt;h3 id=&quot;learn-git-get-fit-&quot;&gt;Learn Git. Get fit. &lt;/h3&gt;
&lt;p&gt;Stay Curious. Adios ✌️&lt;/p&gt;
</description>
<category>Collaboration Tools</category>
<guid isPermaLink="true">https://coderlegion.com/3525/rewinding-time-in-git-exploring-commits-branching</guid>
<pubDate>Fri, 27 Jun 2025 07:07:54 +0000</pubDate>
</item>
<item>
<title>Understanding the basics of GIT</title>
<link>https://coderlegion.com/3484/understanding-the-basics-of-git</link>
<description>&lt;p&gt;Git is a powerful Source Control Management (SCM) tool, and when combined with GitHub, it becomes much more than just version tracking. In this article, I'll walk you through the essential Git commands I regularly use in my projects. Let's dive in! &lt;/p&gt;
&lt;h3 id=&quot;what-is-a-repository-&quot;&gt;What is a Repository?&lt;/h3&gt;
&lt;p&gt;A repository is essentially a folder on GitHub that holds your project files. But it's more than just a folder-it comes packed with features that help track changes, collaborate with others, and manage your code efficiently.&lt;/p&gt;
&lt;h3 id=&quot;what-is-a-commit-&quot;&gt;What is a Commit?&lt;/h3&gt;
&lt;p&gt;A commit is a snapshot of your code at a specific point in time. It lets you track changes and roll back to previous versions when needed.&lt;/p&gt;
&lt;h3 id=&quot;what-is-a-branch-&quot;&gt;What is a Branch?&lt;/h3&gt;
&lt;p&gt;A branch is like a sandbox. It lets you test or add new features without affecting the main codebase. By default, the primary branch is called main (earlier known as master). You can safely experiment on other branches and merge changes when ready.&lt;/p&gt;
&lt;h3 id=&quot;initializing-a-git-repository&quot;&gt;Initializing a Git Repository&lt;/h3&gt;
&lt;p&gt;To create a new Git repository for your project:&lt;/p&gt;
&lt;h4 id=&quot;initialize-a-new-git-repository&quot;&gt;Initialize a new Git repository&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git init
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;-optional-rename-the-default-branch-to-main-&quot;&gt;(Optional) Rename the default branch to 'main'&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git branch -m master main
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;connect-your-local-repo-to-a-remote-one-github-gitlab-etc-&quot;&gt;Connect your local repo to a remote one (GitHub, GitLab, etc.)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add origin &amp;lt;your-remote-url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;verify-the-remote-url&quot;&gt;Verify the remote URL&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; Boom! Your local repository is ready and connected to the remote one.&lt;/p&gt;
&lt;h3 id=&quot;add-readme-md-and-gitignore&quot;&gt;Add README.md and .gitignore&lt;/h3&gt;
&lt;h4 id=&quot;readme-md&quot;&gt;README.md&lt;/h4&gt;
&lt;p&gt;This is the face of your project on GitHub. It's a Markdown file that can include formatted text, links, images, badges, and more to explain your project.&lt;/p&gt;
&lt;h4 id=&quot;-gitignore&quot;&gt;.gitignore&lt;/h4&gt;
&lt;p&gt;This file tells Git which files/folders to ignore. You should add files like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IDE config files&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Secret keys&lt;/li&gt;
&lt;li&gt;Build directories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This prevents accidentally pushing sensitive or unnecessary files to your repo.&lt;/p&gt;
&lt;h3 id=&quot;staging-and-committing-changes&quot;&gt;Staging and Committing Changes&lt;/h3&gt;
&lt;p&gt;After creating your files, it's time to track and commit them:&lt;/p&gt;
&lt;h4 id=&quot;add-specific-files&quot;&gt;Add specific files&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add &amp;lt;filename&amp;gt; &amp;lt;another-filename&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;or-add-all-changes&quot;&gt;Or add all changes&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;commit-with-a-message&quot;&gt;Commit with a message&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git commit -m &quot;Initial commit with README and .gitignore&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A commit creates a restore point in your project. Make sure your commit messages are meaningful!&lt;/p&gt;
&lt;h3 id=&quot;pushing-to-remote&quot;&gt;Pushing to Remote&lt;/h3&gt;
&lt;p&gt;Your code is still local. To push it to your remote repository:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you're working on a different branch, just replace main with your branch name.&lt;/p&gt;
&lt;h3 id=&quot;wrapping-up-1&quot;&gt;Wrapping Up&lt;/h3&gt;
&lt;p&gt;That's it! You've now initialized a Git repo, tracked changes, and pushed your code to GitHub. This is just the beginning. Git has a lot more to offer-branching strategies, rebasing, stashing, cherry-picking, and so on.&lt;/p&gt;
&lt;p&gt;But we'll cover all that in the next article. Until then, happy coding!&lt;/p&gt;
&lt;p&gt;Stay Curious. Adios &lt;/p&gt;
</description>
<category>Collaboration Tools</category>
<guid isPermaLink="true">https://coderlegion.com/3484/understanding-the-basics-of-git</guid>
<pubDate>Thu, 26 Jun 2025 04:17:18 +0000</pubDate>
</item>
<item>
<title>Discover software versioning, including Semantic Versioning and GitHub releases, to boost your project management skills</title>
<link>https://coderlegion.com/3011/discover-software-versioning-including-semantic-versioning-releases-project-management</link>
<description>&lt;h5 id=&quot;in-this-article-we-explore-versioning-in-software-development-you-ll-learn-about-semantic-versioning-github-releases-and-practical-steps-to-manage-updates-enhancing-your-project-management-skills-&quot;&gt;In this article, we explore versioning in software development. You'll learn about Semantic Versioning, GitHub releases, and practical steps to manage updates, enhancing your project management skills!&lt;/h5&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1747064782994/f028caba-f7e1-4afc-9ec2-b0c34ef5decc.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;versioning&quot;&gt;Versioning&lt;/h4&gt;
&lt;p&gt;Versioning in software development is a systematic method of assigning unique version numbers to different states of a software product. This practice helps developers and users track changes, improvements, and bug fixes over time.&lt;/p&gt;
&lt;p&gt;By using version numbers, teams can efficiently manage software updates, ensure compatibility, and maintain a clear history of the software's evolution. Versioning is crucial for collaboration, as it allows multiple developers to work on the same project without conflicts and provides users with a clear understanding of the software's progression and stability.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;semantic-versioning&quot;&gt;Semantic Versioning&lt;/h4&gt;
&lt;p&gt;In versioning, particularly Semantic Versioning (SemVer), version numbers are typically structured as three-part identifiers: major, minor, and patch. Here's what each part represents:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Major Version (X)&lt;/strong&gt;: This number is incremented when there are incompatible changes that may break backward compatibility. It signifies significant updates or overhauls to the software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Minor Version (Y)&lt;/strong&gt;: This number is incremented when new features are added in a backward-compatible manner. It indicates enhancements and improvements that do not disrupt existing functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Patch Version (Z)&lt;/strong&gt;: This number is incremented for backward-compatible bug fixes. It addresses issues and errors without adding new features or breaking existing ones.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Additional characters and symbols used in versioning:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Caret (^)&lt;/strong&gt;: In dependency management, the caret symbol is used to specify compatible versions. For example, ^1.2.3 allows updates to versions that do not change the leftmost non-zero digit (e.g., 1.x.x).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tilde (~)&lt;/strong&gt;: Similar to the caret, the tilde specifies a range of acceptable versions, but it is more restrictive. For example, ~1.2.3 allows updates to versions that do not change the middle digit (e.g., 1.2.x).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pre-release Identifiers&lt;/strong&gt;: These are appended to version numbers to indicate versions that are not yet stable, such as alpha, beta, or release candidate (e.g., 1.0.0-alpha).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build Metadata&lt;/strong&gt;: This is additional information about a build, appended after a plus sign (e.g., 1.0.0+build.1). It does not affect version precedence.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;These conventions help developers manage dependencies and ensure compatibility across different versions of software.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The chart below, based on information from &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Software_versioning&quot;&gt;Wikipedia&lt;/a&gt;, shows how software versions are named during development stages. In early stages, like alpha or beta, a zero in the major version shows that development is still happening. Semantic Versioning uses suffixes like -alpha to show the status, while numeric status uses numbers in the sequence. The numeric 90+ scheme, used by older projects, puts a large number at the end to mark pre-releases, helping users understand how stable the software is.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Development Stage &lt;/th&gt;&lt;th&gt;Semantic Versioning &lt;/th&gt;&lt;th&gt;Numeric Status &lt;/th&gt;&lt;th&gt;Numeric 90+&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Alpha &lt;/td&gt;&lt;td&gt;1.2.0-a.1 &lt;/td&gt;&lt;td&gt;1.2.0.1 &lt;/td&gt;&lt;td&gt;1.1.90&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Beta &lt;/td&gt;&lt;td&gt;1.2.0-b.2 &lt;/td&gt;&lt;td&gt;1.2.1.2 &lt;/td&gt;&lt;td&gt;1.1.93&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Release Candidate (RC) &lt;/td&gt;&lt;td&gt;1.2.0-rc.3 &lt;/td&gt;&lt;td&gt;1.2.2.3 &lt;/td&gt;&lt;td&gt;1.1.97&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Release &lt;/td&gt;&lt;td&gt;1.2.0 &lt;/td&gt;&lt;td&gt;1.2.3.0 &lt;/td&gt;&lt;td&gt;1.2.0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Post-release Fixes &lt;/td&gt;&lt;td&gt;1.2.5 &lt;/td&gt;&lt;td&gt;1.2.3.5 &lt;/td&gt;&lt;td&gt;1.2.5&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;releases&quot;&gt;Releases&lt;/h4&gt;
&lt;p&gt;You'll find a section labeled 'Releases' on the main GitHub repository page for the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/LetsGetTechnical/elecretanta&quot;&gt;Elecretanta&lt;/a&gt; project by the Gridiron Survivors team I am on. This section is where the project maintainers publish official versions of the software. Each release typically includes a version number, release notes, and downloadable assets like source code or compiled binaries.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So far, we have three release tags in the Elecretanta project's GitHub repository that show how the software has developed. These tags help track the project's progress and understand the changes made over time.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1746806900422/c240a951-e07a-40c7-afd6-e3a7acd6381e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Elecretanta project has three alpha release tags, each representing a different stage of development. The latest, 0.3.0-alpha, includes new features and improvements still being tested. The 0.2.0-alpha tag shows earlier development progress with foundational updates, while 0.1.0-alpha marks the initial release, introducing the software's basic functions. All releases are available for download in zip and tar.gz formats, and they share the same commit identifier, indicating they were part of a rapid development cycle.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1746807308029/e92e1ac0-e06e-4012-94ca-e40166a1831c.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;steps-taken-to-update-to-version-3&quot;&gt;Steps Taken to Update to Version 3&lt;/h4&gt;
&lt;p&gt;Our team lead, Shashi, upgraded the Elecretanta project from version 2 to version 3 during a Livestream. Although it wasn't recorded, he provided a detailed step-by-step guide on the update process, which we will now review.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update process steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create &lt;strong&gt;PR&lt;/strong&gt; from &lt;strong&gt;develop&lt;/strong&gt; into &lt;strong&gt;main&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify &lt;strong&gt;package.json&lt;/strong&gt; version number.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merge both changes together towards &lt;strong&gt;main&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to GitHub repo's homepage and click on &lt;strong&gt;Releases&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;Draft a new release&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new tag that matches the version number.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Target is &lt;strong&gt;main&lt;/strong&gt; branch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;generate release notes&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This will combine all the &lt;strong&gt;PRs&lt;/strong&gt; that are being released into the &lt;strong&gt;main&lt;/strong&gt; branch compared to the previous release notes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Shashi followed a structured process on GitHub to update the Elecretanta project from version 2 to version 3. First, a pull request (PR) was created from the develop branch to the main branch. The package.json file was then updated to reflect the new version number. After merging these changes into main, Shashi navigated to the GitHub repository's homepage and selected &quot;Releases.&quot; He drafted a new release, creating a tag that matched the updated version number, targeting the main branch. By generating release notes, all PRs merged into main since the last release were automatically compiled, providing a comprehensive overview of the updates.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-is-new-in-version-3-&quot;&gt;What is New in Version 3?&lt;/h4&gt;
&lt;p&gt;In version 3 of our project, we focused on refining the codebase and enhancing the overall quality of the application. A significant portion of this release involved addressing and resolving numerous ESLint errors across various components, such as forms, alert dialogues, text areas, and avatar components. This effort was crucial in improving code quality and ensuring consistency throughout the project.&lt;/p&gt;
&lt;p&gt;Additionally, we made some user experience improvements, like adding a &quot;back to dashboard&quot; link for easier navigation and ensuring that users are properly redirected to the dashboard after completing the onboarding flow. We also created unit tests for specific components, such as labels and avatar images, to enhance the reliability and maintainability of the code.&lt;/p&gt;
&lt;p&gt;Compared to version 2, which introduced major features like the GiftExchange system and user onboarding, version 3 primarily focused on polishing the existing features and ensuring a smoother, more reliable user experience. This release also welcomed new contributors, who played a vital role in addressing these improvements and ensuring the project's continued success!&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;understanding-auto-generated-release-notes-on-github&quot;&gt;Understanding Auto-Generated Release Notes on GitHub&lt;/h4&gt;
&lt;p&gt;After our tech lead, Shashi, completed the update from version 2 to 3, he utilized a GitHub feature to generate automatic release notes. This process streamlines the creation of release notes, making it particularly effective for tracking changes and contributions. By leveraging the naming conventions of branches and pull requests (PRs), this feature automatically compiles a comprehensive overview of updates for each release.&lt;/p&gt;
&lt;h5 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Branch Naming Conventions&lt;/strong&gt;: By adhering to a consistent naming convention for branches, such as including issue numbers or descriptive titles, GitHub can link these branches directly to their corresponding PRs. This practice not only organizes the workflow but also facilitates the automatic generation of release notes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pull Requests and Commits&lt;/strong&gt;: Each PR, when merged, is associated with specific commits that detail the changes made. These are often linked to issues or tasks, providing context and traceability. For example, a branch named &lt;code&gt;Julianna/257-ESLint-Errors-Form&lt;/code&gt; indicates that the work addresses ESLint errors in a form component, linked to issue #257.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-Generated Notes&lt;/strong&gt;: When drafting a new release, GitHub can automatically generate release notes by compiling all merged PRs since the last release. This includes details such as the PR title, author, and a brief description of the changes. The notes also highlight new contributors, acknowledging their first contributions to the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: This automated process saves time and ensures accuracy in documenting changes. It provides a clear and organized summary of what has been updated, fixed, or added, making it easier for team members and users to understand the progression of the project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1746818925031/8842b850-f049-40c1-ba1b-e4b58a9b6564.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;By utilizing these features, teams can maintain a well-documented history of their project's development, enhancing collaboration and transparency!&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;about-us-1&quot;&gt;About Us&lt;/h4&gt;
&lt;h5 id=&quot;what-is-gridiron-survivor--1&quot;&gt;What is Gridiron Survivor?&lt;/h5&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/blog-posts/bridging-the-skills-gap-empowering-junior-developers-through-apprenticeship-programs&quot;&gt;&lt;em&gt;Gridiron Survivor&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is an apprenticeship program created by Shashi Lo, a Senior UX Engineer at Microsoft. It aims to provide developers entering the tech industry with vital work experience. The program focuses on practical training in project management, coding practices, and team collaboration, offering mentorship and skills essential for success in their initial tech roles.&lt;/em&gt;&lt;/p&gt;
&lt;h5 id=&quot;what-is-the-elfgorithm-app--1&quot;&gt;What is the Elfgorithm App?&lt;/h5&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/LetsGetTechnical/elecretanta&quot;&gt;&lt;em&gt;Elfgorithm&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is an AI-driven Secret Santa app set to launch in winter 2025. It streamlines gift exchanges by removing the guesswork from Secret Santa activities. The app manages gift-giving details and provides personalized gift suggestions, ensuring you find the perfect presents for everyone.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1746822066474/f4885573-cda7-4148-8baf-df596b93a282.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;gridiron-survivor-sponsors-1&quot;&gt;Gridiron Survivor Sponsors&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;A very special thanks to our sponsors!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.gitkraken.com/&quot;&gt;GitKraken&lt;/a&gt;: &lt;em&gt;A popular Git client that provides a graphical interface to manage Git repositories. It is known for its user-friendly design and features that simplify version control, making it easier for developers to collaborate and manage their code.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.frontendmentor.io/&quot;&gt;Frontend Mentor&lt;/a&gt;: &lt;em&gt;An online platform that offers front-end coding challenges. It helps developers improve their skills by providing real-world projects to work on, along with a supportive community for feedback and learning.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;: &lt;em&gt;A cloud platform for static sites and serverless functions. It is designed to optimize the workflow of developers by providing tools for building, deploying, and scaling modern web applications with ease. Vercel is known for its seamless integration with frameworks like Next.js.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;my-other-related-articles-1&quot;&gt;My other related articles&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/04-25/gridiron-survivor's-elfgorithm-introduction-and-team-installation/&quot;&gt;Gridiron Survivor's Elfgorithm: Introduction and Team Installation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/blog-posts/bridging-the-skills-gap-empowering-junior-developers-through-apprenticeship-programs&quot;&gt;Bridging the Skills Gap: Empowering Junior Developers Through Apprenticeship Programs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2022/02-22/ShashiLo/&quot;&gt;Shashi Lo: UI Design Fundamentals&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740168177634/1ff578a9-5d03-4800-9c0c-9092e4e60c4f.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;be-sure-to-listen-to-the-html-all-the-things-podcast--1&quot;&gt;&lt;strong&gt;Be sure to listen to the HTML All The Things Podcast!&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id=&quot;i-also-write-articles-for-the-html-all-the-things-podcast-which-you-can-read-on-their-website-https-www-htmlallthethings-com--1&quot;&gt;&lt;em&gt;I also write articles for the HTML All The Things Podcast, which you can read on their website:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/&quot;&gt;&lt;em&gt;https://www.htmlallthethings.com/&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/h5&gt;
&lt;h5 id=&quot;be-sure-to-check-out-html-all-the-things-on-socials--1&quot;&gt;&lt;strong&gt;Be sure to check out HTML All The Things on socials!&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/htmleverything&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/company/html-all-the-things/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.tiktok.com/@htmlallthethings&quot;&gt;TikTok&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.instagram.com/htmlallthethings/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;affiliate-amp-discount-links--1&quot;&gt;Affiliate &amp;amp; Discount Links!&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740168473785/c85789c9-1594-4000-aa2f-43e842f9825f.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With CodeMonkey, learning can be all fun and games!&lt;/strong&gt; CodeMonkey transforms education into an engaging experience, enabling children to evolve from tech consumers to creators. Use CodeMonkey's &lt;strong&gt;FREE trial&lt;/strong&gt; to unlock the incredible potential of young tech creators!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With a structured learning path tailored for various age groups, kids progress from block coding to more advanced topics like data science and artificial intelligence, using languages such as CoffeeScript and Python. The platform includes features for parents and teachers to track progress, making integrating coding into home and classroom settings easy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Through fun games, hands-on projects, and community interaction, CodeMonkey helps young learners build teamwork skills and receive recognition for their achievements. It fosters a love for coding and prepares children for future career opportunities in an ever-evolving tech landscape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;To learn more about CodeMonkey, you can read my detailed&lt;/em&gt;&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/02-25/inspiring-young-coders-how-codemonkey-turns-kids-into-tech-creators/&quot;&gt;&lt;strong&gt;&lt;em&gt;review article&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affiliate Links:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919057/12259&quot;&gt;Sign Up for Parents&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919060/12259&quot;&gt;Sign Up for Teachers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740169191630/ac8c5360-d1c5-4c85-8504-18b9c755841e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;advance-your-career-with-a-20-discount-on-scrimba-pro-using-this-affiliate-link--1&quot;&gt;Advance your career with a 20% discount on Scrimba Pro using this &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;affiliate link&lt;/a&gt;!&lt;/h4&gt;
&lt;p&gt;Become a hireable developer with Scrimba Pro! Discover a world of coding knowledge with full access to all courses, hands-on projects, and a vibrant community. You can &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2021/06-21/06-07-21/&quot;&gt;read my article&lt;/a&gt; to learn more about my exceptional experiences with Scrimba and how it helps many become confident, well-prepared web developers!&lt;/p&gt;
&lt;h6 id=&quot;important-this-discount-is-for-new-accounts-only-if-a-higher-discount-is-currently-available-it-will-be-applied-automatically--1&quot;&gt;&lt;strong&gt;&lt;em&gt;Important:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;This discount is for new accounts only. If a higher discount is currently available, it will be applied automatically.&lt;/em&gt;&lt;/h6&gt;
&lt;p&gt;&lt;strong&gt;How to Claim Your Discount:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;the link&lt;/a&gt; to explore the new Scrimba 2.0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrade to Pro; the 20% discount will automatically apply.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id=&quot;disclosure-this-article-contains-affiliate-links-i-will-earn-a-commission-from-any-purchases-made-through-these-links-at-no-extra-cost-to-you-your-support-helps-me-continue-creating-valuable-content-thank-you--1&quot;&gt;&lt;strong&gt;&lt;em&gt;Disclosure:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;This article contains affiliate links. I will earn a commission from any purchases made through these links at no extra cost to you. Your support helps me continue creating valuable content. Thank you!&lt;/em&gt;&lt;/h6&gt;
&lt;hr&gt;
&lt;h4 id=&quot;conclusion-3&quot;&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Software versioning is a fundamental practice that allows us to track changes, manage updates, and ensure compatibility in our projects. By understanding version numbers, which consist of major, minor, and patch components, you can effectively manage software updates and monitor your project's evolution.&lt;/p&gt;
&lt;p&gt;In our team's Elecretanta project, recently updated to version 3 by our team lead, Shashi, we focused on refining the codebase, improving user experience, and enhancing code quality. The update process utilized Semantic Versioning principles and GitHub's automatic release notes feature, simplifying the creation of release notes and helping track changes and contributions. This release also highlighted the importance of collaboration and welcoming new contributors to ensure the project's ongoing success.&lt;/p&gt;
&lt;p&gt;By leveraging software versioning and tools like GitHub, you can keep your projects organized and efficient, encouraging continuous innovation and opportunities for success in your development efforts!&lt;/p&gt;
&lt;hr&gt;
&lt;h6 id=&quot;do-you-now-feel-confident-in-managing-software-versioning-with-semantic-versioning-and-github-releases-have-you-discovered-new-strategies-for-effective-version-control-please-share-the-article-and-comment-&quot;&gt;&lt;em&gt;Do you now feel confident in managing software versioning with Semantic Versioning and GitHub Releases? Have you discovered new strategies for effective version control? Please share the article and comment!&lt;/em&gt;&lt;/h6&gt;
&lt;hr&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/3011/discover-software-versioning-including-semantic-versioning-releases-project-management</guid>
<pubDate>Tue, 13 May 2025 18:32:02 +0000</pubDate>
</item>
<item>
<title>Git and GitHub for Python Developers A Comprehensive Guide</title>
<link>https://coderlegion.com/213/git-and-github-for-python-developers-a-comprehensive-guide</link>
<description>&lt;p&gt;Git and GitHub play a crucial role in the workflow of Python developers, providing essential tools for &lt;strong&gt;version control, collaboration, and project management&lt;/strong&gt;. In this guide, we'll explore the fundamentals of Git and GitHub and how Python developers can leverage them effectively.&lt;/p&gt;
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;We'll discuss the following subjects in this post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Brief Explanation&lt;/li&gt;
&lt;li&gt;Why Git and GitHub are Essential for Python Developers&lt;/li&gt;
&lt;li&gt;Getting Started with Git&lt;/li&gt;
&lt;li&gt;Basic Git Commands&lt;/li&gt;
&lt;li&gt;Working with Branches&lt;/li&gt;
&lt;li&gt;Collaborating with GitHub&lt;/li&gt;
&lt;li&gt;Advanced Git Concepts&lt;/li&gt;
&lt;li&gt;Best Practices and Tips&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, let's delve into each topic in detail.&lt;/p&gt;
&lt;h2 id=&quot;brief-explanation&quot;&gt;Brief Explanation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; is a distributed version control system used in software development that tracks modifications to source code. It allows developers to collaborate on projects efficiently and manage codebase history effectively.&lt;/p&gt;
&lt;p&gt;In contrast, &lt;strong&gt;GitHub&lt;/strong&gt; is a web-based repository hosting platform for Git repositories. It offers additional features like issue tracking, pull requests, and project management tools, making it an ideal platform for open-source collaboration and project hosting.&lt;/p&gt;
&lt;p&gt;Is Git useful for Python? Can Python be used with GitHub? Find out below!&lt;/p&gt;
&lt;h2 id=&quot;why-git-and-github-are-essential-for-python-developers&quot;&gt;Why Git and GitHub are Essential for Python Developers&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Version Control&lt;/strong&gt;: Git enables Python developers to track changes in their codebase, revert to previous versions if needed, and collaborate seamlessly with team members. A system called version control keeps track of changes made to a file or group of files over time so that you can retrieve particular versions at a later time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Distributed Version Control&lt;/strong&gt;: Distributed version control allows multiple developers to work on a project simultaneously. Each developer has their own copy of the repository, and changes can be merged together. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;: GitHub provides a centralized platform for Python developers to work together, review code, and manage project tasks efficiently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open Source Contribution&lt;/strong&gt;: GitHub hosts millions of open-source projects, offering Python developers opportunities to contribute to various projects and enhance their skills.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Project Hosting&lt;/strong&gt;: Python developers can host their projects on GitHub, making it accessible to the community and facilitating collaboration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can I run Python code on GitHub?&lt;/strong&gt; Definitely! GitHub's support for code hosting, version control, and integrated workflows makes it an ideal platform for running and managing Python code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the best git and GitHub for Python developers?&lt;/strong&gt; Git and GitHub, without a doubt! These tools provide essential functionalities for version control, collaboration, and project management, making them invaluable for Python developers.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://realpython.com/&quot;&gt;Real Python&lt;/a&gt; offers high-quality Python tutorials, articles, and resources to help you master Python programming and advance your career.&lt;/p&gt;
&lt;h2 id=&quot;getting-started-with-git&quot;&gt;Getting Started with Git&lt;/h2&gt;
&lt;h3 id=&quot;1-installing-git-on-different-platforms&quot;&gt;&lt;strong&gt;1. Installing Git on Different Platforms&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Where can you find Git and GitHub for Python developers download? Look no further than the official Git and GitHub websites, which offer downloads tailored for various platforms and provide comprehensive documentation for getting started.&lt;br&gt;
To install Git on your system, follow the instructions for your respective platform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;: Download the Git installer from &lt;a rel=&quot;nofollow&quot; href=&quot;https://git-scm.com/&quot;&gt;git-scm.com&lt;/a&gt; and follow the installation wizard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;: Install Git using Homebrew by running &lt;code&gt;brew install git&lt;/code&gt; in the terminal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;: Install Git using your package manager. For instance, use &lt;code&gt;sudo apt install git&lt;/code&gt; on Ubuntu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What's the significance of Git python library?&lt;/strong&gt; The Git python library, also known as GitPython, is a valuable tool for Python developers, offering programmatic access to Git repositories and enabling automation of version control tasks.&lt;/p&gt;
&lt;p&gt;Here's the code snippet for importing GitPython into your Python projects:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Install GitPython package using pip
# You can run this command in your terminal or command prompt
# pip install GitPython

# Once GitPython is installed, you can import it in your Python code
import git

# Now you can use GitPython in your code to interact with Git repositories
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This code snippet demonstrates how to import GitPython into your Python projects after installing the GitPython package using pip.&lt;/p&gt;
&lt;h3 id=&quot;2-configuring-git&quot;&gt;&lt;strong&gt;2. Configuring Git&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Once Git is installed, configure it with your username and email:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &quot;Your Name&quot;
git config --global user.email &quot;*Emails are not allowed*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This makes it clear that the configuration commands are universal and can be used on any operating system.&lt;/p&gt;
&lt;h3 id=&quot;3-creating-your-first-git-repository-locally&quot;&gt;&lt;strong&gt;3. Creating Your First Git Repository Locally&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;To create a new Git repository for your Python project, navigate to your project directory in the terminal and run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This initializes a new Git repository in the current directory.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=4195012421227902972&quot; alt=&quot;repo&quot;&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Diagram illustrating a Git Repository&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;basic-git-commands&quot;&gt;Basic Git Commands&lt;/h2&gt;
&lt;h3 id=&quot;1-git-init&quot;&gt;1. git init&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;git init&lt;/code&gt; command initializes a new Git repository in the current directory.&lt;/p&gt;
&lt;h3 id=&quot;2-git-add&quot;&gt;2. git add&lt;/h3&gt;
&lt;p&gt;The command &lt;code&gt;git add&lt;/code&gt; is used to stage changes for the subsequent commit. You can add specific files or directories:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add file.py            # Add a specific file
git add .                  # Add all changes in the current directory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caution: Avoid adding sensitive information such as passwords or API keys to a Git repository. Instead, make use of independent configuration files or environment variables.&lt;/p&gt;
&lt;h3 id=&quot;3-git-commit&quot;&gt;3. git commit&lt;/h3&gt;
&lt;p&gt;The staged modifications are saved to the repository by using the &lt;code&gt;git commit&lt;/code&gt; command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git commit -m &quot;Commit message&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-git-status&quot;&gt;4. git status&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;git status&lt;/code&gt; command shows the status of files in the repository:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-git-log&quot;&gt;5. git log&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;git log&lt;/code&gt; command displays the commit history:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;6-git-diff&quot;&gt;6. git diff&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;git diff&lt;/code&gt; command shows the differences between files:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git diff file.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=12632383098281494442&quot; alt=&quot;git&quot;&gt;&lt;br&gt;
&lt;em&gt;Figure 2: Diagram illustrating  .git folder&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Putting It All Together: Simple Git Workflow&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone the repository.&lt;/li&gt;
&lt;li&gt;Make changes and stage them.&lt;/li&gt;
&lt;li&gt;Commit changes with a descriptive message.&lt;/li&gt;
&lt;li&gt;Push changes to the remote repository.&lt;/li&gt;
&lt;li&gt;Repeat steps 2-4 as necessary.&lt;/li&gt;
&lt;li&gt;Pull changes from the remote repository to stay up-to-date.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=10672427563998348693&quot; alt=&quot;workflow&quot;&gt;&lt;br&gt;
&lt;em&gt;Figure 3: Diagram illustrating  Git Workflow&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aside: The Staging Area&lt;/strong&gt;&lt;br&gt;
The staging area is where changes are prepared before committing them to the repository. It allows for selective commits.&lt;/p&gt;
&lt;h2 id=&quot;working-with-branches-1&quot;&gt;Working with Branches&lt;/h2&gt;
&lt;h3 id=&quot;1-git-branch&quot;&gt;&lt;strong&gt;1. git branch&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;git branch&lt;/code&gt; command lists, creates, or deletes branches:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git branch                    # List branches
git branch new-feature        # Create a new branch
git branch -d branch-name     # Delete a branch
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;div-green&quot;&gt; &lt;span class=&quot;alert-header&quot;&gt;Tip:&lt;/span&gt; Use Meaningful Branch Names: When creating branches in Git, use descriptive names that reflect the purpose of the branch, such as feature/xyz or bugfix/123. &lt;/div&gt;
&lt;h3 id=&quot;2-git-checkout&quot;&gt;&lt;strong&gt;2. git checkout&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;git checkout&lt;/code&gt; command switches between branches:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout branch-name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Traveling Back in Time: Examining a Specific Version of Your Code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To revert your code to a previous commit, use the git checkout command followed by the commit hash:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-merging-branches&quot;&gt;&lt;strong&gt;3. Merging Branches&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Merge branches using &lt;code&gt;git merge&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git merge branch-name
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-resolving-merge-conflicts&quot;&gt;&lt;strong&gt;4. Resolving Merge Conflicts&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;When merging branches, resolve conflicts by editing the conflicting files and then committing the changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=2907084605637374940&quot; alt=&quot;branch&quot;&gt;&lt;br&gt;
&lt;em&gt;Figure 4: Diagram illustrating Git branch operations&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;collaborating-with-github&quot;&gt;Collaborating with GitHub&lt;/h2&gt;
&lt;p&gt;What's the deal with Python GitHub? Python GitHub, a term synonymous with Python projects hosted on GitHub, offers a wealth of resources, libraries, and collaborative opportunities for Python developers.&lt;/p&gt;
&lt;h3 id=&quot;1-creating-a-github-account&quot;&gt;&lt;strong&gt;1. Creating a GitHub Account&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Visit &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/&quot;&gt;github.com&lt;/a&gt; and sign up for a free account.&lt;/p&gt;
&lt;div class=&quot;div-blue&quot;&gt; &lt;span class=&quot;alert-header&quot;&gt;Note:&lt;/span&gt; License Your Projects: When hosting projects on GitHub, consider adding a license file (e.g., MIT, Apache) to define how others can use, modify, and distribute your code. It's an essential aspect of open-source collaboration and legal protection.&lt;/div&gt;
&lt;h3 id=&quot;2-setting-up-ssh-keys&quot;&gt;&lt;strong&gt;2. Setting up SSH Keys&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Generate SSH keys and add them to your GitHub account for secure authentication:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096 -C &quot;*Emails are not allowed*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Pushing Local Repositories to GitHub&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To push your local repository to GitHub, use the following commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote add origin *Emails are not allowed*:username/repository.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;div-red&quot;&gt; &lt;span class=&quot;alert-header&quot;&gt;Caution:&lt;/span&gt; Be Careful with Force Push: Avoid using **git push --force** (or **-f**) unless absolutely necessary. Force pushing can overwrite history and cause irreversible changes, potentially leading to data loss for you and collaborators.&lt;/div&gt;
&lt;h3 id=&quot;4-cloning-repositories-from-github&quot;&gt;&lt;strong&gt;4. Cloning Repositories from GitHub&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Use the following to copy a repository from GitHub to your PC:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone *Emails are not allowed*:username/repository.git
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-forking-repositories-and-creating-pull-requests&quot;&gt;&lt;strong&gt;5. Forking Repositories and Creating Pull Requests&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Fork repositories on GitHub to contribute changes. Create a pull request to propose your changes for merging into the original repository.&lt;/p&gt;
&lt;div class=&quot;div-green&quot;&gt; &lt;span class=&quot;alert-header&quot;&gt;Tip:&lt;/span&gt; Regularly Update Your Forks: If you fork a repository on GitHub to contribute changes, remember to regularly update your fork with changes from the original repository to avoid conflicts and stay in sync.&lt;/div&gt;
&lt;h3 id=&quot;6-reviewing-pull-requests-and-merging-changes&quot;&gt;&lt;strong&gt;6. Reviewing Pull Requests and Merging Changes&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Review pull requests submitted by collaborators and merge changes into the main branch after review.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=10650148802803396282&quot; alt=&quot;branches&quot;&gt;&lt;br&gt;
&lt;em&gt;Figure 5: Diagram illustrating branches created by different collaborators&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;7-fetching&quot;&gt;&lt;strong&gt;7. Fetching&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The git fetch command downloads objects and refs from another repository, but it does not merge them into your current branch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aside: What is a SHA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A SHA (Secure Hash Algorithm) is a unique identifier for a commit. It's a 40-character string that uniquely identifies a commit.&lt;/p&gt;
&lt;h2 id=&quot;advanced-git-concepts&quot;&gt;Advanced Git Concepts&lt;/h2&gt;
&lt;h3 id=&quot;1-rebasing-commits&quot;&gt;&lt;strong&gt;1. Rebasing Commits&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Rebase commits to maintain a linear commit history:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git rebase branch-name
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;div-blue&quot;&gt; &lt;span class=&quot;alert-header&quot;&gt;Note:&lt;/span&gt; Understanding Git Rebase: While rebasing commits can create a cleaner commit history, it's important to understand that it rewrites commit history, which can cause conflicts for collaborators. Use with caution and communicate changes to team members.&lt;/div&gt;
&lt;h3 id=&quot;2-git-aliases&quot;&gt;&lt;strong&gt;2. Git Aliases&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Define aliases for commonly used Git commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global alias.co checkout
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-using-gitignore&quot;&gt;&lt;strong&gt;3. Using .gitignore&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Create a &lt;code&gt;.gitignore&lt;/code&gt; file to specify files and directories to ignore:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;venv/&quot; &amp;gt;&amp;gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-git-hooks&quot;&gt;&lt;strong&gt;4. Git Hooks&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Set up Git hooks for automation tasks like running tests before commits:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano .git/hooks/pre-commit
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-cherry-picking-commits&quot;&gt;&lt;strong&gt;5. Cherry-picking Commits&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Cherry-pick commits from one branch to another:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git cherry-pick &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;What about Git-python?&lt;/strong&gt; Git-python, a Python library for interacting with Git repositories, offers a convenient way for Python developers to automate Git operations and integrate version control into their Python projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where can you find Git python examples?&lt;/strong&gt; Git python examples abound in tutorials, documentation, and open-source projects hosted on GitHub, providing practical demonstrations of Git usage in Python development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do you perform git-python install?&lt;/strong&gt; Installing git-python is straightforward: simply use pip to install the GitPython package, which provides a Python interface for interacting with Git repositories.&lt;/p&gt;
&lt;h2 id=&quot;best-practices-and-tips&quot;&gt;Best Practices and Tips&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Writing Descriptive Commit Messages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Provide clear and concise commit messages that describe the changes made.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Keeping Commits Atomic and Focused&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Commit small, focused changes to keep the commit history clean and understandable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Using Branches Effectively&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Use branches for feature development, bug fixes, and experimentation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=15159600628462953748&quot; alt=&quot;branch_graph&quot;&gt;&lt;br&gt;
&lt;em&gt;Figure 6: Diagram illustrating Git network graph&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Regularly Pulling Changes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pull changes from remote repositories frequently to stay up-to-date with the latest developments. &lt;/p&gt;
&lt;p&gt;The git pull command fetches changes from a remote repository and merges them into your current branch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Collaborating Effectively&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Communicate with team members, participate in code reviews, and follow project guidelines for effective collaboration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Handling Large Repositories&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Optimize repository size, use shallow clones when necessary, and adopt efficient Git workflows for managing large projects.&lt;/p&gt;
&lt;h2 id=&quot;conclusion-4&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In the exploration of &lt;strong&gt;Git&lt;/strong&gt; and &lt;strong&gt;GitHub&lt;/strong&gt; within the &lt;strong&gt;Python&lt;/strong&gt; development sphere, this guide has endeavored to provide an exhaustive overview, tailored specifically towards Python developers. The utility of Git and GitHub extends beyond mere version control; it encompasses &lt;strong&gt;comprehensive project management&lt;/strong&gt;, &lt;strong&gt;collaboration&lt;/strong&gt; among team members, and a significant &lt;strong&gt;contribution&lt;/strong&gt; to the Python community's advancement. Mastery over these tools empowers developers to manage projects with greater efficiency, collaborate seamlessly, and elevate their Python projects. The knowledge imparted here equips individuals to adeptly navigate version control systems, adopt &lt;strong&gt;collaborative workflows&lt;/strong&gt;, and advance Python projects towards success. It's imperative to recognize that the journey of discovery and learning in the use of these tools is perpetual. Developers are encouraged to continually engage with &lt;strong&gt;Git&lt;/strong&gt; and &lt;strong&gt;GitHub&lt;/strong&gt;, enhancing their competencies and contributing meaningfully to the domain of Python development.&lt;/p&gt;
</description>
<category>Project Dev</category>
<guid isPermaLink="true">https://coderlegion.com/213/git-and-github-for-python-developers-a-comprehensive-guide</guid>
<pubDate>Sun, 07 Apr 2024 21:58:43 +0000</pubDate>
</item>
</channel>
</rss>