সম্পূর্ণভাবে গিতে দূরবর্তী শাখার সাথে স্থানীয় শাখাটি কীভাবে প্রতিস্থাপন করা যায়?


776

আমার দুটি শাখা রয়েছে:

  1. স্থানীয় শাখা (যার সাথে আমি কাজ করি)
  2. দূরবর্তী শাখা (সর্বজনীন, কেবল পরীক্ষিত কমিটগুলি সেখানে যায়)

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

আমি কীভাবে স্থানীয় শাখাটি রিমোট শাখার সাথে পুরোপুরি প্রতিস্থাপন করব, তাই আমি এখন যেখানে দূরবর্তী শাখাটি থেকে আমার কাজ চালিয়ে যেতে পারি?

আমি ইতিমধ্যে এসও অনুসন্ধান করেছি এবং স্থানীয়ভাবে দূরবর্তী শাখায় চেক করে দেখার কোনও প্রভাব নেই।


1
আমি জানি যে গৃহীত উত্তরের 1280 আপ-ভোট রয়েছে, তবে আপনার সত্যিকার অর্থে @TTT এর দ্বারা গৃহীত উত্তরটি পরিবর্তন করা উচিত।
জেমি

উত্তর:


1285
  1. নিশ্চিত করুন যে আপনি যে শাখাটি প্রতিস্থাপন করছেন তা আপনি পরীক্ষা করে ফেলেছেন (জোল্টনের মন্তব্য থেকে )।
  2. ধরে নিই যে মাস্টার আপনি যে স্থানীয় শাখাটি প্রতিস্থাপন করছেন তা হ'ল এবং "উত্স / মাস্টার" হল এমন রিমোট শাখা যা আপনি পুনরায় সেট করতে চান:

    git reset --hard origin/master
    

এটি আপনার স্থানীয় হেড শাখাটিকে উত্স / মাস্টার হিসাবে একই সংশোধন হিসাবে আপডেট করে এবং --hardএই পরিবর্তনটিকে সূচি এবং কর্মক্ষেত্রেও সিঙ্ক করবে।


4
আপনার পরামর্শের জন্য ধন্যবাদ, আমি ইতিমধ্যে --hard এবং --for ব্যবহার সম্পর্কে এতটা 'ভয় পেয়েছি', তাই আমি কেবল সমাধানটি বেছে নিয়েছি যা সেগুলি ব্যবহার করে না।
ইয়ামসালাত

13
@ কনস্টান্টিন লাইভিন: আহ হ্যাঁ, এই বিকল্পগুলির নামকরণ বিরক্তিকর। git resetডিফল্টরূপে আপনার বর্তমান শাখাটিকে পুনরায় সাজিয়ে তুলবে এবং সূচকটি সিঙ্ক করবে। --softসূচক আপডেট করা এড়িয়ে যাবে, --hardকর্মক্ষেত্রটিও সিঙ্ক করবে। আমার নিজের অভিজ্ঞতা --hardবেশিরভাগ সময় ব্যবহার করছে , যখন আমি শেষ প্রতিশ্রুতিটি পূর্বাবস্থাপন করতে চাই (যা কেবলমাত্র git reset HEAD^)
আরাকনিড

9
গিট নিয়ে আরও অভিজ্ঞতা থাকার পরে আমি নিশ্চিত যে এটি একটি আরও ভাল সমাধান, ধন্যবাদ thanks
ইয়ামসালাত

24
সম্ভবত আপনাকে প্রথমে আনতে হবে:git fetch origin remote_branch
বি 1 আর 3 কে

53
আপনার নোট করা উচিত যে এটি আপনার বর্তমানে যে কোনও শাখাকে মাস্টার এর বিষয়বস্তুর সাথে প্রতিস্থাপন করবে । সুতরাং আপনি যদি উদাহরণস্বরূপ কোনও বৈশিষ্ট্য-শাখা থাকেন তবে এটি এর সমস্ত কমেটগুলি প্রতিস্থাপন করবে master, তাই নিশ্চিত করুন যে আপনি যে শাখাটি প্রতিস্থাপন করছেন তা প্রথমে পরীক্ষা করে দেখেছেন।
জুলটান

218

এটি তিনটি পদক্ষেপের মতোই সহজ:

  1. আপনার স্থানীয় শাখা মুছুন: git branch -d local_branch
  2. সর্বশেষতম দূরবর্তী শাখাটি আনুন: git fetch origin remote_branch
  3. রিমোটের ভিত্তিতে স্থানীয় শাখাটি পুনর্নির্মাণ করুন: git checkout -b local_branch origin/remote_branch

