<?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: Ikrame Ibn Hayoun</title>
    <description>The latest articles on DEV Community by Ikrame Ibn Hayoun (@ikrame-ih).</description>
    <link>https://dev.to/ikrame-ih</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%2F4053573%2Fb889d5bd-8f22-46c6-b1b7-6b8030ae4287.png</url>
      <title>DEV Community: Ikrame Ibn Hayoun</title>
      <link>https://dev.to/ikrame-ih</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ikrame-ih"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Ikrame Ibn Hayoun</dc:creator>
      <pubDate>Fri, 14 Aug 2026 16:56:03 +0000</pubDate>
      <link>https://dev.to/ikrame-ih/-j7k</link>
      <guid>https://dev.to/ikrame-ih/-j7k</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ikrame-ih/i-kept-seeing-the-same-git-complaint-on-reddit-so-i-wrote-a-small-cli-for-it-1k6i" class="crayons-story__hidden-navigation-link"&gt;I kept seeing the same Git complaint on Reddit, so I wrote a small CLI for it&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ikrame-ih" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4053573%2Fb889d5bd-8f22-46c6-b1b7-6b8030ae4287.png" alt="ikrame-ih profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ikrame-ih" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ikrame Ibn Hayoun
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ikrame Ibn Hayoun
                
                
              
              &lt;div id="story-author-preview-content-4324678" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ikrame-ih" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4053573%2Fb889d5bd-8f22-46c6-b1b7-6b8030ae4287.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ikrame Ibn Hayoun&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ikrame-ih/i-kept-seeing-the-same-git-complaint-on-reddit-so-i-wrote-a-small-cli-for-it-1k6i" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 5&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ikrame-ih/i-kept-seeing-the-same-git-complaint-on-reddit-so-i-wrote-a-small-cli-for-it-1k6i" id="article-link-4324678"&gt;
          I kept seeing the same Git complaint on Reddit, so I wrote a small CLI for it
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/git"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;git&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/development"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;development&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/ikrame-ih/i-kept-seeing-the-same-git-complaint-on-reddit-so-i-wrote-a-small-cli-for-it-1k6i#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Ikrame Ibn Hayoun</dc:creator>
      <pubDate>Fri, 14 Aug 2026 16:44:36 +0000</pubDate>
      <link>https://dev.to/ikrame-ih/-499a</link>
      <guid>https://dev.to/ikrame-ih/-499a</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ikrame-ih/the-blurry-line-between-junior-and-mid-level-from-an-ai-era-developer-5a81" class="crayons-story__hidden-navigation-link"&gt;The blurry line between junior and mid-level, from an AI-era developer&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ikrame-ih" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4053573%2Fb889d5bd-8f22-46c6-b1b7-6b8030ae4287.png" alt="ikrame-ih profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ikrame-ih" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ikrame Ibn Hayoun
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ikrame Ibn Hayoun
                
                
              
              &lt;div id="story-author-preview-content-4349795" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ikrame-ih" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4053573%2Fb889d5bd-8f22-46c6-b1b7-6b8030ae4287.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ikrame Ibn Hayoun&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ikrame-ih/the-blurry-line-between-junior-and-mid-level-from-an-ai-era-developer-5a81" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 8&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ikrame-ih/the-blurry-line-between-junior-and-mid-level-from-an-ai-era-developer-5a81" id="article-link-4349795"&gt;
          The blurry line between junior and mid-level, from an AI-era developer
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/ikrame-ih/the-blurry-line-between-junior-and-mid-level-from-an-ai-era-developer-5a81#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>The blurry line between junior and mid-level, from an AI-era developer</title>
      <dc:creator>Ikrame Ibn Hayoun</dc:creator>
      <pubDate>Sat, 08 Aug 2026 17:37:05 +0000</pubDate>
      <link>https://dev.to/ikrame-ih/the-blurry-line-between-junior-and-mid-level-from-an-ai-era-developer-5a81</link>
      <guid>https://dev.to/ikrame-ih/the-blurry-line-between-junior-and-mid-level-from-an-ai-era-developer-5a81</guid>
      <description>&lt;p&gt;I've been thinking about what being a &lt;em&gt;junior developer&lt;/em&gt; actually means today.&lt;/p&gt;

&lt;p&gt;When ChatGPT came out, I tried it because it was new, but I wasn't really interested in programming yet. Then, one summer, I decided to give a random Python course a try. I enjoyed it, and the following year I started a two-year vocational training program in software development. So AI has been around for pretty much my entire journey into programming.&lt;/p&gt;

