কীভাবে একটি শাখায় 'গিট টান' যা এখনকার নয়?


126

আপনি চালাতে যখন git pullউপর masterশাখা, এটি প্রথাগতভাবে থেকে pulls origin/master। আমি ডাকা একটি ভিন্ন শাখায় আছি newbranch, তবে আমার একটি কমান্ড চালানো দরকার যা একটি git pullথেকে origin/masterআসে masterতবে git checkoutটান শেষ হওয়ার পরে আমি নির্বাচিত শাখাটি পরিবর্তন করতে দৌড়াতে পারি না । এই কাজ করতে একটি উপায় আছে কি?

কিছু পটভূমি দেওয়ার জন্য, সংগ্রহস্থল একটি ওয়েবসাইট সঞ্চয় করে। আমি কিছু পরিবর্তন করেছি newbranchএবং ওয়েবসাইটটিতে স্যুইচ করে সেগুলি স্থাপন করেছি newbranch। এখন এই পরিবর্তনগুলি masterশাখায় প্রবাহিত করা হয়েছে , আমি আবারও masterব্রাঞ্চে ওয়েবসাইটটি স্যুইচ করার চেষ্টা করছি । এই মুহুর্তে, newbranchএবং origin/masterঅভিন্ন, তবে masterপিছনে রয়েছে origin/masterএবং আপডেট হওয়া দরকার। সমস্যাটি হ'ল, আমি যদি এটি প্রচলিত পদ্ধতিতে করি তবে:

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

আমাকে উপরের ( git checkout master && git pull) এর মতো অর্জন করতে হবে তবে প্রক্রিয়া চলাকালীন কাজের ডিরেক্টরিটি পূর্ববর্তী সংশোধনীতে পরিবর্তন না করেই করতে হবে।


@ ফি: আমার মনে হয় না এটি কার্যকর হবে, কারণ আমি আছি newbranchএবং সেখানে লুকানোর মতো কিছুই নেই!
মার্ভিনিয়াস

আমি একটি নতুন ডিরেক্টরিতে ক্লোন করব, নিউ ব্র্যাঙ্ককে মাস্টারের সাথে একীভূত করব, মাস্টারটিকে আবার নিউব্র্যাঞ্চে মার্জ করব, তারপরে আপনি যেখানে থেকে গিট টানুন। মাস্টার এবং নিউব্র্যাঞ্চ একই হবে।
এট

@ এট তিনি কেবল এখনই তার বর্তমান ডিরেক্টরিতে git fetch; git merge origin/masterভিতরে থেকে কাজ করে তা করতে পারেন newbranch। সংগ্রহস্থলের সম্পূর্ণ দ্বিতীয় অনুলিপি ক্লোনিংয়ের শূন্য সুবিধা রয়েছে।
মেগার

3
ঘনিষ্ঠভাবে সম্পর্কিত: stackoverflow.com/questions/3216360/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


5

আপনি একটি স্পর্শ করতে চান না এমন একটি কর্মশালা পেয়েছেন, সুতরাং অন্য একটি ব্যবহার করুন। ক্লোনটি সস্তা, এটি এটির জন্য তৈরি।

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload

এখানে অন্যান্য সমস্ত উত্তরগুলির সাথে সমস্যাটি হ'ল, তারা আসলে টানটান করে না। আপনার যদি মার্জ বা রিবেসটির দরকার পড়ে যা আপনার কাছে টান সেট আপ করেছে, আপনার অন্য একটি ওয়ার্ক্রিট এবং উপরের পদ্ধতিটি দরকার। অন্যথায় শুধু git fetch; git checkout -B master origin/masterকরবে।


2
যখন আপনি চালাতে git checkout masterআপনি পুরানো চেকআউট করব masterশাখা কারণ আপনার নয় করেছ git pullমধ্যে mainমূল / মাস্টার সাথে সিঙ্ক্রোনাইজ করতে ফোল্ডার। এটাই আমি এড়াতে চাইছি।
মালভাইনাস

ক্লোনটি দ্বারা সম্পাদিত চেকআউটটি পুরানো মাস্টারের, তবে সেই চেকআউটটি একটি ডিরেক্টরিতে ওয়েবসার্ভারের দিকে তাকানো নয়। শেষে মাস্টার চেকআউটটি সম্পূর্ণরূপে মার্জ হওয়া মাস্টারের যা পুরোপুরি থেকে পিছনে ঠেলে দেওয়া হয়েছিল।
jthill

