কীভাবে বর্তমান শাখাটিকে অন্য একটি শাখায় মার্জ করবেন


182

আমার দুটি শাখা আছে, মাস্টার এবং দেব। আমি সর্বদা ডেভ উপর কাজ করি এবং একবার উত্পাদন ব্যবহারের জন্য অনুমোদিত হওয়ার পরে কেবল মাস্টার শাখায় কোড চেক করি। যখন আমি এটি করি, আমাকে নিম্নলিখিতগুলি করতে হবে:

git checkout master
git merge dev
git checkout dev

এটি ভয়াবহভাবে ভার্জোজ, এবং যেহেতু আমি ঘন ঘন এটি করি, তাই আমি এটি হ্রাস করতে চাই। প্রথমে মাস্টার ব্রাঞ্চটি চেকআউট না করে আমি কি আমার বর্তমান শাখা দেব থেকে অন্য শাখা মাস্টারের সাথে একীভূত করতে কোনও গিট কমান্ড ব্যবহার করতে পারি? কিছু হতে পারে যেমন:

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

১. আপনার স্থানীয় সংগ্রহস্থলের জন্য একটি দূরবর্তী নাম যুক্ত করুন:

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

(বা উইন্ডোতে git remote add self C:\path\to\your\repository)

২. স্ব স্ব দূরবর্তী দিকে ধাকুন, প্রাক্তন:

git push self dev:master

2
Submodules! এটি কেবল জিজ্ঞাসিত প্রশ্নের সমস্যার সমাধান করে না, কেবলমাত্র একটি সাবমডিউল থাকার সময় এটি শাখাগুলির স্যুইচিংয়ের সমস্যাও সমাধান করে। দুর্দান্ত টিপ!
এডিমেমায়া

2
+1 এটি সৃজনশীল, এবং কার্যকারী গাছকে মোটেই স্পর্শ করে না। কেবল একটি স্পষ্টতা: /path/to/your/repositoryআপনার কার্যকারী গাছের পথ হ'ল অর্থ .gitডিরেক্টরিটি অন্তর্ভুক্ত করবেন না । এছাড়াও, এটি বলার অপেক্ষা রাখে না: আপনি রেপো সরালে রিমোটটি আপডেট করতে হবে।
কেলভিন

উইন্ডোতে কাজ করার জন্য আমি কোনও ভাগ্য পাচ্ছি না ... git remote add self file:///c/projectsকেবল ব্যবহারের নোটগুলি নিয়ে ফিরে আসবে
মাসলো

2
@ জোসেফকে.সট্রাস আপনি প্রথমে বর্তমান শাখায় মাস্টারকে মার্জ করতে পারেন ( dev) এবং তারপরে ব্যবহার করে মার্জ কমিটিকে চাপতে পারেন git push self dev:master
লিওনিড শ্বেচিকভ

4
কেন রিমোট ওরফে? .আমার জন্য জরিমানা কাজ: git push . head:master
জিওন

60

@ জেরোমের বর্তমান সর্বাধিক-ভোট দেওয়া উত্তরটি উত্তম তবে এটি অযথা ভার্চুজের।

আপনার গিট রেপোর গোড়ায় আপনি কেবল এটি করতে পারেন: 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) এ রাখা হয়েছে:

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

যাতে আপনি এটি কোনও সংগ্রহস্থল থেকে প্রার্থনা করতে পারেন

git merge-to master dev

