কীভাবে একটি শাখা দ্রুত ফরোয়ার্ড করবেন?


249

দীর্ঘদিন ধরে একটি শাখায় বিকাশ করার পরে আমি মাস্টার স্যুইচ করেছি। লগটি দেখায়:

167 টি কমিট করে আপনার শাখাটি 'উত্স / মাস্টার' এর পিছনে রয়েছে এবং দ্রুত এগিয়ে যেতে পারে।

আমি চেষ্টা করেছিলাম:

git checkout HEAD

এর কোনও প্রভাব নেই। এটি কারণ আমি মাস্টার সম্পর্কে একটি অন্তর্বর্তী কমিট চেকআউট করেছি।

মাষ্টারকে কীভাবে মাথায় রাখবেন?


6
git checkout HEADকখনই কিছু করে না HEADইতিমধ্যে পরীক্ষিত প্রতিশ্রুতি মানে।
এমেরে ট্যাপসি

উত্তর:


244

এরকম:

git checkout master
git pull origin

origin/masterশাখাটি আনা এবং একীভূত করা হবে (আপনি কেবল বলতে পারেন যে git pullউত্সটি ডিফল্ট।


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

353

ব্যবহার করে দেখুন git merge origin/master। আপনি যদি নিশ্চিত হতে চান যে এটি কেবল দ্রুত-অগ্রসর হয় তবে আপনি বলতে পারেন git merge --ff-only origin/master


4
আপনার রিমোটটিতে কিছু প্রমাণীকরণের হুপ রয়েছে তখন এটি ব্যবহার করা ভাল। আমি যখন একটি শাখায় টানছি, আমাকে প্রমাণীকরণ করতে হবে। তারপরে, যখন আমি অন্য শাখায় স্যুইচ করি (যেমন, আমার পরিবর্তনগুলি চেরি-বাছাই করতে), আমি এই mergeআদেশটি ব্যবহার করতে পছন্দ করি যাতে আমাকে পুনরায় প্রমাণীকরণ করতে না হয়।
রাস্টি দ্যবয়েরবোট

30
--ff-onlyঅত্যন্ত দরকারী।
লুক

4
আমি জানি না origin/masterঅংশটি প্রয়োজন কিনা বা এটি বুদ্ধিমানভাবে ডিফল্ট হয় কিনা তবে দ্রুত অগ্রবর্তী হওয়ার জন্য একটি উপাস তৈরি করা আমার পক্ষে কার্যকর মনে হয়েছিল তাই আমি নিশ্চিত করতে চেয়েছিলাম যে প্রবাহের শাখাটি এখানে হার্ড কোডিংয়ের পরিবর্তে ব্যবহৃত হয়েছে origin/master: ff = merge --ff-only @{u}( @{u}আপস্ট্রিম) ।
Thor84no

2
না না প্রস্তাব উত্তর বেশী ভালো আপনি অফলাইনে যদি
তারিখে Jacek Pietal

1
আপনি কি ব্যাখ্যা করতে পারেন যে একটি সাধারণ টান একই জিনিসটি কেন করে না? এছাড়াও, টানা কি এখনও প্রয়োজন যদি আমরা এটি করি?
জুজু কর্নেলিউ

40

আপনার পরিস্থিতিতে, git rebaseকৌতুক করতে হবে। যেহেতু আপনার কোনও পরিবর্তন নেই যা মাস্টারের নেই, গিটটি কেবল দ্রুত-এগিয়ে forward আপনি যদি একটি রিবেস ওয়ার্কফ্লো নিয়ে কাজ করছেন, তবে এটি আরও পরামর্শ দেওয়া হতে পারে, কারণ আপনি যদি গণ্ডগোল করেন তবে আপনি মার্জ কমিট দিয়ে শেষ করবেন না।

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean

1
এবং আমার জন্য খুব দরকারী যেহেতু আমাদের গিট পুল ব্যবহার করার কথা নয়!
স্টিফান

এমনকি যদি আপনার কিছু পরিবর্তন মুলতুবি থাকে, আপনি সর্বদা লুকিয়ে থাকতে পারেন এবং পুনর্বাসনা করতে পারেন, আমি জানি না এটি 'সঠিক' উপায় কিনা তবে আশ্চর্য কাজ করে।
এফএন।

28
git checkout master
git pull

কাজ করা উচিত।

আপনি প্রতিবার "আপনার শাখা পিছনে" বার্তাটি পাবেন যখন আপনি মাস্টার থেকে আলাদা কোনও শাখায় কাজ করবেন , কেউ মাস্টার পরিবর্তন করে এবং আপনি গিট টানেন।

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

এখন উত্স / মাস্টার রেফারেন্সটি টানা হয়েছে তবে আপনার মাস্টার এটির সাথে একীভূত হয়নি

(branch) $ git checkout master
(master) $ 

এখন মাস্টার উত্স / মাস্টার পিছনে এবং দ্রুত ফরোয়ার্ড করা যেতে পারে

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

এখন আপনার মাস্টার এবং উত্স / মাস্টার সিঙ্কে রয়েছে


13

আপনি যদি অন্য কোনও শাখায় দাঁড়িয়ে থাকেন এবং মাস্টারের নতুন সংস্করণটি চেকআউট করতে চান তবে আপনি এটিও করতে পারেন

git checkout -B master origin/master


9

যে কেউ, Fast Forward চায় তারা না যে শাখা চেক আউট ছাড়া (নিজেই সহ) অন্য দূরবর্তী শাখায়, আপনি কি করতে পারেন:

git fetch origin master:other

এটি মুলত ফাস্ট ফরোয়ার্ড সূচী otherথেকে origin/masterআপনি এ নেই otherশাখা। আপনি একাধিক শাখা এইভাবে দ্রুত ফরোয়ার্ড করতে পারেন।

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

git fetch origin master:master other:other etc:etc

2

কোনও জটিলতার প্রয়োজন নেই কেবল আপনার শাখায় দাঁড়ানো এবং এটি আমার জন্য কাজ করেছে এমন গিট টান

অথবা, দ্বিতীয় চেষ্টা হিসাবে গিট পুল টান উত্সাহী মাস্টার কেবলমাত্র যদি আপনি প্রথম কমান্ডটি দিয়ে দুর্ভাগ্য হন


0

করার রি-বেসের ফলে বর্তমান স্থানীয় যে ব্যক্তি অনুসরণ করে সর্বশেষ দূরবর্তী রাষ্ট্র উপরে স্থানীয় পরিবর্তনগুলি চলন্ত শাখা:

$ git fetch && git rebase

আরও সাধারণভাবে, দ্রুত পরিবর্তন এবং স্থানীয় পরিবর্তনগুলি ( হার্ড রিসেট ) বাদ দিতে *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

থেকে দ্রুত এগিয়ে এবং স্থানীয় পরিবর্তনগুলি (রাখতে রি-বেসের ফলে ):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* - প্রথমে অনিচ্ছাকৃত হার্ড রিসেটের ফলে ঘটে যাওয়া পরিবর্তনটিকে পূর্বাবস্থায় ফিরিয়ে আনতে git reflog, যা বিপরীত ক্রমে হেডের অবস্থা প্রদর্শন করে, হেডটি হ্যাশটি রিসেট অপারেশনের আগে নির্দেশ করেছিল (সাধারণত সুস্পষ্ট) এবং সেই হ্যাশে শাখাটি পুনরায় সেট করে।


0

আপনার ক্ষেত্রে, দ্রুত-ফরওয়ার্ড করার জন্য, চালান:

$ git merge --ff-only origin/master

এটি --ff-onlyবিকল্পটি ব্যবহার করে git merge, যেমন প্রশ্নটি "ফাস্ট-ফরোয়ার্ড" এর জন্য বিশেষভাবে জিজ্ঞাসা করে।

এটির থেকে একটি অংশ এখানে git-merge(1)আরও দ্রুত-ফরওয়ার্ড বিকল্পগুলি দেখায়:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

আমি প্রায়শই পর্যাপ্ত-ফরোয়ার্ড করে থাকি যে এটি একটি উপন্যাসের ওয়্যারেন্ট করেছে:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

এখন আমি এটি দ্রুত-ফরওয়ার্ডে চালাতে পারি:

$ git ff

-2

আপনার শাখার পয়েন্টারটি হেডে সরান:

git branch -f master

আপনার শাখা masterইতিমধ্যে বিদ্যমান, সুতরাং গিটটি আপনাকে এটি ওভাররাইট করার অনুমতি দেবে না, যদি না আপনি ব্যবহার করেন ... -f(এই যুক্তিটি দাঁড়িয়েছে --force)

অথবা আপনি পুনরায় ব্যবহার করতে পারেন:

git rebase HEAD master

এটি নিজের ঝুঁকিতে করুন;)


1
এটি চেষ্টা করবেন না। আপনার যদি নিম্নলিখিত পরিস্থিতিতে খারাপ জিনিসগুলি ঘটে থাকে: C0 --- C1 --- C2 --- C3 --- C4 (মাস্টার)। সি0 --- সি 1 --- সি 2 --- বি 1 --- বি 2 --- বি 3 (দেব) যদি আপনার মাথা B3 (দেব) এ থাকে এবং আপনি গিট শাখা-মাস্টার করেন তবে আপনি সি 0 দিয়ে শেষ করবেন - - সি 1 --- সি 2 --- বি 1 --- বি 2 --- বি 3 (দেব) (মাস্টার) সি 3 --- সি 4 কোনও শাখা থেকে অ্যাক্সেসযোগ্য নয় এবং শেষ পর্যন্ত আবর্জনা সংগ্রহ করা হবে। আপনি যদি এই পরিস্থিতিতে নিজেকে খুঁজে পান তবে একটি নতুন শাখা তৈরির জন্য -b <brans> বিকল্পের সাথে সি -4 কমিট চেক আউট করুন এবং চেকআউটটি দেখুন at
এএপি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.