Line নং লাইনে আপনি মার্জড (আপডেট হওয়া )টিকে masterআবার ফিরে যান origin, তবে আমি বিশ্বাস করি না যে আপনার চূড়ান্ত চেকআউটটি এই আপডেট হওয়া master। ডিরেক্টরিতে শাখাটি git pullআপডেট করার মতো কোনও কিছুই নেই , সুতরাং আমি যদি কিছু মিস না করি তবে আপনার আদেশগুলি কেবল তার নিজের উপর চালানো এবং পুরানো গাছ পাওয়ার থেকে আলাদা নয় । আপনি যদি ঘনিষ্ঠভাবে লক্ষ্য করেন তবে আপনি যে ডিরেক্টরিটি আপ mastermaingit checkout mastermastermain
স্ট্রিমের সাথে যোগাযোগ করছেন সেগুলিতে

ভাল, আপনি এটি একটি পরীক্ষার রেপোতে চেষ্টা করতে পারেন, বা পুশ ডক্সটি পরীক্ষা করতে পারেন।
jthill

1
@ jwg কি তুলনা করুন, দয়া করে? সমস্ত ওপি'র বর্ণিত প্রয়োজনীয়তার বিষয়ে নিশ্চিত হন sure
jthill

163

সোজা: সাম্প্রতিক শাখা থেকে বর্তমানে সন্ধানী না হওয়া শাখার মাস্টারে আপডেট করা :

git fetch origin master:master

যেখানে উৎপত্তি আপনি বর্তমানে কিছু শাখা যেমন আউট চেক করা হয় আপনার রিমোটের এবং ডেভ

আপনি যদি একবারে নির্দিষ্ট শাখা ছাড়াও আপনার বর্তমান শাখাটি আপডেট করতে চান:

git pull origin master:master

4
এইচ, মনে হয় এটি সবসময় কাজ করে না, যদিও; আমি সবেমাত্র আমার ডাব্লুআইপি শাখায় একীভূত হওয়ার জন্য অনুরোধ জানাই
আন্ডারস্কোর_১

আমার কাছে একইভাবে
গ্রেগ

1
আমার জন্য কাজ করেছেন ... যদি এটি সংশ্লেষের অনুরোধ জানায় তবে আমি ভাবছি আপনার শাখায় এমন কোনও পরিবর্তন রয়েছে যা আপনি আপডেট করছেন যা উত্স প্রতিশ্রুতিবদ্ধ নয়
স্কিমে

2
এটি কীভাবে কাজ করার কথা? এটি আমার পক্ষে কাজ করে না, এটি কেবলমাত্র আমার বর্তমানে পরীক্ষিত শাখায় উত্স / মাস্টারকে একীভূত করার চেষ্টা করে।
মোঘেরেহিজদে

3
এটি বর্তমান শাখায় মাস্টার টানছে। এটি অবশ্যই যা চাওয়া হচ্ছে তা নয়। যদি আপনি আনতে টান পরিবর্তন করেন তবে ঠিক এটির জন্য বলা হবে।
জেফ ওলস্কি

90

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

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

2
এটি সর্বোত্তম, কারণ এটি অনির্দিষ্ট স্থানীয় পরিবর্তনের সাথে কাজ করে।
টমাসজ গ্যান্ডার

2
আপনি যদি সর্বাধিক পরিবর্তনগুলি করতে চান তবে তা করতে পারেন git fetch origin master:mastergit fetchনিজেই ধরে নিবে আপনি বর্তমান শাখাটি আপডেট করবেন বলে বোঝানো হয়েছে অন্য কোনও শাখা নয়।
জন লিডেগ্রেন

2
এটি সহজ এবং সর্বাধিক প্রত্যক্ষ উত্তর। এটি গ্রহণযোগ্য উত্তর আইএমও হওয়া উচিত।
Keego

@ জনলিডগ্রেন - ব্যতীত এটি সর্বদা ইচ্ছা মতো কাজ করে না। স্ট্যাকওভারফ্লো . com/a/42902058/274579 উত্তরের মন্তব্য দেখুন ।
ysap

22

দেখা যাচ্ছে যে, উত্তরটি প্রতারণামূলকভাবে সহজ:

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

এই আপনি আপডেট করতে পারবেন masterনা হওয়া পর্যন্ত স্যুইচ ছাড়া শাখা পর এটা আপডেট করা হয়েছে।


11
আপনি কীভাবে জিজ্ঞাসা করেছেন এটি এটি করে না।
jthill

উপরের মন্তব্যে যেমন বলা হয়েছে, আপনি যে প্রশ্নটি জিজ্ঞাসা করেছেন তা আসলে উত্তর নয়, আপনি যে প্রশ্নটি ক্ষত করেছিলেন তা নয় isn't আপনার প্রশ্নটি আপডেট করা উচিত যাতে এটি কোনও শাখায় পরীক্ষা না করে মার্জ করার বিষয়ে কম নির্দিষ্ট করে দেওয়া হয় এবং প্রথমে পুরানো সংস্করণটি পরীক্ষা না করেই রিমোটে উপলব্ধ একটি শাখার নতুন সংস্করণে সরাসরি চলে যাওয়া সম্পর্কে আরও কিছু।
মেগার

