বর্তমান গিট শাখাটিকে একটি মাস্টার শাখা করুন


1657

গীতে আমার একটি সংগ্রহশালা রয়েছে। আমি একটি শাখা তৈরি করেছি, তারপরে মাস্টার এবং শাখায় কিছু পরিবর্তন করেছি।

তারপরে, দশটি প্রতিশ্রুতি পরে, আমি বুঝতে পারি যে শাখাটি মাস্টারের চেয়ে অনেক ভাল অবস্থানে রয়েছে, তাই আমি শাখাটি মাস্টারকে "পরিণত" হতে এবং মাস্টারের পরিবর্তনগুলি উপেক্ষা করতে চাই।

আমি এটিকে মার্জ করতে পারি না, কারণ আমি পরিবর্তনগুলি মাস্টারকে ধরে রাখতে চাই না। আমার কি করা উচিৎ?

অতিরিক্ত : এই ক্ষেত্রে, 'ওল্ড' মাস্টার ইতিমধ্যে pushগিটহাবের মতো অন্য ভাণ্ডারগুলিতে গেছেন । কীভাবে এই জিনিসগুলি পরিবর্তন হয়?


2
অনুরূপ প্রশ্নের উত্তর চেক করুন stackoverflow.com/q/2862590/151641
mloskot

4
একটি একই সমস্যা ছিল, কিন্তু আমি কেবল মাস্টার মুছে ফেলেছি এবং মাস্টার আরেকটি শাখা নতুন নামকরণ: stackoverflow.com/a/14518201/189673
jayarjo

10
@ জয়য়ারজো আপনার এটিকে এড়ানো উচিত যদি আপনি সম্ভবত এটি করতে পারেন তবে এটি ইতিহাস পুনর্লিখন করবে এবং যখন তারা পরের মাস্টারকে টানানোর চেষ্টা করবে তখন অন্য সকলের জন্য সমস্যা তৈরি করবে।
joelittlejohn

3
এজন্য আমি @ জেফ্রমি'র উত্তরটি পছন্দ করি। সংরক্ষণাগারটির ইতিহাসের কোনও ডিকনস্ট্রাকশন চলছে না।
froggythefrog

উত্তর:


2134

অন্য দুটি উত্তরের সমস্যাটি হ'ল নতুন মাস্টারের পূর্বপুরুষ হিসাবে পুরানো মাস্টার নেই, সুতরাং আপনি যখন এটি চাপবেন তখন বাকি সবাই বিভ্রান্ত হয়ে যাবে। এটিই আপনি করতে চান:

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

আপনি যদি নিজের ইতিহাসটি আরও পরিষ্কার করতে চান তবে আপনি কী করেছেন তা পরিষ্কার করার জন্য আমি মার্জ কমিট বার্তায় কিছু তথ্য যুক্ত করার পরামর্শ দেব। দ্বিতীয় লাইনটি এতে পরিবর্তন করুন:

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

25
গিটের মার্জ "কৌশলগুলি" সম্পর্কে নোট: এর --strategy=oursথেকে পৃথক --strategy=recursive -Xours। অর্থাত্ "আমাদের" নিজের মধ্যে কৌশল হতে পারে (ফলস্বরূপ বর্তমান শাখাটি যাই থাকুক না কেন), বা "পুনরাবৃত্তি" কৌশলটির বিকল্প হিসাবে পাস করা হয়েছে (অন্যান্য শাখার পরিবর্তন আনুন এবং বিরোধের সময় স্বয়ংক্রিয়ভাবে বর্তমান শাখার পরিবর্তনগুলি পছন্দ করুন )।
কেলভিন

5
git merge --strategy=ours master -m "new master"এটি কাজ করার জন্য আমাকে দ্বিতীয় লাইন তৈরি করতে হয়েছিল।
ভাস্বর