7
আসলে @ আরাকনিদ যা বলেছিলেন তা সঠিক এবং আরও সংক্ষিপ্ত। আমি এটি পরীক্ষা করেছি এবং আপনিও এটি চেষ্টা করে দেখতে পারেন।
অ্যাডামস্মিথ

বাহ, গিট চেকআউট-বি স্থানীয়_ব্রাঞ্চ উত্স / রিমোট_ ব্রাঞ্চ দুর্দান্ত! আমি সর্বদা দুটি পৃথক কমান্ডে এটি করেছি। ধন্যবাদ!
কেন্দেপেলচিন

11
git branch -D local_branchআপনার শাখাটি মার্জ না করা হলে আপনাকে প্রথম ধাপে করার দরকার হতে পারে ।
szeryf

ধন্যবাদ, গিটফ্লো ব্যবহার করার সময় আমার খুব কষ্ট হয়েছিল, একটি শাখা প্রকাশ করার পরে এটি শেষ করার পরে, আমি মুছে ফেলা শাখায় যেতে চেয়েছিলাম, এবং আপনার সমাধানটি কেবলমাত্র কাজ করেছিল, টান কাজ করে বলে মনে হচ্ছে না .. বা আমি বিস্মৃত হই এটি ভালভাবে ব্যবহার করবেন না -
ডিসেসাল

2
আমাদের নিশ্চিত করা উচিত যে বর্তমান শাখাটি মুছতে হবে না।
a_secenthusiast

43
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

- ট্র্যাক অংশটি কী করে?
ইনিস্ট

3
@ গিটসিঙ্ক, এটিই git help branchবলছে --trackWhen creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out. আমি উত্তরে এই আদেশটি স্থির করেছি। বিষয়টি উত্থাপন করার জন্য ধন্যবাদ
সাইলেশ

সুতরাং সাধারণ পদে: এটি নতুন শাখায় দূরবর্তী URL যুক্ত করে। তাই তারা সর্বকালের জন্য সিঙ্কে রয়েছে। তাই কথা বলতে.
একনিস্ট

2
আপনি বলতে পারেন যে এটি কেবল সুবিধার জন্য। যদি আপনি তা করেন তবে git statusএটির সাথে সম্পর্কিত থাকলে যদি আপনার স্থানীয় শাখা দূরবর্তী শাখার সামনে বা পিছনে থাকে তবে এটি প্রতিবেদন করবে। অতিরিক্তভাবে, আপনি যদি ইতিমধ্যে আপনার শাখাকে ট্র্যাক করতে সেট করে থাকেন তবে আপনি পূর্ণের পরিবর্তে git pull(বা push) git pull <remote> <branch>করতে পারেন <remote/branch>
সাইলেশ

22

প্রত্যন্ত শাখা দিয়ে সবকিছু প্রতিস্থাপন করুন; তবে , একই প্রতিশ্রুতি থেকে আপনার স্থানীয় শাখাটি চালু রয়েছে:

git reset --hard origin/some-branch

বা , দূরবর্তী শাখা থেকে সর্বশেষতম পান এবং সবকিছু প্রতিস্থাপন করুন:

git fetch origin some-branch
git reset --hard FETCH_HEAD

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

git clean -fd

git cleanকমান্ড আমার জন্য এটি করেনি। git reset hard origin/masterআনরে্যাকড ফাইলগুলি মুছবেন না। ধন্যবাদ!
মর্নোর

9

বর্তমান স্থানীয় শাখাটিকে রিমোটের সাথে প্রতিস্থাপনের সবচেয়ে নিরাপদ এবং সবচেয়ে সম্পূর্ণ উপায়:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

stashলাইন যে পরিবর্তন করেছেন তা সংঘটিত হয়নি পরিমাণ সঞ্চয় হয়। branchলাইন একটি আলাদা নাম আপনার শাখা চলে আসে, মূল নাম freeing। fetchলাইন দূরবর্তী সর্বশেষ কপি প্রাপ্ত করে। checkoutলাইন একটি ট্র্যাকিং শাখা হিসেবে মূল শাখা recreates।

বা বাশ ফাংশন হিসাবে:

replaceWithRemote() {
    yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

যা বর্তমান শাখার নাম বদলে_মাস্টার_98 ডি 258f এর মতো করে রাখে।


git stash popএই কর্মপ্রবাহে অন্তর্ভুক্ত করতে চাই । আপনি যদি আপনার স্ট্যাশ করা ফাইলগুলি পুনরায় প্রয়োগ করতে চান।
11:56

স্ট্যাশেড শাখা দিয়ে আপনি কী করবেন? আমি আশঙ্কা করছি এটি ভবিষ্যতের কোথাও আবার ফিরে আসবে যা আমি ভুলে গিয়েছিলাম তার জন্য।
স্কট বিগস 1

1
@ স্কটবিগস যদি আপনি স্ট্যাশড শাখাটি মুছে ফেলতে চান তবে "গিট স্ট্যাশ ক্লিয়ার" ব্যবহার করুন।
মার্ক এ ডারহাম

4

আমি একাকী অবাক হয়ে এখনও কেউ এর উল্লেখ করেনি; আমি প্রায় প্রতিদিন এটি ব্যবহার:

git reset --hard @{u}

মূলত, @{u}প্রবাহিত শাখার জন্য কেবল সংক্ষিপ্তরূপে আপনার বর্তমান শাখাটি ট্র্যাক করছে। উদাহরণস্বরূপ, এটি সাধারণত সমান হয় origin/[my-current-branch-name]। এটি দুর্দান্ত কারণ এটি শাখা অজ্ঞাব্য।

git fetchদূরবর্তী শাখার সর্বশেষতম অনুলিপিটি নিশ্চিত করার জন্য প্রথমে নিশ্চিত হন ।


1
এটি দেখতে খুব সুন্দর লাগছে, আমি শাখার নামটি পুনরায় সেট করার জন্য অনুলিপি করে আটকানোতে ক্লান্ত হয়ে পড়েছি!
পেড্রোকট 92

1
আমি কয়েকটি উদাহরণ পেয়েছি যেখানে আমি পুরানো প্রশ্নের উত্তর যুক্ত করেছি এবং আমার উত্তরগুলি লিডারবোর্ডে তাদের কাজ করেছে। আমি আশা করি এটি একটি করবে।
জেমি

3

আরও ভাল জ্ঞানের দৃষ্টিভঙ্গি ছড়িয়ে দেওয়ার জন্য এই উত্তরটি সম্পাদনা করে একাধিক উপায়ে এটি করা যেতে পারে।

1) হার্ড রিসেট

আপনি যদি রিমোট বিকাশকারী শাখা থেকে কাজ করছেন, আপনি নীচের মতো দূরবর্তী শাখায় শেষ প্রতিশ্রুতিতে হেডকে পুনরায় সেট করতে পারেন:

git reset --hard origin/develop

2) বর্তমান শাখা মুছুন, এবং দূরবর্তী সংগ্রহস্থল থেকে আবার চেকআউট করুন

বিবেচনা করে, আপনি স্থানীয় রেপোতে শাখা বিকাশে কাজ করছেন যা দূরবর্তী / বিকাশকারী শাখার সাথে সিঙ্ক করে, আপনি নীচের মত কাজ করতে পারেন:

git branch -D develop
git checkout -b develop origin/develop

3) মার্জ বাতিল করুন

যদি আপনি খারাপ সংশ্লেষের মধ্যে থাকেন (ভুলভাবে ভুল শাখার সাথে করা হয়েছে), এবং নীচের মতো সর্বশেষ শাখায় ফিরে যাওয়ার জন্য মার্জটি এড়াতে চেয়েছিলেন:

git merge --abort

4) রিবেস বাতিল করুন

আপনি যদি কোনও খারাপ রিবেস-এর মধ্যে থাকেন তবে আপনি নীচে হিসাবে পুনর্বাসনের অনুরোধটি বাতিল করতে পারেন:

git rebase --abort

2

@ লরেন্টের @ হুগো যেমন বলেছিলেন তেমন আপনি করতে পারেন বা আপনি যে কমিটগুলি git rebaseপরিত্রাণ পেতে চান তা মুছতে ব্যবহার করতে পারেন , যদি আপনি জানেন যে কোনটি। আমি git rebase -i head~Nএই ধরণের ক্রিয়াকলাপের জন্য (যেখানে এন একটি সংখ্যা, আপনাকে সর্বশেষ এন দ্বারা পরিচালিত ম্যানিপুলেট করার অনুমতি দেয়) ব্যবহার করার প্রবণতা রয়েছে ।


আসলে এটি ছিল 'গিট রিবেস' কমান্ড যা পুরো বিষয়টিকে বিশৃঙ্খলা করেছিল, তারপরে কিছু জোর করে একীভূত হয়ে যায় এবং কঠোর পুনরায় সেট করা হয় .. যাইহোক, আমি যা খুঁজছিলাম তা কেবল মার্জ না করে দূরবর্তী সার্ভার থেকে পুরো রেপো টানানোর সহজ উপায়।
ইয়ামসালাত

2