1
আমি এখানে
সন্ধানের

1
ওপি যা চেয়েছিল তা নয়, তবে আমাকে সত্যই সাহায্য করেছিল।
মার্সেল ব্রো

1
@ অননিম, ওপি যা চেয়েছিল তা নয়? আপনি ওপি বলতে চাইছেন যে এই প্রশ্নের উত্তর দিয়েছে?
smac89

12

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

যেহেতু আপনি আসলে আপনার উৎপাদন এনভায়রনমেন্ট (আমি আশা করি) কোড সংগঠনের করছি না, আপনি আসলে না প্রয়োজন একটি শাখা চেক আউট আছে। আপনি কেবল git fetchআপনার দূরবর্তী রেফগুলি আপডেট করতে এবং তারপরে কার্যত git checkout origin/masterডিরেক্টরিটি বর্তমানে নির্দেশিত প্রতিশ্রুতিতে সরাসরি স্থানান্তর করতে একটি করতে পারেন origin/master। এটি আপনাকে বিচ্ছিন্ন মাথাব্যবস্থায় ফেলে দেবে, তবে আবার আপনি কোডটি প্রতিশ্রুতি দিচ্ছেন না বলে কিছু যায় আসে না।

এটি আপনি যে ক্ষুদ্রতম গর্তটি পেতে যাচ্ছেন, তবে আমি যেমন বলেছি, একটি গর্ত এখনও বিদ্যমান; checkoutপারমাণবিক নয়।


আমি স্থাপনার জন্য গিট ব্যবহারের সীমাবদ্ধতাগুলি বুঝতে পারি, সমস্যাটি হ'ল এই ক্ষেত্রে গর্তটি এক সেকেন্ডের চেয়ে কম কয়েক মিনিটের পরিবর্তে কয়েক মিনিট দীর্ঘ হতে চলেছে। origin/masterযদিও চেক আউট সম্পর্কে দুর্দান্ত ধারণা , এটি সম্ভবত কৌশলটি করতে পারে।
মার্ভিনিয়াস

গর্ত "মিনিট" দীর্ঘ করে তোলে কি? নেটওয়ার্ক জুড়ে ডেটা টানছেন? শুধু একটি না git fetchআগে আপনি অন্য কিছু করতে এবং পথ থেকে ডেটা প্রকৃত স্থানান্তর পেতে।
মেগার

এটি কয়েক মিনিট দীর্ঘ কারণ একটি (এখন) অবিরত ফাইল কোনও পূর্ববর্তী কমিট দ্বারা ওভাররাইট করা হবে। সুতরাং আমি ফাইলটি অনুলিপি করতে হবে, গিট স্টাফগুলি করতে হবে, তারপরে এটি আবার রেখে দিতে হবে। 'মিনিট দীর্ঘ' আমার টাইপিং গতি থেকে আসে। (হ্যাঁ আমি এটির চিত্রনাট্য করতে পারলাম তবে
এটুকু বলতে পারা গেল

3

আপনি এর জন্য আপডেট-রেফ ব্যবহার করতে পারেন:

git fetch
git update-ref refs/heads/master origin/master
git checkout master

মনে রাখবেন যে এটি মাস্টার শাখায় স্থানীয় কোনও প্রতিশ্রুতি ফেলে দেবে। আপনার ক্ষেত্রে কোনও কিছুই থাকবে না তাই এটি ঠিক আছে। স্থানীয় কমিটগুলি যেখানে রয়েছে সেখানে অন্যান্য লোকেরা এটি করার চেষ্টা করছে, আমি মনে করি এটি সম্ভব নয়, যেহেতু একীকরণ কেবলমাত্র বর্তমান শাখায় চালানো যেতে পারে।


এটি কি সমান হবে git branch --force master origin/master? এই বাহিনী স্থানীয় মাথা masterবিন্দু প্রধান originগুলিmaster
Keego

2

মালভাইনাসের সমাধান আমার জন্য কাজ করে

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

শুধু ত্রুটি দিন


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

সুতরাং আমি -D বিকল্প দিয়ে চালাচ্ছি

ধন্যবাদ


0

git fetch origin master:master

  • "পুলস" (আসলে আনছে) master
  • আপনার যদি এমন পরিবর্তন হয় masterযা এখনও ধাক্কা দেয় না তবে origin/masterআপনার মাস্টারের সাথে মিশে গেছে।
  • যদি একত্রীকরণ বিরোধ রয়েছে, আপনাকে প্রথমে এগুলি সমাধান করতে হবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.