5
@ জোহসম ঠিক আমার উত্তরটির প্রথম বাক্যটি নিয়ে কথা বলছে। আপনি যদি এটি করেন তবে নতুন মাস্টারের পুরানো মাস্টারের মতো ইতিহাস থাকবে না, যা আপনি চাপ / টানতে চাইলে খুব খারাপ। সঠিকভাবে কাজ করার জন্য আপনার পূর্বসূরীদের ভাগ করা দরকার; যদি আপনি যা বলছেন তার পরিবর্তে যদি আপনি এটি করার চেষ্টা করেন, তবে আপনি যখন চাপ দেয়ার চেষ্টা করেন তবে তা ব্যর্থ না করে (কারণ এটি খারাপ এবং এটি আপনাকে থামিয়ে দেওয়ার চেষ্টা করছে), এবং যদি আপনি এটি জোর করেন, তবে পরবর্তীকালে যে কেউ টানবে পুরানো মাস্টার এবং নতুন মাস্টারকে একীভূত করার চেষ্টা করবে যা সম্ভবত ট্রেনের ধ্বংসস্তূপ হবে।
ক্যাসাবেল

4
যদি মার্জ চলাকালীন vi সম্পাদক উপস্থিত হয়, টাইপ করুন: w (সংরক্ষণের জন্য): q (vi থেকে বেরিয়ে আসার জন্য)
টমাস কুবেস

9
এই উত্তর দুর্দান্ত কাজ করে। আমি কেবল যুক্ত করতে চেয়েছিলাম (যারা নতুন বা অনিশ্চিত হতে পারে তাদের জন্য) যে আপনি git pushযদি আপনার কোডটি দূরবর্তী পর্যন্ত চালিত করতে চান তবে আপনাকে এই কাজটি করতে হবে । আপনি Your branch is ahead of 'origin/master' by 50 commits.এটির মতো প্রত্যাশিত একটি সতর্কতা দেখতে পাবেন । শুধু ধাক্কা! : ডি
চ্যাপেলজুইস

387

আপনার দূরবর্তী সংগ্রহস্থল (গিটহাব) পর্যন্ত সবকিছু নিশ্চিত করা হয়েছে তা নিশ্চিত করুন:

git checkout master

"আরও ভাল_ ব্র্যাঞ্চ" দিয়ে "মাস্টার" ওভাররাইট করুন:

git reset --hard better_branch

আপনার দূরবর্তী সংগ্রহস্থলে চাপ দিন:

git push -f origin master

81
বেশিরভাগ লোকেরা সম্ভবত এটির উত্তর খুঁজছেন। বিএস কৌশল একত্রিত করে অন্য সমস্ত উত্তর পুরো শাখাকে প্রতিস্থাপন করে না। এটি যেমনটি আমি চেয়েছিলাম ঠিক তেমনভাবে তৈরি করেছিল, কেবল শাখাটি ওভাররাইট করে জোর করে চাপুন।
গুব্যাট্রন

31
যদিও এটি প্রকৃতপক্ষে অনেকেই সন্ধান করছে, এটি অবশ্যই লক্ষ্য করা উচিত যে রেপোর অন্য কোনও স্থানীয় অনুলিপিগুলি যখন git reset --hard origin/masterটানতে চান তাদের প্রয়োজন হবে , অন্যথায় গিট পরিবর্তনগুলি তাদের (এখন) ডাইভারজেন্ট লোকালটিতে মার্জ করার চেষ্টা করবে। এর
উত্তরণের ঝুঁকিগুলি

3
দয়া করে এটিও নোট করুন যে আপনাকে
ভান্ডারটিতে

লোকেরা কী চায় তার উপর নির্ভর করে এখানে উলটাপাল্টা একটি ডাউনসাইডও হতে পারে। আপনি যদি অন্য শাখার ইতিহাসের সাথে মাস্টারের ইতিহাস প্রতিস্থাপনের পথ যেতে চান তবে এটি আপনার উত্তর।
বি 15

75

সম্পাদনা: আপনি বলেননি যে আপনি পাবলিক রেপোতে চাপ দিয়েছেন! যে পার্থক্য একটি বিশ্বের তোলে।

দুটি উপায় আছে, "নোংরা" উপায় এবং "পরিষ্কার" উপায়। মনে করুন আপনার শাখার নামকরণ হয়েছে new-master। এটি পরিষ্কার উপায়:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

এটি কনফিগার করা ফাইলগুলিকে নাম পরিবর্তিত শাখাগুলির সাথে মেলে পরিবর্তন আনবে।

আপনি এটি নোংরা পথেও করতে পারেন, যা কনফিগার ফাইলগুলি আপডেট করবে না। এই ধরণের উপরের নীচে যা চলছে ...

mv -i .git/refs/new-master .git/refs/master
git checkout master

