<?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: kevinbkdev</title>
    <description>The latest articles on DEV Community by kevinbkdev (@kevinbkdev).</description>
    <link>https://dev.to/kevinbkdev</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1254225%2Fe7b41cca-a961-4e5e-bad9-eb48bf73f109.jpeg</url>
      <title>DEV Community: kevinbkdev</title>
      <link>https://dev.to/kevinbkdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kevinbkdev"/>
    <language>en</language>
    <item>
      <title>Software architecture 2025 — My thoughts</title>
      <dc:creator>kevinbkdev</dc:creator>
      <pubDate>Mon, 28 Apr 2025 07:34:46 +0000</pubDate>
      <link>https://dev.to/kevinbkdev/software-architecture-2025-my-thoughts-57kp</link>
      <guid>https://dev.to/kevinbkdev/software-architecture-2025-my-thoughts-57kp</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hello guys,&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s been a long time since my last blog at the end of 2024. Now I’m back with a new series about Software Architecture in 2025 — a year marked by the rapid growth of AI and what seemed like a downturn in tech.&lt;/p&gt;

&lt;p&gt;Despite that, I still believe in the crucial role of humans in building strong and meaningful software with solid architecture.&lt;/p&gt;

&lt;p&gt;At the same time, I’ve noticed how important it is for architecture to align with the business — keeping things simple, fast, and most importantly, delivering real value and revenue. It’s not just about complex technical systems anymore.&lt;/p&gt;

&lt;p&gt;This blog is an overview, sharing some brief insights and personal thoughts on three architectural approaches I've worked with over the past few years. It’s a quick reflection based on my experience with each one. I’ll dive deeper into the details in the next three blog posts, each dedicated to one architecture.&lt;/p&gt;

&lt;h1&gt;
  
  
  I. Mono-repo
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Mono-repo&lt;/strong&gt; (short for &lt;em&gt;monolithic repository&lt;/em&gt;) is a software development strategy where all code for multiple projects, services, or components is stored in a single version-controlled repository.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  1. Context
&lt;/h2&gt;

&lt;p&gt;The idea behind mono-repo is to centralize development efforts. Instead of managing separate repos for each service or module, teams work from a unified codebase. This approach is especially common in large-scale organizations like Google or Meta, where consistency, visibility, and cross-team collaboration are crucial.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Key points
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Centralized tooling:&lt;/strong&gt; Easier to enforce code standards, formatting, and testing workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic changes:&lt;/strong&gt; Developers can update multiple services/modules in a single commit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency management:&lt;/strong&gt; Shared libraries are easier to maintain and upgrade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenges at scale:&lt;/strong&gt; Build times, CI/CD performance, and repo size can become pain points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code ownership:&lt;/strong&gt; Needs clear boundaries and team agreements to avoid conflicts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Personal thoughts
&lt;/h2&gt;

&lt;p&gt;In my experience, mono-repo works best when teams value consistency and tight integration. It's great for early-stage startups or products with shared components. But as the codebase and team grow, without proper tooling and governance, it can become a bottleneck.&lt;br&gt;
Tooling like Nx, Bazel, or Turborepo can really help mitigate scaling issues. Still, the decision to go mono-repo should depend on the team culture, product scope, and growth expectations.&lt;/p&gt;

&lt;h1&gt;
  
  
  II. Microservice
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Microservice&lt;/strong&gt; architecture is a design approach where a system is broken down into small, independent services that communicate over a network — usually via HTTP, gRPC or messaging queues.&lt;/p&gt;

&lt;p&gt;Each microservice is responsible for a specific business capability and can be developed, deployed, and scaled independently.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  1. Context
&lt;/h2&gt;

&lt;p&gt;Microservices became widely popular as a response to the limitations of monolithic architectures. They offer flexibility in choosing tech stacks per service, enable faster team autonomy, and improve scalability. However, they also introduce new layers of complexity — particularly in communication, data consistency, and observability.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Key points
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decoupled services:&lt;/strong&gt; Teams can iterate faster and independently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; Only scale the services that need it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience:&lt;/strong&gt; Failures can be isolated, avoiding total system downtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational overhead:&lt;/strong&gt; Requires robust DevOps practices, observability, and service discovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data management:&lt;/strong&gt; Handling distributed data and eventual consistency is hard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication patterns:&lt;/strong&gt; REST, gRPC, message brokers — choosing the right one matters&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Personal thoughts
&lt;/h2&gt;