3
মার্জটি যদি স্বয়ংক্রিয় না হয় তবে মার্জ রেজোলিউশনের প্রয়োজন হয় তবে কী হবে? (
এক্ষেত্রে

@ স্টেইন: যেহেতু আমি ব্যবহার করেছি &&, তা নয় ;, এটি মার্জটিকে ব্যর্থ করবে এবং ফিরে স্যুইচ করার চেষ্টা করবে না। আশা করি ব্যবহারকারী "মার্জ ব্যর্থ" বার্তাটি দেখতে এবং এটি মোকাবেলা করার জন্য যথেষ্ট স্মার্ট।
ক্যাসকেবেল

6
আমি এই merge-to = "!f() { export tmp_branch=গিট শাখা পছন্দ গ্রেপ '*' | টিআর-ডি '*' ; 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
আনসেট কমান্ডটি সঠিক নয়। স্থির করা হয়েছে: মার্জ-টু = "! চ () {রফতানি tmp_branch = git branch | grep '* ' | tr -d '* '; গিট চেকআউট $ 1 && গিট মার্জ --no-ff $ tmp_branch && git চেকআউট $ tmp_branch; আনসেট tmp_branch;}; চ"
সাসমান

38

জেফ্রমি ওরফে থেকে সামান্য পরিবর্তন যা আপনার বর্তমান শাখায় টাইপ করার প্রয়োজন হয় না।

সুতরাং আপনি এটি মত ব্যবহার করুন: git merge-to dev

এটি devশাখায় স্যুইচ করবে , এটিকে বর্তমানের সাথে একীভূত করবে এবং তারপরে ফিরে যাবে।

উদাহরণস্বরূপ, ধরে নিচ্ছেন আপনি masterশাখায় রয়েছেন, এটি মাস্টারকে দেবের সাথে একীভূত করবে এবং আপনি এখনও মাস্টারে থাকবেন।

এটি অবশ্যই আমার ডটফাইলে যায় :)

[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 থেকে সমাধানগুলির সংমিশ্রণ। এই উপনামটি বর্তমান শাখাকে নির্দিষ্ট শাখায় মার্জ করে। এটি রিমোটেস পদ্ধতিটি ব্যবহার করে এবং প্রসঙ্গটি পেতে গিট কমান্ড ব্যবহার করে।

[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

অন্যান্য শাখা পরীক্ষা না করে বর্তমান শাখাটিকে অন্য একটি শাখায় মার্জ করতে:

দ্রুত-ফরোয়ার্ড মার্জ

এটা সত্যিই সহজ। সংজ্ঞা অনুসারে, দ্রুত-ফরওয়ার্ড মার্জ করার অর্থ হল শাখা পয়েন্টারটি কমিট ট্রিতে এগিয়ে চলেছে ahead সুতরাং আপনাকে যা করতে হবে তা হ'ল কেবল অনুকরণ করা:

git branch -f master dev

ক্যাভেটস: এটি ধরে নিয়েছে যে masterএকটি অঙ্গীকারকে নির্দেশ করে যা devশাখা বা অন্য কোনও শাখায়ও রয়েছে। যদি তা না হয় তবে আপনি কাজ হারাতে ঝুঁকিপূর্ণ! git mergeদ্রুত-ফরওয়ার্ড সম্ভব না হলে যা মার্জ কমিট (বা অভিযোগ) তৈরি করবে তার বিপরীতে , এই পদ্ধতিটি নীরবে শাখা পয়েন্টারটিকে অন্য প্রতিশ্রুতিতে নির্দেশ করতে বাধ্য করে।

এটিও ধরে নেয় যে আপনি কেবলমাত্র রেপোতে কাজ করছেন এবং / অথবা আপনি জানেন যে আপনি কী করছেন।

টিপ: আপনি যদি একটি করেন git fetchএবং আপনার নতুন কমিট থাকে তবে origin/masterআপনি masterব্যবহার করে পরীক্ষা না করেই শাখাটি সরাতে পারবেন :

git branch -f master origin/master

মার্জ কমিটের মাধ্যমে মার্জ করুন

এই সবসময় সম্ভব হয় না। মার্জ কমিট তৈরি করতে, আপনাকে মার্জ অপারেশন করতে হবে। এবং মার্জ অপারেশন করতে আপনার অন্য শাখায় কমিট করা উচিত যা বর্তমান শাখায় নেই।

আপনি করে থাকলে masterশাখা যা হয় নাdevশাখা, আপনি করতে পারেন:

দাবি অস্বীকার: এটি নিছক একটি প্রমাণ-ধারণা, কেবলমাত্র কখনও কখনও পরীক্ষা না করে অন্য শাখায় মার্জ করা সম্ভব show আপনি যদি এটি প্রতিদিন ব্যবহার করতে চান তবে আপনি সম্ভবত শেল পুনর্নির্দেশটি ব্যবহার করে এটির জন্য একটি নাম তৈরি করতে চান বা এটির জন্য একটি শেল স্ক্রিপ্ট তৈরি করতে চান। তারপরে আবার, আপনি প্রশ্নের মধ্যে দেখানো সংক্ষিপ্ত প্রক্রিয়াটির জন্য একটি শেল স্ক্রিপ্টও তৈরি করতে পারেন।

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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.