2
ধন্যবাদ. আরেকটি প্রশ্ন. আমি এটি গিথুবকে চাপ দিচ্ছি। সেখানে আমি কী করব?
কারেল বালেক

3
@ কারেল: এটি অন্যান্য ব্যবহারকারীর জন্য কিছুটা বিশৃঙ্খলা সৃষ্টি করবে; তাদের তাদের মাস্টারকে গিথুব মাস্টারে পুনরায় সেট করতে হবে। আপনি যদি তাদের কোনও ঝামেলা সৃষ্টি না করতে চান তবে আমার উত্তরটি একবার দেখুন।
ক্যাসকেবেল

6
@ ডায়েড্রিক এপ্প: নোংরা উপায়ের প্রস্তাব দেওয়া ভাল ধারণা কিনা তা আমি নিশ্চিত নই if এটি রিমোট ট্র্যাকিংকে বিশৃঙ্খলা সৃষ্টি করতে চলেছে, রিফ্লাগগুলি ... কোনও কারণ আপনি কখনই এটি করতে চান তা ভাবতে পারে না।
ক্যাসকেবেল

2
আহ, এটি একটি ভাল পয়েন্ট। আপনি এটা উভয় উপায় থাকতে পারে, যদিও: git branch old-master master; git branch -f master new-master। ব্যাকআপ শাখাটি তাজা তৈরি করুন, তারপরে সরাসরি মাস্টারকে নতুন-মাস্টারে সরান। (এবং আপনার নামের ভুল বানান করার জন্য দুঃখিত, সবেমাত্র তা লক্ষ করা গেছে)
ক্যাস্যাবেল

2
@ ফেকনাম আমি এই সিদ্ধান্ত নেওয়ার কোনও কারণ নেই বলে শেষ করি না, কেবল এটি নোংরা পথে করার কোনও কারণ নেই । আপনি সাধারণ কমান্ডগুলি ব্যবহার করে এটি করতে পারেন (আমার আগের মতামত হিসাবে) এবং একই ফলটি পেতে পারেন, রিফ্লোগগুলি অক্ষত রাখার পাশাপাশি কোনও বিষয়বস্তু হওয়ার কোনও সম্ভাবনা নেই। এবং এটি কাজ করার গ্যারান্টিযুক্ত, যেহেতু আপনি বাস্তবায়নের বিশদটি নিয়ে কৌতুক করছেন না।
ক্যাসাবেল

46

এর মাধ্যমে শাখার নাম পরিবর্তন করুন master:

git branch -M branch_name master

11
দুর্ভাগ্যক্রমে গিটটি শাখার নাম পরিবর্তন করতে ট্র্যাক করে না, সুতরাং আপনি যদি ইতিমধ্যে আপনার রেপোকে একটি দূরবর্তী স্থানে ঠেলে দেন এবং অন্যদের স্থানীয় পুরানো মাস্টার শাখায় স্থানীয় পরিবর্তন হয় তবে তারা সমস্যায় পড়বে।
th সোফট

এই এবং এর মধ্যে কোন পার্থক্য আছে git checkout master&&git reset --hard better_branch?
wotanii

26

আমি যা বুঝি সেগুলি থেকে আপনি বর্তমান শাখাকে একটি বিদ্যমান শাখায় শাখা করতে পারেন। সংক্ষেপে, masterএটি বর্তমান শাখায় যা আছে তার সাথে ওভাররাইট হবে :

git branch -f master HEAD

একবার এটি হয়ে গেলে, আপনি সাধারণত নিজের স্থানীয় masterশাখাটি চাপতে পারেন , সম্ভবত এখানে ফোর্স প্যারামিটারের প্রয়োজনও রয়েছে:

git push -f origin master

কোনও মার্জ, দীর্ঘ কমান্ড নেই। কেবল branchএবং push- তবে, হ্যাঁ, এটি শাখার ইতিহাস পুনর্লিখন করবেmaster , সুতরাং আপনি যদি একটি দলে কাজ করেন তবে আপনি কী করছেন তা জানতে পেরেছেন।




বিকল্পভাবে, আমি দেখতে পেয়েছি যে আপনি যে কোনও শাখা যে কোনও প্রত্যন্ত শাখায় ঠেলাতে পারেন, তাই:

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

