वर्तमान शाखा को दूसरी शाखा में कैसे मर्ज किया जाए


182

मेरी दो शाखाएँ हैं, गुरु और देव। मैं हमेशा देव शाखा पर काम करता हूं और केवल एक बार मास्टर शाखा में कोड की जांच करता हूं, क्योंकि यह उत्पादन के उपयोग के लिए अनुमोदित है। जब मैं ऐसा करता हूं, तो मुझे निम्नलिखित कार्य करने होंगे:

git checkout master
git merge dev
git checkout dev

यह भयानक क्रिया है, और चूंकि मैं इसे अक्सर करता हूं, इसलिए मैं इसे कम से कम करना चाहता हूं। क्या कोई एक git कमांड है जिसे मैं अपनी वर्तमान शाखा देव से दूसरी शाखा मास्टर में विलय करने के लिए उपयोग कर सकता हूं बिना पहले मास्टर शाखा की जांच के? शायद कुछ इस तरह:

git merge dev to master

बहुत ही अच्छा होगा। मैंने गिट प्रलेखन के माध्यम से देखा और कुछ भी नहीं देखा।


1
क्या आपने इसके लिए गिट पुश का उपयोग करने की कोशिश की है?
जय सुलिवन

11
पुश के सुझावों के साथ क्या है? यह रीमोट अपडेट करने के लिए है , न कि किसी के स्वयं के भंडार में विलय करने के लिए ।
कैस्केबेल

4
जेफ्रोमी सही है, यहां पुश उपयोगी नहीं है। मैं एक अन्य स्थानीय शाखा के बारे में बात कर रहा हूं, न कि एक दूरस्थ शाखा के बारे में।
क्रिस

2
इससे भी बदतर यह है आप अप्रतिबद्ध स्थानीय परिवर्तन जब: git stash, git checkout master, git merge dev, git checkout dev, git stash pop
म्यू माइंड

2
अच्छा प्रश्न। मैं यह भी चाहता था क्योंकि मैं एक गैर-वर्तमान शाखा में खींचना चाहता था। मैं शाखाओं को स्विच करने से बचना चाहता था क्योंकि मेरे पास एक प्रक्रिया है जो एक निर्माण को बंद कर देती है अगर काम करने वाले पेड़ में कोई भी फाइल बदल जाती है।
केल्विन

जवाबों:


94

1. अपने स्थानीय भंडार के लिए एक दूरस्थ उपनाम जोड़ें, उदा:

git remote add self file:///path/to/your/repository

(या खिड़कियों पर git remote add self C:\path\to\your\repository)

2. आत्म रिमोट के लिए धक्का, पूर्व:

git push self dev:master

2
Submodules! यह न केवल पूछे गए प्रश्न की समस्या को हल करता है, बल्कि यह सबमॉड्यूल होने पर शाखाओं को स्विच करने की समस्या को भी हल करता है। महान टिप!
एड्डीमोया

2
+1 यह रचनात्मक है, और काम के पेड़ को बिल्कुल भी नहीं छूता है। बस एक स्पष्टीकरण: /path/to/your/repositoryअपने काम के पेड़ के लिए रास्ता है, यानी .gitनिर्देशिका शामिल नहीं है । इसके अलावा, यह बिना कहे जाना चाहिए: यदि आप रेपो को स्थानांतरित करते हैं तो रिमोट को अपडेट करना होगा।
केल्विन

मुझे खिड़कियों में काम करने का कोई सौभाग्य नहीं मिल रहा है ... git remote add self file:///c/projectsबस उपयोग नोटों के साथ वापस आता है
मास्लो

2
@ JosephK.Strauss आप पहले मास्टर को वर्तमान शाखा ( dev) में मर्ज कर सकते हैं और फिर मर्ज कमिट का उपयोग करके धक्का दे सकते हैं git push self dev:master
लियोनिद श्वेचिकोव

4
रिमोट उर्फ ​​क्यों? .मेरे लिए ठीक काम किया git push . head:master:।
ज्योन

60

@ एक्सरोम द्वारा वर्तमान में सबसे अधिक मतदान किया गया उत्तर एक अच्छा है, लेकिन थोड़ा अनावश्यक रूप से क्रिया है।

अपने git रेपो के आधार में आप यह कर सकते हैं: git push . dev:master

एक अधिक सामान्यीकृत समाधान जो पेड़ में कहीं भी काम करेगा:

git push $(git rev-parse --show-toplevel) dev:master

3
git push . dev:masterमेरे जीवन को सरल बनाया! अब तक का सर्वश्रेष्ठ उत्तर, धन्यवाद
जेरेमी बेलोलो