&lt;p&gt;Microservices bring a lot of value — when used for the right problems. I've seen them shine in systems with clearly separated domains and fast-moving teams. But I've also seen projects over-engineered with too many services too early, leading to slower development and painful debugging.&lt;br&gt;
In 2025, with better tooling and cloud-native ecosystems (like Kubernetes and service meshes), microservices are more manageable — but still require discipline. Start simple, and split when necessary, not because it’s trendy.&lt;/p&gt;

&lt;h1&gt;
  
  
  III. DDD &amp;amp; hexagon
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Domain-Driven Design (DDD)&lt;/strong&gt; and &lt;strong&gt;Hexagonal Architecture&lt;/strong&gt; are architectural patterns that aim to place business logic at the core of software design — making systems more maintainable, flexible, and aligned with real-world problems.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  1. Context
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DDD&lt;/strong&gt;, introduced by Eric Evans, emphasizes understanding the business domain deeply and modeling it in code. It promotes the use of a &lt;strong&gt;ubiquitous language&lt;/strong&gt; shared between developers and domain experts, and encourages separation of concerns through concepts like entities, value objects, aggregates, and bounded contexts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hexagonal Architecture&lt;/strong&gt; (also known as &lt;em&gt;Ports and Adapters&lt;/em&gt;) complements DDD by structuring code in a way that keeps the domain logic independent of technical concerns. Inputs (like HTTP, CLI, queues) and outputs (like databases or external APIs) are treated as interchangeable adapters — allowing the domain logic to remain clean and testable.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Key points
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Business-centric design:&lt;/strong&gt; The domain is the heart of the system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounded contexts:&lt;/strong&gt; Clear boundaries between different parts of the system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation of concerns:&lt;/strong&gt; Infrastructure and domain layers are isolated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptability:&lt;/strong&gt; Easier to change technology without touching core logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testability:&lt;/strong&gt; Domain logic can be tested without external dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steeper learning curve:&lt;/strong&gt; Requires discipline and upfront modeling effort&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Personal thoughts
&lt;/h2&gt;

&lt;p&gt;DDD and hexagonal architecture changed the way I think about building systems. When applied correctly, they lead to software that's easier to evolve and reason about, especially as the system grows.&lt;br&gt;
But they’re not silver bullets — for small projects or MVPs, the overhead might not be worth it. I’ve found them most effective in complex business domains, where understanding the core logic deeply is critical to success.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;In 2025, building great software isn’t just about using the latest technologies — it’s about choosing the right architecture that fits both the &lt;strong&gt;team's capabilities&lt;/strong&gt; and the &lt;strong&gt;business goals&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mono-repo&lt;/strong&gt; simplifies collaboration and dependency management but needs strong tooling and clear ownership.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt; offer flexibility and scalability, yet come with operational complexity that requires maturity to handle well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DDD &amp;amp; Hexagonal Architecture&lt;/strong&gt; bring clarity to complex systems by focusing on business logic first, but they require a thoughtful, disciplined approach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each approach has its place. There’s no one-size-fits-all. The key is to deeply understand your product, your team, and your long-term vision — and then design your architecture to support that, not the other way around.&lt;/p&gt;

&lt;p&gt;Stay tuned for the upcoming deep-dives into each of these architectures, where I’ll share more lessons, mistakes, and real-world insights from my journey.&lt;/p&gt;

&lt;p&gt;Read more at &lt;a href="https://www.kevinbkdev.blog/en/blog/architecture-2025" rel="noopener noreferrer"&gt;https://www.kevinbkdev.blog/en/blog/architecture-2025&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Maybe you missed these 12 awesome Git commands</title>
      <dc:creator>kevinbkdev</dc:creator>
      <pubDate>Mon, 19 Feb 2024 07:01:50 +0000</pubDate>
      <link>https://dev.to/kevinbkdev/maybe-you-missed-these-12-awesome-git-commands-21bo</link>
      <guid>https://dev.to/kevinbkdev/maybe-you-missed-these-12-awesome-git-commands-21bo</guid>
      <description>&lt;p&gt;In today's development landscape, Git has become an indispensable tool for developers at every level, from newcomers to seasoned professionals. It's a tool we rely on daily, but have you ever wondered about the lesser-known Git commands that could enhance your workflow? &lt;/p&gt;

&lt;p&gt;Let's explore 12 Git commands that might just surprise you with their usefulness and efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Git stash
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Git stash&lt;/code&gt; is useful commands that help you in Git workflows with many branches and many people effectively. In the real world, have ever seen a case that you are developing on the branch and your leader said &lt;em&gt;“hey man, I need your urgent fix on another branch”,&lt;/em&gt; how to save your current version code locally but not make commit?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//save unchange commits
git stash 