খুব সহজ এবং পুরোপুরি কাজ! গিট কমান্ড বুঝতে সহজ এবং সহজ দুটি। আমার গিট রেপো সংরক্ষণ করা হয়েছে এবং এখন দুর্দান্ত পরিষ্কার দেখাচ্ছে। ধন্যবাদ!
thehelix

15

উত্তরটি আমি ব্লগ পোস্টে পেয়েছি, মাস্টার শাখাকে গিটের সাথে অন্য একটি শাখার সাথে প্রতিস্থাপন করুন :

git checkout feature_branch
git merge -s ours --no-commit master
git commit      # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch

এটি মূলত ক্যাসাবেলের উত্তরের মতো । "বিকল্প" বাদে তিনি নীচে যুক্ত করেছেন তার সমাধানের ইতিমধ্যে আমার মূল কোড ব্লকে এম্বেড রয়েছে।

এইভাবে খুঁজে পাওয়া সহজ।

আমি একটি নতুন উত্তর হিসাবে এই যোগ করছি, কারণ আমি যদি এই সমাধান পরে প্রয়োজন, আমি চাই সব কোড আমি এক কোড ব্লক ব্যবহার করার জন্য যাচ্ছি।

অন্যথায়, আমি কপি-পেস্ট করতে পারি, তারপরে আমার ইতিমধ্যে এটি কার্যকর করার পরে - আমার যে লাইনটি পরিবর্তন করা উচিত ছিল তা দেখতে নীচের বিশদটি পড়ুন ।


14

এখানে প্রদত্ত সমাধানগুলি ('মাস্টারে' শাখার নাম পরিবর্তন করে) রিমোটের (গিটহাব) রেপোর পরিণতির জন্য জোর দেয় না:

    -f
    --force

সাধারণত, কমান্ড একটি রিমোট রেফ আপডেট করতে অস্বীকার করে যা এটি ওভাররাইট করতে ব্যবহৃত স্থানীয় রেফের পূর্বপুরুষ নয়। এই পতাকা চেকটি অক্ষম করে। এর ফলে দূরবর্তী সংগ্রহস্থলটি কমিটগুলি হারাতে পারে; যত্ন সহকারে এটি ব্যবহার করুন।

অন্যরা যদি ইতিমধ্যে আপনার রেপো টানতে থাকে তবে তারা তাদের নতুন মাস্টারকে নতুন নতুন গিটহাব মাস্টার শাখা (বা প্রচুর সংশ্লেষের সাথে ডিলিং) না দিয়ে তাদের নতুন মাস্টার ইতিহাসটি টানতে পারবে না। পাবলিক রেপগুলির জন্য গিট পুশ - ফোর্সের বিকল্প
রয়েছে । জেফ্রুমির উত্তর (ডান পরিবর্তনগুলি মূল মাস্টারের সাথে আবার মার্জ করা) এর মধ্যে একটি।


14

আমি সবচেয়ে সহজ কাজ করার জন্য এই সহজ পদ্ধতিটি পেয়েছি। এটি ইতিহাস পুনর্লিখন করে না এবং শাখার পূর্ববর্তী সমস্ত চেক-ইনগুলি মাস্টারে সংযুক্ত করা হবে। কিছুই হারিয়ে যায় না, এবং আপনি পরিষ্কারভাবে দেখতে পারেন যে প্রতিশ্রুতিবদ্ধ লগটিতে কী ঘটেছিল।

উদ্দেশ্য: "শাখা" "মাস্টার" এর বর্তমান অবস্থা করুন

একটি শাখায় কাজ করা, আপনার স্থানীয় এবং দূরবর্তী সংগ্রহস্থলগুলি আপ টু ডেট রয়েছে তা নিশ্চিত করতে আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন এবং চাপ দিন:

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

এর পরে, আপনার মাস্টার আপনার শাখার শেষ প্রতিশ্রুতিটির সঠিক অবস্থা হবে এবং আপনার মাস্টার কমিট লগ শাখার সমস্ত চেক-ইন দেখিয়ে দেবে।


10

একজন অন্য শাখা থেকে সমস্ত ফাইলকে মাস্টার হিসাবে চেকআউট করতে পারে:

git checkout master
git checkout better_branch -- .

এবং তারপরে সমস্ত পরিবর্তন করে।


5