क्या आप मस्त मास्टर को गीथूब की तरह एक दूरस्थ भंडार में धकेलने जा रहे हैं? एक कदम करके बचाओgit push origin dev:master
एलेक्स आर

1
क्या इसके merge --no-ffसाथ व्यवहार को दोहराने के लिए संभव है ?
exhuma

1
मुझे अवैध रिमोट नाम मिल रहा है "।" विंडोज में। क्या मुझे अभी भी करने की आवश्यकता है git remote add self file:///myRepo?
--१०

1
लेकिन यह वास्तव में एक मर्ज नहीं है ... यह काम करेगा अगर देव गुरु से आगे है, लेकिन अगर यह नहीं है तो क्या होगा?
थॉमस लेवेस्क

44

आपका सबसे अच्छा शर्त सिर्फ एक उपनाम का उपयोग करना होगा, जिसे आपके वैश्विक gitconfig ( ~/.gitconfig) में रखा गया है :

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

ताकि आप इसे किसी भी भंडार से प्राप्त कर सकें

git merge-to master dev

3
यदि मर्ज स्वचालित नहीं है, लेकिन मर्ज रिज़ॉल्यूशन की आवश्यकता है तो क्या होगा? (इस मामले में मुझे लगता है कि कोई काम मास्टर पर नहीं किया जाता है, इसलिए ऐसा नहीं होगा, लेकिन फिर भी ...
स्टीन जी। स्ट्रिंडाहग

@ सीन: चूंकि मैंने इस्तेमाल किया था &&, इसलिए नहीं ;कि यह मर्ज फेल होगा, और वापस स्विच करने की कोशिश नहीं की जाएगी। उम्मीद है कि उपयोगकर्ता "मर्ज फेल" संदेश देखने और उससे निपटने के लिए पर्याप्त स्मार्ट है।
Cascabel

6
मैं इस merge-to = "!f() { export tmp_branch=git शाखा पसंद करते हैं | grep '*' | टीआर -d '*' ; git checkout $1 && echo git merge $tmp_branch && echo git checkout $tmp_branch; unset $tmp_branch; }; f", यह मुझे नहीं शाखा मैं पर वर्तमान में कर रहा हूँ में टाइप करने की है, तो अगर मैं अलग करना चाहते हैं devमें masterऔर मैं पर हूँ devमैं सिर्फ टाइप अभीgit merge-to master
स्टीव

2
सही merge-to = "!f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '`; git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset $tmp_branch; }; f"
बैकस्टिक्स के

2
अनसेट कमांड सही नहीं है। निश्चित है: मर्ज-टू = "! f () {एक्सपोर्ट tmp_branch = git branch | grep '* ' | tr -d '* '; git चेकआउट $ 1 && git मर्ज --no-ff $ tmp_branch && git चेकआउट $ tmp_branch; unset tmp_branch;}; f"
sassman

38

जेफ्रोमी उर्फ ​​से थोड़ा संशोधन जो आपको वर्तमान शाखा में टाइप करने की आवश्यकता नहीं है।

तो तुम इसे पसंद का उपयोग करें: git merge-to dev

यह devशाखा पर स्विच करेगा , इसे CURRENT के साथ मर्ज करेगा और फिर वापस स्विच करेगा।

उदाहरण के लिए, यह मानते हुए कि आप masterशाखा में हैं, यह स्वामी को देव में मिला देगा और आप अभी भी गुरु पर रहेंगे।

यह निश्चित रूप से मेरे dotfiles को जाता है :)

[alias]
  merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"

6

यह पुराना है, लेकिन ...

@ केविन-लिडा और @ dmytrii-nagirniak से समाधान का संयोजन। यह उपनाम वर्तमान शाखा को निर्दिष्ट शाखा में विलय कर देता है। यह रीमोट विधि का उपयोग करता है और संदर्भ प्राप्त करने के लिए git कमांड का उपयोग करता है।

[alias]
    merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"

उपयोग करने के लिए जैसे:

git merge-to other-branch-name

4

दूसरी शाखा की जाँच के बिना वर्तमान शाखा को दूसरी शाखा में विलय करने के लिए:

तेजी से आगे विलय

यह वास्तव में आसान है। परिभाषा के अनुसार, एक फास्ट-फ़ॉरवर्ड मर्ज का अर्थ है कि शाखा सूचक को प्रतिबद्ध ट्री में आगे ले जाया जाता है। तो आपको बस इतना करना है कि अनुकरण करें :

git branch -f master dev