&lt;p&gt;I've used it to explain things I didn't understand, give me examples, help me debug, and sometimes write code for me. I remember the first time I asked it to write something and got a working result. It was strange. I had barely started learning, and suddenly I had a tool that could fill in a lot of the gaps for me. This was when ChatGPT was much worse than it is today, with plenty of hallucinations and confidently wrong answers, but it was still enough to make me wonder: &lt;em&gt;how much of this do I actually know?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In a way, we now have a teacher available whenever we need one. You can ask the same question five different ways, get examples, have your code reviewed, or ask why something isn't working. That's an incredible learning tool. And while looking into this, I found that similar reactions happened when frameworks and other abstractions became popular. Some developers saw them as shortcuts or even “cheating”, which reminded me of the current discussion around &lt;strong&gt;vibe coding&lt;/strong&gt;. Maybe this feeling isn't entirely new. Programming has always been about using better abstractions and tools.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Floggauhcqfrn4nis3au9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Floggauhcqfrn4nis3au9.png" alt=" " width="755" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's where I find the distinction between &lt;strong&gt;junior and mid-level&lt;/strong&gt; particularly interesting. AI can make someone with relatively little professional experience much more independent, so where exactly does the line sit?&lt;/p&gt;

&lt;p&gt;Is it how well you perform on a DSA problem? How you answer technical questions in an interview? How much you can build without help? All of these things can be practiced, prepared, and increasingly assisted by tools.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fexknr18p1hwf21av7csh.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fexknr18p1hwf21av7csh.gif" alt="GIF" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I kept seeing the same Git complaint on Reddit, so I wrote a small CLI for it</title>
      <dc:creator>Ikrame Ibn Hayoun</dc:creator>
      <pubDate>Wed, 05 Aug 2026 17:56:39 +0000</pubDate>
      <link>https://dev.to/ikrame-ih/i-kept-seeing-the-same-git-complaint-on-reddit-so-i-wrote-a-small-cli-for-it-1k6i</link>
      <guid>https://dev.to/ikrame-ih/i-kept-seeing-the-same-git-complaint-on-reddit-so-i-wrote-a-small-cli-for-it-1k6i</guid>
      <description>&lt;p&gt;I was reading Reddit threads about Git annoyances — not big architecture debates, just the little things that waste time. One kept coming up: merge conflicts that are only &lt;code&gt;import&lt;/code&gt; lines at the top of a Python file.&lt;/p&gt;

&lt;p&gt;Someone on one branch adds &lt;code&gt;import os&lt;/code&gt;. Someone else adds &lt;code&gt;import math&lt;/code&gt;. Same file, same place. Git treats it like a real conflict, and you end up deleting conflict markers by hand even though you just want both imports.&lt;/p&gt;

&lt;p&gt;The cover image is a quick sketch I made in Excalidraw while figuring out the flow: conflict in → one command → clean imports out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I looked at
&lt;/h2&gt;

&lt;p&gt;Before writing anything, I checked how this is usually handled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/pull-requests/how-tos/merge-and-close-pull-requests/resolving-a-merge-conflict-using-the-command-line" rel="noopener noreferrer"&gt;GitHub's official guide&lt;/a&gt; walks you through opening the file and fixing markers by hand. That is the right approach for real logic conflicts. It is just slow when the conflict is only imports.&lt;/li&gt;
&lt;li&gt;Common Stack Overflow answers push &lt;code&gt;git checkout --ours&lt;/code&gt; or &lt;code&gt;--theirs&lt;/code&gt;. That keeps one side and throws away the other — so you can delete an import your teammate still needs.&lt;/li&gt;
&lt;li&gt;Formatters like isort, ruff, and Black help keep imports tidy, but they fail while conflict markers are still in the file.&lt;/li&gt;
&lt;li&gt;There are heavier tools too (structural merge drivers, LLM helpers) if you want that trade-off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I could not find a small local command that only handles this case, so I wrote one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;import-resolve-cli
import-resolve-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt; (Git still conflicted):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;import json
&lt;/span&gt;&lt;span class="gd"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
&lt;/span&gt;&lt;span class="p"&gt;import os
&lt;/span&gt;&lt;span class="gh"&gt;=======
&lt;/span&gt;&lt;span class="p"&gt;import math
&lt;/span&gt;&lt;span class="gi"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="p"&gt;print(json.dumps({"ok": True}))
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt; (both imports kept, markers gone):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you run it with no file paths, it asks Git for conflicted &lt;code&gt;.py&lt;/code&gt; files. There is also &lt;code&gt;--dry-run&lt;/code&gt;, &lt;code&gt;--check&lt;/code&gt;, and an optional &lt;code&gt;--install-hook&lt;/code&gt; that registers a merge driver for this repo only (not your global Git config).&lt;/p&gt;
&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;It only rewrites a conflict block when every non-blank line on both sides is a single-line &lt;code&gt;import&lt;/code&gt; / &lt;code&gt;from&lt;/code&gt; or a comment. Anything else is skipped with a reason — including multiline imports, indented imports, and logic mixed into the same block. Conflicts further down the file stay for you.&lt;/p&gt;