জেফ্রোমির উত্তর যুক্ত করতে, আপনি যদি sourceশাখার ইতিহাসে অর্থহীন মার্জ স্থাপন করতে না চান, আপনি সংযুক্তির জন্য একটি অস্থায়ী শাখা তৈরি করতে পারেন ours, তবে এটিকে ফেলে দিন:

git checkout <source>
git checkout -b temp            # temporary branch for merge
git merge -s ours <target>      # create merge commit with contents of <source>
git checkout <target>           # fast forward <target> to merge commit
git merge temp                  # ...
git branch -d temp              # throw temporary branch away

এইভাবে একত্রীকরণের প্রতিশ্রুতি কেবলমাত্র ইতিহাসের ইতিহাসে উপস্থিত থাকবে target শাখার ।

বিকল্পভাবে, আপনি যদি কোনও মার্জ তৈরি করতে চান না, আপনি কেবল বিষয়বস্তুগুলি ধরে ফেলতে এবং এটিকে sourceএকটি নতুন প্রতিশ্রুতি দেওয়ার জন্য ব্যবহার করতে পারেন target:

git checkout <source>                          # fill index with contents of <source>
git symbolic-ref HEAD <target>                 # tell git we're committing on <target>
git commit -m "Setting contents to <source>"   # make an ordinary commit with the contents of <source>

3

আমার জন্য, আমি চেয়েছিলাম যে আমার শয়তানটি সামনে আসার পরে মাস্টারের কাছে ফিরে আসুক।

বিকাশ চলাকালীন:

git checkout master
git pull

git checkout develop
git pull

git reset --hard origin/master
git push -f

2

আমার কাজগুলি করার পদ্ধতিটি নিম্নলিখিত

#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop

2

আপনি ব্যবহার করে থাকেন eGit মধ্যে অন্ধকার :

  • প্রজেক্ট নোডে রাইট ক্লিক করুন।
  • চয়ন করুন টিম → তারপর উন্নত → তারপর শাখা পুনঃনামকরণ
  • তারপরে রিমোট ট্র্যাকিং ফোল্ডারটি প্রসারিত করুন ।
  • ভুল নামের সাথে শাখাটি চয়ন করুন, তারপরে পুনরায় নামকরণ বোতামটি ক্লিক করুন, নতুন নাম যাই হোক না কেন এটির নাম দিন।
  • নতুন মাস্টার চয়ন করুন, তারপরে মাস্টার নামকরণ করুন।

আমি তা করেছিলাম কিন্তু নিশ্চিত না যে এটি কাজ করে কিনা। গিথুব-এ, কিছুই পরিবর্তন হয়নি গিট এক্সটেনশনে আমি দেখতে পাচ্ছি শাখার নাম পরিবর্তন করা হয়েছিল।
প্রমোদ

0

আটলাশিয়ান (বিটবকেট সার্ভার) দ্বারা চালিত গিট ব্রাউজারে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করা হয়

{বর্তমান-শাখা} হিসাবে তৈরি করা হচ্ছে master

  1. এর বাইরে একটি শাখা তৈরি করুন masterএবং এর নাম রাখুন "মাস্টার-নকল"।
  2. "কারেন্ট-ব্রাঞ্চ" এর বাইরে একটি শাখা তৈরি করুন এবং এর নাম দিন "“ বর্তমান-শাখা} -কপি "।
  3. সংগ্রহস্থল সেটিং-এ (বিটবুকিট) "মাস্টার-নকল" এ নির্দেশ করতে "ডিফল্ট শাখা" পরিবর্তন করুন (এই পদক্ষেপ ব্যতীত, আপনি মাস্টার মুছতে সক্ষম হবেন না - "পরবর্তী ধাপে")।
  4. "মাস্টার" শাখাটি মুছুন - আমি উত্স গাছ থেকে এই পদক্ষেপটি করেছি (আপনি এটি সি এল এল বা গিট ব্রাউজার থেকে করতে পারেন)
  5. "{কারেন্ট-ব্রাঞ্চ" - কে "মাস্টার" নামকরণ করুন এবং সংগ্রহস্থলটিতে চাপ দিন (এটি একটি নতুন "মাস্টার" শাখা তৈরি করবে "{বর্তমান-শাখা}" বিদ্যমান থাকবে)।
  6. সংগ্রহস্থল সেটিংসে, "ডিফল্ট শাখা" পরিবর্তন করে "মাস্টার" এ নির্দেশ করুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.