<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jakub Gawlik</title>
    <description>The latest articles on DEV Community by Jakub Gawlik (@jacob_gawlik).</description>
    <link>https://dev.to/jacob_gawlik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2330303%2F08b24785-595f-41ec-b31e-390a3e5503d8.png</url>
      <title>DEV Community: Jakub Gawlik</title>
      <link>https://dev.to/jacob_gawlik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacob_gawlik"/>
    <language>en</language>
    <item>
      <title>A Privacy Policy is a promise. Zero-knowledge is a property.</title>
      <dc:creator>Jakub Gawlik</dc:creator>
      <pubDate>Mon, 26 Oct 2026 20:41:44 +0000</pubDate>
      <link>https://dev.to/jacob_gawlik/a-privacy-policy-is-a-promise-zero-knowledge-is-a-property-1bm0</link>
      <guid>https://dev.to/jacob_gawlik/a-privacy-policy-is-a-promise-zero-knowledge-is-a-property-1bm0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Why we built a team workspace around one question: what does a fully compromised server learn?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most “private” workspace tools protect your data with a promise. The promise lives in a privacy policy: we will not look, we will not sell, we will not share. It may be sincere. But a promise is only as strong as the people keeping it, the staff who can reach the database, and the next attacker who gets in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lockorg.com" rel="noopener noreferrer"&gt;lockORG&lt;/a&gt; takes a different approach. It is a workspace app (notes, kanban boards, tags, todos and a journal) for small teams and individuals, and everything in it is encrypted on your device before it is sent. The server stores it, syncs it, and never reads it. Nor can it.&lt;/p&gt;

&lt;p&gt;That is the difference between a promise and a property. A promise can be broken. A property is how the system is built.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one question asked of every change
&lt;/h2&gt;

&lt;p&gt;Every change to &lt;a href="https://lockorg.com" rel="noopener noreferrer"&gt;lockORG&lt;/a&gt; is judged against a single question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What does a fully compromised server learn?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer must not grow. Here is what it is today. Imagine someone has the whole database, the image files, the logs and the server configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F04vu8tldf6ilgwciv181.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F04vu8tldf6ilgwciv181.webp" alt=" " width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look at the left column carefully. It is not empty, and we do not pretend it is. More on that below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a weak password does not sink you
&lt;/h2&gt;

&lt;p&gt;Most encrypted products have a quiet weakness: if your key comes only from your password, a stolen database can be attacked offline, guessing passwords as fast as hardware allows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lockorg.com" rel="noopener noreferrer"&gt;lockORG&lt;/a&gt;’s vault key is derived from two things: your password and a 128-bit account secret key. That secret key is generated on your device at sign-up, printed once in a recovery kit, and kept on your devices. The server never stores it. So even with a weak password, offline brute force against a stolen database is hopeless.&lt;/p&gt;

&lt;p&gt;Your password is never sent to the server either. Signing in uses a separate value derived through a different path, so a leaked login credential says nothing about the key that opens your data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private means private, even from your admin
&lt;/h2&gt;

&lt;p&gt;In a team workspace, the natural question is: can my admin read everything?&lt;/p&gt;

&lt;p&gt;Shared material (notes, boards, tags) is encrypted under a workspace key that every verified member holds. But your todo list and your journal are encrypted under your personal key. Other members, admins included, hold no key for them. The server will not even address another member’s personal rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we do not claim
&lt;/h2&gt;