&lt;p&gt;That is intentional. I wanted help with the mechanical part, not a tool that tries to merge real code for me.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Out of scope&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Business-logic conflicts&lt;/td&gt;
&lt;td&gt;Needs human intervention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiline import blocks&lt;/td&gt;
&lt;td&gt;Too easy to corrupt; skipped with a warning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full isort/ruff style&lt;/td&gt;
&lt;td&gt;Run your formatter after; sorting here is simple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JS/TS imports&lt;/td&gt;
&lt;td&gt;Possible later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config files&lt;/td&gt;
&lt;td&gt;No config by design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/ikrame-ih/import-resolve-cli" rel="noopener noreferrer"&gt;github.com/ikrame-ih/import-resolve-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/import-resolve-cli/" rel="noopener noreferrer"&gt;pypi.org/project/import-resolve-cli&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ikrame-ih" rel="noopener noreferrer"&gt;
        ikrame-ih
      &lt;/a&gt; / &lt;a href="https://github.com/ikrame-ih/import-resolve-cli" rel="noopener noreferrer"&gt;
        import-resolve-cli
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;import-resolve-cli&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/ikrame-ih/import-resolve-cli/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/ikrame-ih/import-resolve-cli/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/import-resolve-cli/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d8cf901f7515d7ad1b5b92e1194fde93709481c36531a612d2c28eabcbe08cd1/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f696d706f72742d7265736f6c76652d636c692e7376673f6c6f676f3d70797069266c6f676f436f6c6f723d7768697465" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/import-resolve-cli/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/22657fe289f96f70e2c5b3d1f0e15a5ad9a3350ae626bd9640158348148f85f0/68747470733a2f2f696d672e736869656c64732e696f2f707970692f707976657273696f6e732f696d706f72742d7265736f6c76652d636c692e7376673f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ikrame-ih/import-resolve-cli/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Resolve Git merge conflicts that only touch Python import lines.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ git merge feature-branch
CONFLICT (content): Merge conflict in app.py
$ import-resolve-cli
[ok] app.py: resolved 1 import conflict
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install import-resolve-cli&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Python 3.9+, no runtime dependencies.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Example&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Two branches each added an import. Git left this:&lt;/p&gt;
&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;json&lt;/span&gt;
&lt;span class="pl-c1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="pl-c1"&gt;HEAD&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;os&lt;/span&gt;
&lt;span class="pl-c1"&gt;==&lt;/span&gt;&lt;span class="pl-c1"&gt;==&lt;/span&gt;&lt;span class="pl-c1"&gt;==&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;math&lt;/span&gt;
&lt;span class="pl-c1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-c1"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-s1"&gt;feature&lt;/span&gt;&lt;span class="pl-c1"&gt;-&lt;/span&gt;&lt;span class="pl-s1"&gt;a&lt;/span&gt;

&lt;span class="pl-en"&gt;print&lt;/span&gt;(&lt;span class="pl-s1"&gt;json&lt;/span&gt;.&lt;span class="pl-c1"&gt;dumps&lt;/span&gt;({&lt;span class="pl-s"&gt;'ok'&lt;/span&gt;: &lt;span class="pl-c1"&gt;True&lt;/span&gt;}))&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;After &lt;code&gt;import-resolve-cli&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;json&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;math&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;os&lt;/span&gt;

&lt;span class="pl-en"&gt;print&lt;/span&gt;(&lt;span class="pl-s1"&gt;json&lt;/span&gt;.&lt;span class="pl-c1"&gt;dumps&lt;/span&gt;({&lt;span class="pl-s"&gt;'ok'&lt;/span&gt;: &lt;span class="pl-c1"&gt;True&lt;/span&gt;}))&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Same example as files in &lt;a href="https://github.com/ikrame-ih/import-resolve-cli/docs/examples/" rel="noopener noreferrer"&gt;&lt;code&gt;docs/examples/&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;import-resolve-cli                 &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; every conflicted .py file reported by git&lt;/span&gt;
import-resolve-cli app.py utils.py &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; specific files&lt;/span&gt;
import-resolve-cli --dry-run       &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; print the diff, write nothing&lt;/span&gt;
import-resolve-cli --check         &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; exit 1 if conflict markers remain&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Exit codes: &lt;code&gt;0&lt;/code&gt; done, &lt;code&gt;1&lt;/code&gt; conflicts left for you, &lt;code&gt;2&lt;/code&gt; usage…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ikrame-ih/import-resolve-cli" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Python 3.9+, no runtime dependencies. If you try it on a real conflict and something looks off, I would be glad to hear about it in an issue.&lt;/p&gt;

&lt;p&gt;If this saves you a few minutes, a star on the repo helps others find it!&lt;/p&gt;

</description>
      <category>python</category>
      <category>git</category>
      <category>opensource</category>
      <category>development</category>
    </item>
  </channel>
</rss>
