<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Merge on kenji.blog</title><link>http://kenji.blog/hi/tags/merge/</link><description>Recent content in Merge on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 09:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/tags/merge/index.xml" rel="self" type="application/rss+xml"/><item><title>【Git कमांड】rebase और merge के बीच का अंतर, और व्यवहार में इनका सही उपयोग कैसे करें</title><link>http://kenji.blog/hi/p/git-rebase-vs-merge-practical-guide/</link><pubDate>Sun, 13 Sep 2026 09:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/git-rebase-vs-merge-practical-guide/</guid><description>&lt;img src="http://kenji.blog/p/git-rebase-vs-merge-practical-guide/img/eyecatch.jpg" alt="Featured image of post 【Git कमांड】rebase और merge के बीच का अंतर, और व्यवहार में इनका सही उपयोग कैसे करें" />&lt;h1 id="1-परचय-merge-य-rebase-हमश-एक-बहस-क-वषय-कय-ह">1. परिचय: &amp;ldquo;merge या rebase&amp;rdquo; हमेशा एक बहस का विषय क्यों है?
&lt;/h1>&lt;p>Git आधुनिक सॉफ़्टवेयर विकास में एक अपरिहार्य वर्ज़न कंट्रोल सिस्टम है। जब कई डेवलपर्स एक साथ कोडबेस में परिवर्तन करते हैं, तो Git का शक्तिशाली ब्रांच मॉडल अपनी ताकत दिखाता है। हालाँकि, टीम डेवलपमेंट में &amp;ldquo;क्या &lt;code>merge&lt;/code> या &lt;code>rebase&lt;/code> का उपयोग करना चाहिए&amp;rdquo; यह चर्चा हमेशा शुरुआती लोगों से लेकर अनुभवी डेवलपर्स तक को परेशान करने वाले विषयों में से एक रही है।&lt;/p>
&lt;p>इस लेख में, हम Git की आंतरिक संरचना, जैसे DAG (Directed Acyclic Graph) और कमिट हैश के गणितीय गुणों से शुरू करते हुए, &lt;code>git merge&lt;/code> और &lt;code>git rebase&lt;/code> के मैकेनिज़्म के बीच के अंतर को गहराई से समझेंगे। इसके अलावा, हम व्यावहारिक वर्कफ़्लो के साथ विस्तार से बताएंगे कि वास्तविक काम में इनका सही तरीके से उपयोग कैसे किया जाए। केवल कमांड्स के परिचय से आगे बढ़कर, बैकग्राउंड में Git किस तरह की गणनाएँ कर रहा है, यह समझने से आपका कॉन्फ्लिक्ट (टकराव) का डर खत्म हो जाएगा और आप एक साफ़ और ट्रैक करने योग्य इतिहास (history) बना सकेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="2-git-क-आतरक-सरचन-कमट-हश-और-ऑबजकट-मडल">2. Git की आंतरिक संरचना: कमिट हैश और ऑब्जेक्ट मॉडल
&lt;/h1>&lt;p>Git इतिहास को कैसे इंटीग्रेट (एकीकृत) करता है, इसे समझने के लिए पहले यह जानना ज़रूरी है कि Git डेटा को कैसे सेव करता है। Git केवल फ़ाइल में बदलावों के अंतर (पैच) को सेव नहीं करता है, बल्कि यह किसी विशिष्ट समय पर पूरे फ़ाइल सिस्टम के स्नैपशॉट को सेव करता है।&lt;/p>
&lt;h2 id="21-कमट-हश-क-करपटगरफक-गण">2.1 कमिट हैश के क्रिप्टोग्राफ़िक गुण
&lt;/h2>&lt;p>Git का प्रत्येक कमिट इसके कंटेंट के आधार पर कैलकुलेट किए गए SHA-1 (Secure Hash Algorithm 1) हैश फ़ंक्शन द्वारा 40-अंकीय हेक्साडेसिमल संख्या से विशिष्ट रूप से पहचाना जाता है। कमिट ऑब्जेक्ट में निम्नलिखित तत्व (elements) होते हैं:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Tree ऑब्जेक्ट का पॉइंटर&lt;/strong>: उस समय के डायरेक्टरी स्ट्रक्चर और फ़ाइल (Blob) का स्नैपशॉट।&lt;/li>
&lt;li>&lt;strong>पैरेंट कमिट का पॉइंटर&lt;/strong>: एक या अधिक पैरेंट कमिट्स के हैश मान (पहले कमिट का कोई पैरेंट नहीं होता है, और मर्ज कमिट के 2 या अधिक पैरेंट होते हैं)।&lt;/li>
&lt;li>&lt;strong>लेखक की जानकारी (Author)&lt;/strong>: वह व्यक्ति जिसने कोड लिखा है और उसका समय।&lt;/li>
&lt;li>&lt;strong>कमिटर की जानकारी (Committer)&lt;/strong>: वह व्यक्ति जिसने कमिट बनाया/लागू किया है और उसका समय।&lt;/li>
&lt;li>&lt;strong>कमिट मैसेज&lt;/strong>: बदलाव के उद्देश्य को स्पष्ट करने वाला टेक्स्ट।&lt;/li>
&lt;/ol>
&lt;p>गणितीय रूप से व्यक्त करें, तो कमिट ऑब्जेक्ट $C$ के लिए हैश मान $H(C)$ को इस प्रकार परिभाषित किया गया है:&lt;/p>
$$
H(C) = \text{SHA-1}( \text{tree} \parallel \text{parent} \parallel \text{author} \parallel \text{committer} \parallel \text{message} )
$$&lt;p>यहाँ, $\parallel$ डेटा के संयोजन को दर्शाता है। हैश फ़ंक्शन की विशेषताओं के कारण, भले ही कमिट मैसेज में एक अक्षर बदल दिया जाए, या पैरेंट कमिट अलग हो, पूरी तरह से अलग हैश मान उत्पन्न होता है। दूसरे शब्दों में, &lt;strong>कमिट अपरिवर्तनीय (Immutable) होते हैं&lt;/strong>। बाद में जिस &lt;code>rebase&lt;/code> का वर्णन &amp;ldquo;इतिहास को फिर से लिखने&amp;rdquo; के रूप में किया गया है, वह वास्तव में &amp;ldquo;एक नया कमिट बना रहा है जिसकी सामग्री समान है लेकिन हैश मान अलग है।&amp;rdquo;&lt;/p>
&lt;p>हैश स्पेस का आकार $2^{160}$ है, और टकराव की संभावना (Collision) (यह संभावना कि विभिन्न कमिट्स का हैश मान समान होगा) $P$ को बर्थडे पैराडॉक्स (Birthday Paradox) थ्योरी का उपयोग करके इस प्रकार अनुमानित किया जा सकता है ($n$ कमिट्स की संख्या है):&lt;/p>
$$
P(\text{collision}) \approx 1 - \exp\left(-\frac{n^2}{2 \times 2^{160}}\right)
$$&lt;p>यह संभावना बहुत ही कम है, और व्यावहारिक रूप से यह लगभग असंभव है कि Git का कमिट हैश आपस में टकराए।&lt;/p>
&lt;hr>
&lt;h1 id="3-गरफ-थयर-और-dag-git-इतहस-क-गणतय-मडल">3. ग्राफ़ थ्योरी और DAG: Git इतिहास का गणितीय मॉडल
&lt;/h1>&lt;p>Git के कमिट इतिहास को ग्राफ़ थ्योरी में &amp;ldquo;डायरेक्टेड एसाइक्लिक ग्राफ़ (Directed Acyclic Graph, DAG)&amp;rdquo; के रूप में मॉडल किया गया है।&lt;/p>
&lt;h2 id="31-dag-डयरकटड-एसइकलक-गरफ-कय-ह">3.1 DAG (डायरेक्टेड एसाइक्लिक ग्राफ़) क्या है?
&lt;/h2>&lt;p>ग्राफ़ $G = (V, E)$ में, $V$ कमिट्स (Vertices) का सेट है, और $E$ कमिट्स के बीच पैरेंट-चाइल्ड संबंध को दर्शाने वाले डायरेक्टेड एजेज़ (Directed Edges) का सेट है। Git में, एजेज़ की दिशा &amp;ldquo;चाइल्ड कमिट से पैरेंट कमिट&amp;rdquo; की ओर होती है। ऐसा इसलिए है क्योंकि नए कमिट पिछले कमिट का पॉइंटर रखते हैं।&lt;/p>
&lt;pre class="mermaid">
graph BT
A[&amp;#34;कमिट A (प्रारंभिक)&amp;#34;]
B[&amp;#34;कमिट B&amp;#34;]
C[&amp;#34;कमिट C (Main)&amp;#34;]
D[&amp;#34;कमिट D (Feature)&amp;#34;]
E[&amp;#34;कमिट E (Merge)&amp;#34;]
B --&amp;gt; A
C --&amp;gt; B
D --&amp;gt; B
E --&amp;gt; C
E --&amp;gt; D
&lt;/pre>
&lt;p>DAG की सबसे बड़ी विशेषता यह है कि &amp;ldquo;इसमें कोई चक्र (Cycle) नहीं होता है&amp;rdquo;। इस वजह से, कमिट इतिहास को पीछे ट्रेस करने वाला एल्गोरिदम कभी भी अनंत लूप में नहीं फँसता है, और यह निश्चित रूप से अंत (प्रारंभिक कमिट) तक पहुँच सकता है।&lt;/p>
&lt;h2 id="32-टपलजकल-सरट-और-इतहस-क-करम">3.2 टोपोलॉजिकल सॉर्ट और इतिहास का क्रम
&lt;/h2>&lt;p>जब Git के &lt;code>git log&lt;/code> कमांड आदि का उपयोग करके इतिहास प्रदर्शित किया जाता है, तो DAG को टोपोलॉजिकल सॉर्ट (Topological Sort) एल्गोरिदम का उपयोग करके एक 1-आयामी (1-dimensional) सूची के रूप में क्रमित किया जाता है। DAG में किसी भी डायरेक्टेड एज $u \to v$ ($u$, $v$ का चाइल्ड है) के लिए, यह इस तरह से पुनर्व्यवस्थित होता है कि सूची में $u$, $v$ से पहले आए।&lt;/p>
&lt;hr>
&lt;h1 id="4-git-merge-क-मकनजम-और-परकर">4. git merge का मैकेनिज़्म और प्रकार
&lt;/h1>&lt;p>ब्रांच के बदलावों को इंटीग्रेट करने के लिए सबसे बुनियादी कमांड &lt;code>git merge&lt;/code> है। हालाँकि, वर्तमान स्थिति के आधार पर, Git स्वचालित रूप से अलग-अलग मर्ज रणनीतियों का चयन करता है।&lt;/p>
&lt;h2 id="41-fast-forward-मरज---ff">4.1 Fast-Forward मर्ज (&amp;ndash;ff)
&lt;/h2>&lt;p>यदि लक्ष्य (जैसे: &lt;code>main&lt;/code>) ब्रांच सोर्स (जैसे: &lt;code>feature&lt;/code>) ब्रांच का प्रत्यक्ष पूर्वज (direct ancestor) है, तो Git &amp;ldquo;Fast-Forward&amp;rdquo; (तेज़ी से आगे बढ़ाना) मर्ज को निष्पादित करता है। यह एक ऐसा ऑपरेशन है जो नया कमिट नहीं बनाता है, बल्कि यह बस ब्रांच पॉइंटर को आगे बढ़ाता है।&lt;/p>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;A&amp;#34;
commit id: &amp;#34;B&amp;#34;
branch feature
checkout feature
commit id: &amp;#34;C&amp;#34;
commit id: &amp;#34;D&amp;#34;
checkout main
merge feature
&lt;/pre>
&lt;p>Fast-Forward मर्ज इतिहास को एक सीधी रेखा में रखता है, लेकिन इसका एक नुकसान यह है कि &amp;ldquo;कौन से कमिट्स का समूह एक फीचर (feature) के विकास के रूप में एक साथ था&amp;rdquo;, इसका संदर्भ (Context) खो जाता है।&lt;/p>
&lt;h2 id="42-non-fast-forward-मरज---no-ff">4.2 Non-Fast-Forward मर्ज (&amp;ndash;no-ff)
&lt;/h2>&lt;p>यदि आप स्पष्ट रूप से &lt;code>git merge --no-ff&lt;/code> निर्दिष्ट करते हैं, तो भले ही Fast-Forward संभव हो, यह हमेशा एक नया &amp;ldquo;मर्ज कमिट&amp;rdquo; बनाएगा। मर्ज कमिट 2 पैरेंट्स वाला एक विशेष कमिट होता है।&lt;/p>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;A&amp;#34;
commit id: &amp;#34;B&amp;#34;
branch feature
checkout feature
commit id: &amp;#34;C&amp;#34;
commit id: &amp;#34;D&amp;#34;
checkout main
commit id: &amp;#34;Main Work 1&amp;#34;
merge feature type: NORMAL
&lt;/pre>
&lt;p>इस पद्धति का लाभ यह है कि फीचर ब्रांच का अस्तित्व और इतिहास DAG पर स्पष्ट रूप से रहता है। जब कोई समस्या उत्पन्न होती है, तो आप &lt;code>git revert -m 1 &amp;lt;मर्ज कमिट का हैश&amp;gt;&lt;/code> चलाकर पूरे फीचर को एक ही बार में सुरक्षित रूप से पूर्ववत (रिवर्ट) कर सकते हैं।&lt;/p>
&lt;h2 id="43-3-व-मरज-3-way-merge-एलगरदम">4.3 3-वे मर्ज (3-Way Merge) एल्गोरिदम
&lt;/h2>&lt;p>जब लक्ष्य ब्रांच और सोर्स ब्रांच दोनों के अपने स्वयं के कमिट होते हैं, तो Git 3-वे मर्ज निष्पादित करता है। इस समय, Git DAG को खोजता है और दोनों ब्रांचों के &amp;ldquo;न्यूनतम सामान्य पूर्वज (Lowest Common Ancestor, LCA)&amp;rdquo; का पता लगाता है।&lt;/p>
&lt;p>LCA खोजने के लिए एल्गोरिदम की कम्प्यूटेशनल जटिलता (Computational Complexity) $T_{\text{LCA}}$ को वर्टिसेस की संख्या $|V|$ और एजेज़ की संख्या $|E|$ के सापेक्ष रैखिक समय (Linear Time) में निष्पादित किया जा सकता है:&lt;/p>
$$
T_{\text{LCA}} = \mathcal{O}(|V| + |E|)
$$&lt;p>Git तीन चीजों की तुलना करता है: &amp;ldquo;LCA की स्थिति&amp;rdquo;, &amp;ldquo;वर्तमान ब्रांच की स्थिति&amp;rdquo;, और &amp;ldquo;दूसरी ब्रांच की स्थिति&amp;rdquo;, और यदि परिवर्तनों में कोई टकराव (conflict) नहीं होता है, तो यह स्वचालित रूप से एक मर्ज कमिट उत्पन्न करता है।&lt;/p>
&lt;hr>
&lt;h1 id="5-git-rebase-क-मकनजम-और-इतहस-क-पनरनरमण">5. git rebase का मैकेनिज़्म और इतिहास का पुनर्निर्माण
&lt;/h1>&lt;p>जबकि &lt;code>git merge&lt;/code> इतिहास को &amp;ldquo;एकीकृत (Integrate)&amp;rdquo; करता है, &lt;code>git rebase&lt;/code> इतिहास का &amp;ldquo;पुनर्निर्माण (Rebuild)&amp;rdquo; करता है।&lt;/p>
&lt;h2 id="51-rebase-क-पछ-क-करयपरणल">5.1 Rebase के पीछे की कार्यप्रणाली
&lt;/h2>&lt;p>जब आप &lt;code>feature&lt;/code> ब्रांच को &lt;code>main&lt;/code> ब्रांच में रिबेस करते हैं (&lt;code>git rebase main&lt;/code>), तो आंतरिक कार्यप्रणाली इस प्रकार होती है:&lt;/p>
&lt;ol>
&lt;li>&lt;code>feature&lt;/code> ब्रांच और &lt;code>main&lt;/code> ब्रांच के सामान्य पूर्वज (LCA) का पता लगाएं।&lt;/li>
&lt;li>LCA से लेकर &lt;code>feature&lt;/code> ब्रांच के शीर्ष तक के कमिट्स के अंतर को एक अस्थायी क्षेत्र (Temporary Area) में सेव करें।&lt;/li>
&lt;li>&lt;code>feature&lt;/code> ब्रांच के पॉइंटर को &lt;code>main&lt;/code> ब्रांच के शीर्ष (Tip) पर ले जाएं।&lt;/li>
&lt;li>सहेजे गए अंतरों को एक-एक करके नए बेस (&lt;code>main&lt;/code> के शीर्ष) पर क्रमिक रूप से लागू (Cherry-Pick) करें, और नए कमिट्स बनाएं।&lt;/li>
&lt;/ol>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;कमिट A&amp;#34;] --&amp;gt; B[&amp;#34;कमिट B&amp;#34;]
B --&amp;gt; C[&amp;#34;कमिट C (Main)&amp;#34;]
B --&amp;gt; D[&amp;#34;कमिट D (पुराना फीचर)&amp;#34;]
D -.-&amp;gt; E[&amp;#34;कमिट D&amp;#39; (नया फीचर)&amp;#34;]
C --&amp;gt; E
style D stroke-dasharray: 5 5, fill: #f9f9f9, color: #999
&lt;/pre>
&lt;p>यहाँ सबसे महत्वपूर्ण बात यह है कि रिबेस द्वारा उत्पन्न कमिट $D'$, मूल कमिट $D$ से &lt;strong>एक अलग पैरेंट कमिट होने के कारण, पूरी तरह से अलग हैश मान रखता है&lt;/strong> (ऊपर उल्लिखित हैश फ़ंक्शन परिभाषा $H(C)$ देखें)।&lt;/p>
&lt;h2 id="52-इटरएकटव-रबस-interactive-rebase">5.2 इंटरएक्टिव रिबेस (Interactive Rebase)
&lt;/h2>&lt;p>&lt;code>git rebase -i&lt;/code> (या &lt;code>--interactive&lt;/code>) का उपयोग करके, आप अपनी इच्छानुसार कमिट इतिहास में हेरफेर कर सकते हैं। स्थानीय (Local) इतिहास को व्यवस्थित करने के लिए यह सबसे शक्तिशाली टूल है।&lt;/p>
&lt;ul>
&lt;li>&lt;code>pick&lt;/code> : कमिट को वैसे ही अपनाएं।&lt;/li>
&lt;li>&lt;code>reword&lt;/code> : केवल कमिट मैसेज को संशोधित करें।&lt;/li>
&lt;li>&lt;code>edit&lt;/code> : कमिट के कंटेंट को संशोधित करने के लिए रुकें।&lt;/li>
&lt;li>&lt;code>squash&lt;/code> : इस कमिट को पिछले कमिट के साथ मिलाएँ, और संदेशों को भी जोड़ें।&lt;/li>
&lt;li>&lt;code>fixup&lt;/code> : &lt;code>squash&lt;/code> के समान, लेकिन इस कमिट के मैसेज को हटा दें।&lt;/li>
&lt;li>&lt;code>drop&lt;/code> : कमिट को पूरी तरह से हटा दें।&lt;/li>
&lt;/ul>
&lt;p>गणितीय दृष्टिकोण से देखें तो, यदि किसी ब्रांच में $N$ कमिट हैं, तो रिबेस के क्रम को बदलकर उत्पन्न किए जा सकने वाले रैखिक इतिहास के रूपों (Permutations) $P$ की गणना इस प्रकार है:&lt;/p>
$$
P = N!
$$&lt;p>Git डेवलपर्स को $N!$ तरीकों की स्वतंत्रता देता है, जिससे वे अपने इतिहास को एक तार्किक और सुंदर स्थिति में रख सकते हैं।&lt;/p>
&lt;hr>
&lt;h1 id="6-रबस-क-सनहर-नयम-the-golden-rule-of-rebase">6. रिबेस का सुनहरा नियम (The Golden Rule of Rebase)
&lt;/h1>&lt;p>&lt;code>rebase&lt;/code> बहुत शक्तिशाली है, लेकिन इसका एक निरपेक्ष नियम (Absolute Rule) है:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>&amp;ldquo;सार्वजनिक (Public) किए गए इतिहास पर कभी भी रिबेस (Rebase) न करें&amp;rdquo;&lt;/strong>
&lt;em>(Never rebase public history)&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;h2 id="61-सरवजनक-इतहस-क-रबस-कय-नह-करन-चहए">6.1 सार्वजनिक इतिहास को रिबेस क्यों नहीं करना चाहिए?
&lt;/h2>&lt;p>Git एक डिस्ट्रिब्यूटेड (Distributed) सिस्टम है। आपने जो कमिट &lt;code>origin/main&lt;/code> पर पुश किए हैं, उन्हें अन्य डेवलपर्स के स्थानीय रिपॉजिटरी में भी क्लोन (प्रतिलिपि) किया गया है। अगर आप पहले से ही पुश किए गए कमिट्स को रिबेस करके इतिहास को फिर से लिखते हैं और &lt;code>git push --force&lt;/code> का उपयोग करके इसे जबरन ओवरराइट करते हैं, तो क्या होगा?&lt;/p>
&lt;p>अन्य डेवलपर्स के स्थानीय (Local) DAG और रिमोट (Remote) DAG मौलिक रूप से अलग हो जाएंगे। जब अन्य डेवलपर &lt;code>git pull&lt;/code> निष्पादित करते हैं, तो Git अलग-अलग इतिहास वाले कमिट्स को जबरन मर्ज करने का प्रयास करेगा, जिससे भारी मात्रा में कॉन्फ्लिक्ट्स और डुप्लिकेट कमिट्स (समान परिवर्तन लेकिन अलग-अलग हैश वाले कमिट) उत्पन्न होंगे, और रिपॉजिटरी में अफरा-तफरी मच जाएगी।&lt;/p>
&lt;p>यह एक सख्त नियम है कि रिबेस केवल &lt;strong>&amp;ldquo;उन स्थानीय ब्रांचों पर किया जाना चाहिए जिन्हें अभी तक किसी के साथ साझा नहीं किया गया है&amp;rdquo;&lt;/strong>।&lt;/p>
&lt;hr>
&lt;h1 id="7-कनफलकट-टकरव-क-समधन-और-git-rebase---continue">7. कॉन्फ्लिक्ट (टकराव) का समाधान और git rebase &amp;ndash;continue
&lt;/h1>&lt;p>जब कई लोग एक ही फ़ाइल के एक ही हिस्से में बदलाव करते हैं, तो कॉन्फ्लिक्ट होता है। &lt;code>merge&lt;/code> और &lt;code>rebase&lt;/code> में कॉन्फ्लिक्ट को हल करने की प्रक्रिया अलग-अलग होती है।&lt;/p>
&lt;h2 id="71-merge-म-कनफलकट-क-समधन">7.1 Merge में कॉन्फ्लिक्ट का समाधान
&lt;/h2>&lt;p>&lt;code>git merge&lt;/code> के मामले में, कॉन्फ्लिक्ट का समाधान &lt;strong>केवल एक बार&lt;/strong> होता है। आप अंतिम मर्ज कमिट बनाने से ठीक पहले सभी टकराव वाले हिस्सों को एक ही बार में ठीक करते हैं।&lt;/p>
&lt;h2 id="72-rebase-म-कनफलकट-क-समधन">7.2 Rebase में कॉन्फ्लिक्ट का समाधान
&lt;/h2>&lt;p>&lt;code>git rebase&lt;/code> के मामले में, कमिट्स को एक-एक करके फिर से लागू करने की प्रकृति के कारण, &lt;strong>प्रत्येक कमिट पर कॉन्फ्लिक्ट होने की संभावना&lt;/strong> होती है।&lt;/p>
&lt;p>यदि रिबेस के दौरान कोई कॉन्फ्लिक्ट होता है, तो Git प्रक्रिया को रोक देगा। समाधान का प्रवाह (Flow) इस प्रकार है:&lt;/p>
&lt;ol>
&lt;li>एडिटर या IDE (जैसे VS Code) खोलें और कॉन्फ्लिक्ट मार्कर्स (&lt;code>&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code> , &lt;code>======&lt;/code>, और &lt;code>&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code>) को मैन्युअल रूप से ठीक करें।&lt;/li>
&lt;li>संशोधित फ़ाइल को इंडेक्स में जोड़ें:
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git add &amp;lt;संशोधित_फ़ाइल&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>बिना कोई कमिट बनाए रिबेस प्रक्रिया फिर से शुरू करें:
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git rebase --continue
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>यदि आप रिबेस को रद्द करना चाहते हैं और मूल स्थिति में वापस लौटना चाहते हैं, तो यह कमांड चलाएँ:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git rebase --abort
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>(* यदि आपको कॉन्फ्लिक्ट को हल करने की आवश्यकता नहीं है और आप उस कमिट को पूरी तरह से छोड़ना चाहते हैं, तो &lt;code>git rebase --skip&lt;/code> का उपयोग करें।)&lt;/p>
&lt;hr>
&lt;h1 id="8-वयवहरक-रप-स-सह-उपयग-वरकफल-परकटस">8. व्यावहारिक रूप से सही उपयोग (वर्कफ़्लो प्रैक्टिस)
&lt;/h1>&lt;p>तो, वास्तविक विकास के वातावरण में आपको &lt;code>merge&lt;/code> और &lt;code>rebase&lt;/code> का उपयोग कैसे करना चाहिए? यहाँ हम सबसे मानक (Standard) और सुरक्षित दृष्टिकोण प्रस्तुत कर रहे हैं।&lt;/p>
&lt;h2 id="81-परदशय-1-सथनय-करय-इतहस-क-वयवसथत-करन-rebase-क-उपयग">8.1 [परिदृश्य 1] स्थानीय कार्य इतिहास को व्यवस्थित करना (Rebase का उपयोग)
&lt;/h2>&lt;p>मान लीजिए कि किसी फीचर ब्रांच में विकास के दौरान बहुत सारे छोटे-छोटे कमिट्स (&amp;ldquo;Typo फिक्स&amp;rdquo;, &amp;ldquo;अस्थायी सेव&amp;rdquo;, आदि) जमा हो गए हैं। पुल रिक्वेस्ट (PR) सबमिट करने से पहले, इन कमिट्स को सार्थक इकाइयों में व्यवस्थित करने के लिए इंटरएक्टिव रिबेस का उपयोग करें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># फीचर ब्रांच में रहते हुए निष्पादित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git rebase -i HEAD~5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># (एडिटर खुलेगा, जहाँ आप squash और fixup का उपयोग करके इतिहास को साफ़ कर सकते हैं)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इससे, आप एक सुंदर कमिट इतिहास बना सकते हैं जिससे समीक्षकों (Reviewers) के लिए आपके इरादे को समझना आसान हो जाएगा।&lt;/p>
&lt;h2 id="82-परदशय-2-नवनतम-main-बरच-क-सथ-अपडट-रहन-rebase-क-उपयग">8.2 [परिदृश्य 2] नवीनतम main ब्रांच के साथ अपडेट रहना (Rebase का उपयोग)
&lt;/h2>&lt;p>यदि विकास में अधिक समय लग रहा है, और अन्य लोगों के परिवर्तन लगातार &lt;code>main&lt;/code> ब्रांच में मर्ज किए जा रहे हैं, तो आपकी &lt;code>feature&lt;/code> ब्रांच पुरानी हो जाएगी। इस स्थिति में, आप अपनी &lt;code>feature&lt;/code> ब्रांच को नवीनतम &lt;code>main&lt;/code> ब्रांच में रिबेस करके इसे अपडेट कर सकते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># main की नवीनतम जानकारी प्राप्त करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git fetch origin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># फीचर ब्रांच को नवीनतम main के शीर्ष पर स्थानांतरित करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git rebase origin/main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इससे इतिहास एक सीधी रेखा बन जाता है, जिससे भविष्य में मर्ज करते समय कॉन्फ्लिक्ट्स को रोका जा सकता है। इसके अलावा, यह अनावश्यक मर्ज कमिट्स (&amp;ldquo;Merge branch &amp;lsquo;main&amp;rsquo; into feature&amp;rdquo;) उत्पन्न होने से भी रोकता है।&lt;/p>
&lt;h2 id="83-परदशय-3-परण-हए-फचर-क-एककत-करन-merge-क-उपयग">8.3 [परिदृश्य 3] पूर्ण हुए फीचर को एकीकृत करना (Merge का उपयोग)
&lt;/h2>&lt;p>यह वह चरण है जब &lt;code>feature&lt;/code> ब्रांच में विकास पूरा हो चुका है, और आप अंततः इसे &lt;code>main&lt;/code> ब्रांच में एकीकृत (Integrate) कर रहे हैं। यहाँ, हम &lt;strong>&lt;code>git merge --no-ff&lt;/code>&lt;/strong> का उपयोग करेंगे (यह GitHub जैसे प्लेटफ़ॉर्म पर पुल रिक्वेस्ट में &amp;ldquo;Create a merge commit&amp;rdquo; चुनने के समान है)।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git checkout main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git merge --no-ff feature -m &lt;span class="s2">&amp;#34;Merge feature: यूज़र लॉगिन फीचर का कार्यान्वयन&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इससे, &lt;code>main&lt;/code> ब्रांच के DAG पर एक ऐतिहासिक नोड (मर्ज कमिट) बन जाएगा जो यह दर्शाएगा कि &amp;ldquo;यहाँ एक फीचर मर्ज किया गया था&amp;rdquo;। जब आप बाद में इतिहास को देखेंगे, तो फीचर के आधार पर कोड को ट्रैक करना आसान होगा।&lt;/p>
&lt;hr>
&lt;h1 id="9-नषकरष-सरश">9. निष्कर्ष (सारांश)
&lt;/h1>&lt;p>Git ऑपरेशन्स में &amp;ldquo;सब कुछ Merge के साथ करना&amp;rdquo; या &amp;ldquo;सब कुछ Rebase के साथ सीधा करना&amp;rdquo; जैसे चरम (Extreme) दृष्टिकोणों के अपने-अपने फायदे और नुकसान हैं।&lt;/p>
&lt;p>वास्तविक अभ्यास में सबसे अच्छी प्रथा (Best Practice) यह हाइब्रिड (Hybrid) दृष्टिकोण है: &lt;strong>&amp;ldquo;अपने स्थानीय निजी इतिहास को खूबसूरती से व्यवस्थित करने के लिए rebase का उपयोग करें, और सार्वजनिक एकीकरण इतिहास के संदर्भ को बनाए रखने के लिए merge &amp;ndash;no-ff का उपयोग करें।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>स्थानीय (व्यक्तिगत कार्यक्षेत्र - Local)&lt;/strong>: अनावश्यक कमिट्स को खत्म करने के लिए &lt;code>rebase&lt;/code> का उपयोग करें, और नवीनतम मेनलाइन के साथ अपडेट रहकर एक सीधा इतिहास बनाए रखें।&lt;/li>
&lt;li>&lt;strong>ग्लोबल (साझा कार्यक्षेत्र - Global)&lt;/strong>: फीचर ब्रांच के अस्तित्व को मर्ज कमिट के रूप में DAG में दर्ज करने के लिए &lt;code>merge --no-ff&lt;/code> का उपयोग करें, ताकि इसे रिवर्ट या ट्रैक करना आसान हो।&lt;/li>
&lt;/ul>
&lt;p>DAG की संरचना और हैश फ़ंक्शन्स के तंत्र जैसी गणितीय और संरचनात्मक पृष्ठभूमि को समझकर, Git कमांड्स का उपयोग केवल याद रखने से &amp;ldquo;इरादे के साथ इतिहास डिजाइन करने&amp;rdquo; में बदल जाता है। रिबेस के सुनहरे नियम का पालन करते हुए, स्थिति के अनुसार सबसे उपयुक्त कमांड चुनें, और एक साफ़ कमिट इतिहास बनाएँ जिसे पूरी टीम के लिए पढ़ना और मेंटेन करना आसान हो।&lt;/p></description></item></channel></rss>