//restore commits
git stash pop 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhe0e54wg6wdl4rabbp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhe0e54wg6wdl4rabbp3.png" alt="Cre: Scaler" width="800" height="294"&gt;&lt;/a&gt;Cre: Scaler&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Git diff
&lt;/h2&gt;

&lt;p&gt;In case you need to compare between un-saved changes and the previous commit, &lt;code&gt;git diff&lt;/code&gt; is the command you should know in using Git with commands besides using GUI or Git extension.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Git rebase
&lt;/h2&gt;

&lt;p&gt;Rebasing is a powerful besides on Merge feature in Git with the same purpose but with different methods. The most awesome feature that &lt;code&gt;git rebase&lt;/code&gt; brings is keeping the Git tree clean, straight and avoiding “the diamond shape” in the Git graph.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//checkout branch featuire
git switch feature 

//rebase feature into main
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; main feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzfojcgknvxvqejkf59e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzfojcgknvxvqejkf59e.png" alt="Cre: ByteByteGo" width="800" height="332"&gt;&lt;/a&gt;Cre: ByteByteGo&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Git cherry-pick
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;git cherry-pick&lt;/code&gt; command is used to apply a specific commit from one branch to another. This can be useful when you want to selectively bring in changes from one branch to another without merging the entire branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git cherry-pick &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Git log
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;git log&lt;/code&gt;, you can show all commit logs in Git including commit hash, commit message, commit author, and the date that the commit was committed.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Git commit —amend
&lt;/h2&gt;

&lt;p&gt;If you ask how can I change my commit information, the &lt;code&gt;git commit --amend&lt;/code&gt; is your answer. You can change information of that commit including message and author.&lt;br&gt;
&lt;/p&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;--amend&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"New commit message"&lt;/span&gt; &lt;span class="nt"&gt;--author&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Author Name &amp;lt;email@example.com&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Git tag
&lt;/h2&gt;

&lt;p&gt;Tagging versions in Git using the &lt;code&gt;git tag&lt;/code&gt; command is a common practice to mark significant points in your repository, such as releases or milestones. You can tag commits with version numbers or any other meaningful identifier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v1.0 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Release version 1.0"&lt;/span&gt; &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Git checkout .
&lt;/h2&gt;

&lt;p&gt;In case you need to clean up all changes locally or add code to show logs on the server for tracing errors and hot fixing, &lt;code&gt;git checkout .&lt;/code&gt; is the powerful command that you should know.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Git reset
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git reset&lt;/code&gt; is a powerful command in Git that allows you to reset the current HEAD to a specified state. It's commonly used to undo changes, move the HEAD to a different commit, or unstaged changes.&lt;/p&gt;

&lt;p&gt;If you want to move the HEAD to a specific commit but keep the changes in your working directory and staging area, you can use soft reset. If you want to completely undo the last commit and discard the changes from that commit, use git reset hard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;//soft reset
git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; &amp;lt;commit-hash&amp;gt;

//hard reset
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD^
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Git revert
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git revert&lt;/code&gt; is a command used to create a new commit that undoes the changes made by a specific commit or commits. Unlike &lt;code&gt;git reset&lt;/code&gt;, which alters the commit history, &lt;code&gt;git revert&lt;/code&gt; maintains the history by creating a new commit that undoes the changes introduced by previous commits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert &amp;lt;commit-hash&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. Git remote —prune
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;git remote --prune&lt;/code&gt; command is used to remove any remote-tracking references that no longer exist on the remote repository. Over time, these references can become outdated if branches are deleted or renamed on the remote repository.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;With this command, you can sync up locally with your remote git workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Git filter-branch
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git filter-branch&lt;/code&gt; is a powerful but potentially dangerous command in Git that allows you to rewrite the commit history of a repository. It's typically used to rewrite commits to apply various filters or transformations. &lt;/p&gt;

&lt;p&gt;This command can be useful for tasks such as removing sensitive data from the history, rewriting commit messages, or splitting a repository into multiple repositories.&lt;/p&gt;

&lt;p&gt;For example, in case you need to rewrite the author of commit history in the repository, you can use this command followed in below script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
git filter-branch &lt;span class="nt"&gt;--env-filter&lt;/span&gt; &lt;span class="s1"&gt;'
OLD_EMAIL="your_old_email"
CORRECT_NAME="your_new_name"
CORRECT_EMAIL="your_new_email"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi

if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
'&lt;/span&gt; &lt;span class="nt"&gt;--tag-name-filter&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--branches&lt;/span&gt; &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>programming</category>
      <category>git</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