कैविट्स: यह मानता है कि masterएक कमिट की ओर इशारा करता है जो devशाखा या किसी अन्य शाखा में भी है। यदि ऐसा नहीं होता है, तो आप काम खोने का जोखिम उठाते हैं! इसके विपरीत git mergeजब तेजी से आगे बढ़ने पर मर्ज कमिट (या शिकायत) बनेगी , तो यह विधि चुपचाप दूसरी जगह पर जाने के लिए ब्रांच पॉइंटर को मजबूर कर देती है।

यह भी मानता है कि आप केवल रेपो पर काम कर रहे हैं, और / या आप जानते हैं कि आप क्या कर रहे हैं।

युक्ति: यदि आपने किया था git fetchऔर आपके पास नए तरीके हैं origin/master, तो आप masterशाखा का उपयोग किए बिना जाँच कर सकते हैं:

git branch -f master origin/master

मर्ज कमिट के माध्यम से विलय

यह हमेशा संभव नहीं है। मर्ज कमिट बनाने के लिए, आपको मर्ज ऑपरेशन करना होगा। और एक मर्ज ऑपरेशन करने के लिए, आपको दूसरी शाखा में कमिट करना चाहिए जो वर्तमान शाखा में नहीं है।

आप में करता है तो masterशाखा है जो कर रहे हैं नहीं में devशाखा, आप कर सकते हैं:

डिस्क्लेमर: यह केवल एक प्रूफ-ऑफ-कॉन्सेप्ट है, बस यह दिखाने के लिए कि कभी-कभी बिना चेक आउट किए दूसरी ब्रांच में मर्ज करना संभव है। यदि आप इसे हर रोज उपयोग करना चाहते हैं, तो आप संभवतः शेल पुनर्निर्देशन का उपयोग करके इसके लिए एक उपनाम बनाना चाहते हैं या इसके लिए एक शेल स्क्रिप्ट बना सकते हैं। फिर, आप प्रश्न में दिखाई गई छोटी प्रक्रिया के लिए एक शेल स्क्रिप्ट भी बना सकते हैं।

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

स्पष्टीकरण:

  1. एक अस्थायी शाखा देखें जो वर्तमान शाखा की तरह ही प्रतिबद्ध हो।
  2. मर्ज masterअस्थायी शाखा और प्रक्षेपण में संदेश संपादक प्रतिबद्ध। यदि आप चाहते हैं कि मर्ज ऐसा लगे कि आपने devशाखा को मर्ज किया था master, तो इसे इस से संपादित करें:

    Merge branch 'master' into temp
    

    इसके लिए:

    Merge branch 'dev'
    

    टिप: आप तेज़ होने के -m "Merge branch 'dev'"बजाय उपयोग कर सकते हैं -e

  3. masterमर्ज कमिट को इंगित करने के लिए ब्रांच पॉइंटर को अपडेट करें ।
  4. की जाँच करें devशाखा।
  5. अस्थायी शाखा को हटाएं।

यह अभी भी आपके काम के पेड़ को छूता है, लेकिन न्यूनतम रूप से ऐसा है। यह पेड़ के मूल masterविकास की स्थिति में वापस लाने के लिए सिर्फ एक बार फिर से रोल नहीं करता है । कुछ परवाह नहीं कर सकते हैं, लेकिन दूसरों के लिए यह महत्वपूर्ण हो सकता है।


1

कई बार आप उस शाखा से आ रहे हैं जिसे आप वर्तमान शाखा में विलय करना चाहते हैं। उस मामले में आप कर सकते हैं:

git co - && git merge @{-1}

उदाहरण के लिए:

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master

1

मेरा समाधान निम्नलिखित अंतरों के साथ अन्य उत्तरों के समान है:

  • पठनीयता के लिए फ़ंक्शन को कई लाइनों में विभाजित किया गया है
  • फ़ंक्शन कॉल करता है, set -exइसलिए प्रत्येक कमांड मुद्रित होता है और यदि कमांड विफल रहता है तो फ़ंक्शन तुरंत समाप्त हो जाता है
  • उपनाम (टार्गेट ब्रांच) को छोड़कर, अपने तर्कों को पास करता है git merge
  • फ़ंक्शन में एक शून्य कमांड शामिल है : git mergeजो कुछ शेल सेटअपों के साथ टैब-पूरा काम करता है (जैसे gitfastओह-माय-ज़श से)
[alias]
  merge-to = "!f() { : git merge ; \
      set -ex ; \
      local this=$(git rev-parse --abbrev-ref HEAD) ; \
      local target=$1 ; \
      shift ; \
      git checkout $target ; \
      git merge $this \"$@\" ; \
      git checkout $this ; \
    } ; f"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.