&lt;p&gt;Honesty about limits is part of the design, so here is the list we would rather say before anyone else does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Not “military-grade”, “bank-level”, “unhackable” or “100% secure”. Those phrases do not describe anything checkable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not anonymous. The server knows your email, who is in which workspace, when you write and how much.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not protected against a malicious operator shipping malicious JavaScript to your browser. This is the known limit of any web client. Native clients with pinned cryptography are the long-term answer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not recoverable without you. Lose your password and your recovery kit and your data is gone. Nobody, operator included, can bring it back. (An optional recovery key gives you a second way in, if you create one.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No two-factor sign-in at launch. It is planned, not shipped.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No real-time co-editing. That is deliberate: it would mean either a server that sees content or a far more complex protocol.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Every claim is a test
&lt;/h2&gt;

&lt;p&gt;A security page is easy to write. What makes &lt;a href="https://lockorg.com" rel="noopener noreferrer"&gt;lockORG&lt;/a&gt;’s claims worth something is that each one is backed by a test that fails when the property breaks: published cryptographic test vectors, an authorisation test covering every API route, generated tests that try to reach across workspaces through every endpoint, tests that search browser storage for secrets after sign-in, and mutation testing on the security-critical code.&lt;/p&gt;

&lt;p&gt;The security model, the threat model and the protocol will all be published. The threat model lists, item by item, the risks that are accepted and cannot be fixed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lockorg.com" rel="noopener noreferrer"&gt;lockORG&lt;/a&gt; will also be open source once a solid foundation is in place and the basic functionality has been brutally tested with early users. Opening the code is not a substitute for good engineering; it is a way to make the engineering inspectable. You will be able to read what the application does, verify the claims against the implementation, and hold us to the promises we make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;When the time is right, we would rather be checked than trusted.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>sass</category>
      <category>security</category>
    </item>
    <item>
      <title>How to Conduct Effective Code Reviews</title>
      <dc:creator>Jakub Gawlik</dc:creator>
      <pubDate>Sun, 05 Jan 2025 14:28:27 +0000</pubDate>
      <link>https://dev.to/jacob_gawlik/how-to-conduct-effective-code-reviews-3dmm</link>
      <guid>https://dev.to/jacob_gawlik/how-to-conduct-effective-code-reviews-3dmm</guid>
      <description>&lt;p&gt;Code reviews are an essential part of the software development process. They ensure that code adheres to best practices, is maintainable, and works as expected. However, conducting an effective code review can be challenging, especially for teams balancing speed and quality. In this article, we’ll explore best practices for code reviews that can help you and your team improve code quality and foster better collaboration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Are Code Reviews Important?
&lt;/h2&gt;

&lt;p&gt;Code reviews help developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify bugs early: Catching errors in code before it reaches production saves time and reduces costly fixes.&lt;/li&gt;
&lt;li&gt;Improve code quality: Reviews help ensure adherence to coding standards, maintainability, and readability.&lt;/li&gt;
&lt;li&gt;Knowledge sharing: Code reviews enable team members to learn from each other’s work and improve their understanding of the codebase.&lt;/li&gt;
&lt;li&gt;Team collaboration: It’s a great opportunity to collaborate, mentor, and keep the entire team aligned on coding practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Focus on the Big Picture, Not Just the Syntax
&lt;/h3&gt;

&lt;p&gt;When conducting code reviews, it’s easy to get caught up in the details—variable names, formatting issues, or small coding quirks. While these things matter, the big picture is even more critical. Focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt;: Is the code designed in a way that scales well? Does it fit within the overall application structure?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logic flow&lt;/strong&gt;: Does the logic make sense? Are there any redundant or overly complex operations that could be simplified?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Will this code create performance bottlenecks? Could it be optimized for speed or memory usage?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By focusing on these high-level concepts first, you can ensure the code works as intended without being distracted by minor issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Be Kind and Constructive with Your Feedback
&lt;/h3&gt;

&lt;p&gt;Giving feedback is one of the most important—and sometimes difficult—parts of code reviews. It’s important to keep the following in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid criticizing the developer, critique the code&lt;/strong&gt;: Say, “This approach could be improved by…” instead of “You did this wrong.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Praise where appropriate&lt;/strong&gt;: Positive feedback on clean code or a smart solution goes a long way in building team morale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be specific&lt;/strong&gt;: Instead of saying, “This doesn’t look right,” explain why something might be a concern. For example, “This loop might cause a performance issue when handling large data sets.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to create a collaborative and supportive environment where everyone can improve.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use Tools to Automate Tedious Parts
&lt;/h3&gt;

&lt;p&gt;Automated tools can handle many of the repetitive and objective parts of a code review, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linting and style enforcement&lt;/strong&gt;: Use tools like ESLint, Prettier, or RuboCop to catch styling issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unit testing&lt;/strong&gt;: Ensure all tests pass before even starting a review. CI tools like Jenkins, CircleCI, or GitHub Actions can automate this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static code analysis&lt;/strong&gt;: Tools like SonarQube or CodeClimate can find common errors, security issues, and performance bottlenecks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By automating these aspects, the human reviewer can focus on more complex and nuanced issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Review Smaller, More Frequent Code Changes
&lt;/h3&gt;

&lt;p&gt;Large pull requests are time-consuming and harder to review effectively. A massive block of code makes it difficult to focus on key areas, and reviewers can easily miss important issues. Encourage frequent, smaller pull requests (PRs). This approach has several benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faster reviews&lt;/strong&gt;: Smaller chunks of code are easier and quicker to review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier to spot issues&lt;/strong&gt;: Reviewers can dive deeper into smaller changes and catch potential problems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less merge conflicts&lt;/strong&gt;: Merging smaller changes more frequently reduces the chance of complicated merge conflicts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make reviewing part of the team’s regular workflow so that it doesn’t build up into unmanageable tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Ask Questions, Don’t Assume
&lt;/h3&gt;

&lt;p&gt;If you’re unsure about a particular piece of code, ask questions rather than assuming the developer made a mistake. This approach leads to better understanding and open dialogue. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Why did you choose this approach?"&lt;/li&gt;
&lt;li&gt;"Could you explain how this method works with the existing feature?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By asking questions, you may uncover a new perspective, or you may point out something that was overlooked. Either way, it promotes healthy collaboration and learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Ensure Test Coverage
&lt;/h3&gt;

&lt;p&gt;Code that isn’t tested properly is a recipe for future bugs. Make sure that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unit tests&lt;/strong&gt; are included to verify individual pieces of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration tests&lt;/strong&gt; are present to ensure new features work well with existing systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge cases&lt;/strong&gt; are considered to avoid unexpected behaviour in uncommon scenarios.
If tests are missing, suggest that the developer add them before approving the review.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Limit Review Time to Stay Focused
&lt;/h3&gt;

&lt;p&gt;Code reviews can be mentally draining, especially if they take too long. Studies show that reviewers are most effective when they spend between &lt;strong&gt;30 and 60 minutes&lt;/strong&gt; reviewing code. After that, attention and focus can drop significantly. Encourage short, focused review sessions to avoid fatigue and ensure better results.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Leave Comments In Context
&lt;/h3&gt;

&lt;p&gt;Most code review platforms, such as GitHub, GitLab, and Bitbucket, allow you to leave comments directly on lines of code. Make sure you’re using this feature to leave &lt;strong&gt;contextual comments&lt;/strong&gt; instead of vague, general feedback. This practice makes it easier for the developer to understand what you’re referring to and speeds up the review process.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Approve Changes with Clear Communication
&lt;/h3&gt;

&lt;p&gt;Once the review is complete, it’s important to communicate your approval or requests clearly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Approve the PR&lt;/strong&gt; if everything looks good.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request changes&lt;/strong&gt; and leave comments detailing the specific areas that need work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leave follow-up instructions&lt;/strong&gt; for what needs to happen next, like adding tests or fixing a specific bug.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clear communication prevents confusion and ensures that reviews move forward smoothly.&lt;/p&gt;




&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Code reviews are a crucial part of producing high-quality software. By focusing on the big picture, offering constructive feedback, leveraging automation, and maintaining regular, manageable reviews, you’ll not only improve the code but also foster a stronger, more collaborative team culture. When done right, code reviews become more than just a task—they become an opportunity for growth and learning.&lt;/p&gt;

</description>
      <category>code</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Fork, Pull, and Push: A Step-by-Step Guide to GitHub</title>
      <dc:creator>Jakub Gawlik</dc:creator>
      <pubDate>Sat, 02 Nov 2024 23:18:01 +0000</pubDate>
      <link>https://dev.to/jacob_gawlik/fork-pull-and-push-a-step-by-step-guide-to-github-aap</link>
      <guid>https://dev.to/jacob_gawlik/fork-pull-and-push-a-step-by-step-guide-to-github-aap</guid>
      <description>&lt;p&gt;&lt;a href="https://caasi.dev/blog/fork-pull-and-push-a-step-by-step-guide-to-github/" rel="noopener noreferrer"&gt;Originally published here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub is the go-to platform for version control, collaboration, and open-source contributions. Whether you’re working on your own project or contributing to someone else’s, mastering the basics of forking, pulling, and pushing is essential. These core concepts allow developers to collaborate efficiently, manage project versions, and contribute to the open-source community.&lt;/p&gt;

&lt;p&gt;In this article, we’ll walk through the process of forking a repository, making changes locally, and pushing those changes back to GitHub, all while using the pull request (PR) workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Forking, Pulling, and Pushing?
&lt;/h2&gt;

&lt;p&gt;Before diving into the guide, it’s important to understand these three terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forking&lt;/strong&gt;: This is the process of creating a personal copy of someone else’s repository. Forking allows you to make changes to a project without affecting the original codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pulling&lt;/strong&gt;: This involves retrieving updates from the original repository (or a remote branch) into your local codebase to ensure you're working with the latest version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pushing&lt;/strong&gt;: Once you’ve made changes to your fork, pushing refers to sending those changes to your remote forked repository on GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these steps form the basic workflow for contributing to a GitHub project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Forking a Repository
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Fork a Repository?
&lt;/h3&gt;

&lt;p&gt;Forking a repository is useful when you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contribute to an open-source project.&lt;/li&gt;
&lt;li&gt;Experiment with the codebase before submitting your changes.&lt;/li&gt;
&lt;li&gt;Create your version of a project that you don’t own.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Fork a Repository:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find the repository&lt;/strong&gt; you want to fork on GitHub.&lt;/li&gt;
&lt;li&gt;In the top-right corner, click the &lt;strong&gt;“Fork”&lt;/strong&gt; button. GitHub will create a copy of the original repository in your GitHub account.&lt;/li&gt;
&lt;li&gt;You now have a forked version of the project that you can modify without affecting the original repository.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Cloning Your Fork Locally
&lt;/h2&gt;

&lt;p&gt;Now that you've forked the repository, you need to clone it to your local machine to make changes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to your forked repository on GitHub.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;“Code”&lt;/strong&gt; button and copy the HTTPS URL.&lt;/li&gt;
&lt;li&gt;Open your terminal or command prompt and run the following command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;your-forked-repository-URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will clone the repository to your local machine.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change to the repository directory:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;repository-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Making Changes Locally
&lt;/h2&gt;

&lt;p&gt;Now that you have the project on your machine, you can start making changes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a new branch&lt;/strong&gt;: It’s best practice to make changes on a separate branch, especially when contributing to a shared project. To create and switch to a new branch, run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; &amp;lt;new-branch-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;new-branch-name&amp;gt;&lt;/code&gt; with a descriptive name for your changes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make your changes&lt;/strong&gt;: Edit files, add new features, or fix bugs in your local environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the status&lt;/strong&gt; of your changes by running:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command shows which files have been modified. 4. &lt;strong&gt;Stage your changes&lt;/strong&gt; for commit by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &amp;lt;file-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, to add all changed files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Committing Your Changes
&lt;/h2&gt;

&lt;p&gt;After making changes and staging them, the next step is to commit those changes locally.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the following command to commit the changes:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Your detailed commit message"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the placeholder text with a meaningful description of the changes you made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Pushing Your Changes to GitHub
&lt;/h2&gt;

&lt;p&gt;Now that you’ve committed the changes locally, you need to push them to your forked repository on GitHub.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;To push your branch to GitHub, run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin &amp;lt;new-branch-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command pushes your changes to your forked repository under the new branch you created. 2. After the push is complete, GitHub will display a link in your repository where you can open a &lt;strong&gt;Pull Request&lt;/strong&gt; (PR).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Creating a Pull Request (PR)
&lt;/h2&gt;

&lt;p&gt;A pull request is the process of notifying the original repository’s maintainers that you’ve made changes and want them to review and potentially merge those changes into the main project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your forked repository on GitHub.&lt;/li&gt;
&lt;li&gt;You’ll see a message prompting you to create a pull request for the branch you just pushed. Click the &lt;strong&gt;“Compare &amp;amp; pull request”&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;In the pull request form:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write a title and description&lt;/strong&gt; of your changes.&lt;/li&gt;
&lt;li&gt;Include any necessary context to help the maintainers understand what your PR addresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Submit the pull request by clicking &lt;strong&gt;“Create pull request.”&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 7: Updating Your Fork with New Changes
&lt;/h2&gt;

&lt;p&gt;Over time, the original repository may receive new commits. It’s important to keep your fork up to date with these changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Syncing Your Fork:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add the original repository as a remote&lt;/strong&gt; in your local repository:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add upstream &amp;lt;original-repository-URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fetch the latest changes&lt;/strong&gt; from the original repository:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch upstream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Merge the changes&lt;/strong&gt; into your local fork:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge upstream/main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;main&lt;/code&gt; with the correct branch name if the project uses a different default branch (e.g., &lt;code&gt;master&lt;/code&gt;).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Push the updated changes&lt;/strong&gt; to your forked repository on GitHub:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Forking, pulling, and pushing are fundamental GitHub concepts that allow developers to contribute to projects in an organised and efficient way. By following this guide, you’ll have the necessary skills to fork repositories, make changes locally, and submit pull requests to contribute to open-source projects or collaborate on private repositories.&lt;/p&gt;

&lt;p&gt;The more you practice this workflow, the more seamless it becomes, making you a more effective and confident contributor to any GitHub project.&lt;/p&gt;

</description>
      <category>github</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