নির্বাচিত উত্তর একেবারে সঠিক , তবে এটা আমার সর্বশেষ সঙ্গে ছেড়ে না কমিট / push কর্মের ...

সুতরাং আমার জন্য:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

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

তাই পুনরায় সেট করুন

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

1

আপনি যদি বর্তমানে শাখাগুলি আপডেট করতে চান যা বর্তমানে চেক আউট নেই আপনি এটি করতে পারেন:

git fetch -f origin rbranch:lbranch

0

নির্বাচিত ব্যাখ্যায় যেমন সরবরাহ করা হয়েছে, গিট রিসেট করা ভাল। তবে আজকাল আমরা প্রায়শই সাব-মডিউলগুলি ব্যবহার করি: সংগ্রহস্থলের অভ্যন্তরে সংগ্রহস্থল। উদাহরণস্বরূপ, আপনি যদি আপনার প্রকল্পে জেডএফ 3 এবং জিকুয়ারি ব্যবহার করেন তবে আপনি সম্ভবত তাদের মূল সংগ্রহস্থলগুলি থেকে ক্লোন করার জন্য চান। এই ক্ষেত্রে গিট রিসেট যথেষ্ট নয়। আমাদের সাবমোডিয়ালগুলিকে আমাদের সংগ্রহস্থলে সংজ্ঞায়িত সেই সঠিক সংস্করণে আপডেট করতে হবে:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

আপনি প্রতিটি উপ-মডিউলটির ওয়ার্কিং ডিরেক্টরিতে পুনরাবৃত্তভাবে (সিডি) আসবেন এবং এটি চালিত হবে ঠিক একই:

git submodule update

এবং এটি থেকে খুব আলাদা

git checkout master
git pull

কারণ উপ-মডিউলগুলি শাখা নয় বরং প্রতিশ্রুতিবদ্ধ নির্দেশ করে।

সেক্ষেত্রে আপনি যখন 1 বা ততোধিক সাবমডিউলগুলির জন্য ম্যানুয়ালি কিছু শাখা চেক আউট করতে পারেন তখন আপনি চালাতে পারেন

git submodule foreach git pull

দয়া করে একটি ব্যাখ্যা সরবরাহ করুন, বিশেষত এই পুরানো প্রশ্নের উত্তর দেওয়ার সময়। আপনার উত্তর যেমনটি তেমন সহায়ক নয়।
এরিক এ

গৃহীত উত্তর ইতিমধ্যে প্রস্তাব git reset --hard। এটি সামান্য মান যুক্ত করে।
ফেব্রুয়ারী 15'15 এ ফ্লোরিসা

0
git reset --hard
git clean -fd

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


-6

কুরুচিপূর্ণ তবে সহজ উপায়: আপনার স্থানীয় ফোল্ডারটি মুছুন এবং আবার দূরবর্তী সংগ্রহস্থলটিকে ক্লোন করুন।


10
বা কেবল শাখাটি মুছুন এবং আবার এটি দেখুন।
লরেন্ট

হ্যাঁ, আমি অনুমান করি যে আমি কী করতে যাচ্ছি যদি আমি খুব কম '
কুরুচিপূর্ণ

2
কদর্য কখনও কখনও এটি দরকারী। আমি আশা করি লোকেরা কেবলমাত্র প্রচলিত উপায় না বলে জিনিসগুলিকে হ্রাস করতে না পারে: ডাউনভোটিংয়ের আরও যুক্তিসঙ্গত কারণ থাকতে হবে ... এবং এটি দেওয়া উচিত। গিট একটি জিনিস যা ফলাফল অর্জন করে। এটি কোনও ধরণের পবিত্র পাঠ নয়।
মাইকে রডেন্ট

3
নিম্নবর্ণগুলি আমি বুঝতে পারি না :-( হ্যাঁ, এটি অনুগ্রহহীন ইত্যাদি etc. তবে এটি কিছু ক্ষেত্রে সবচেয়ে ভাল কাজ করতে পারে ... দুঃখিত @ হুগো
রৌপ্যপ্রহর

@ হুগো, একমত আমার স্থানীয় বিকাশকারী শাখার কাছে কিছু রহস্যজনক এবং দুর্গন্ধযুক্ত ঘটনা ঘটেছে এবং টিম লিড এবং ইঞ্জিনিয়ারিং ম্যানেজার উভয়ই সুনির্দিষ্ট সমাধানের মধ্যে কেবল (জিপ, অনুলিপি এবং আমার বৈশিষ্ট্যটির কাজটি সংরক্ষণ করুন) এর জন্য স্থানীয় রেপো এবং পুনরায় সংশোধন করার পরামর্শ দিয়েছিলেন।
অমিতাবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.