সংক্ষিপ্ত উত্তর
আপনি যে দৌড়েছিলেন তা বাদ দিয়েছেন git push
, নিম্নলিখিত ত্রুটিটি পেয়েছেন এবং তারপরে চালিয়ে যেতে git pull
:
To git@bitbucket.org:username/test1.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:username/test1.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
গিট সহায়ক হওয়ার চেষ্টা করার পরেও, এর 'গিট টান' পরামর্শটি সম্ভবত আপনি যা করতে চান তা নয় ।
যদি তুমি হও:
- "বৈশিষ্ট্য শাখা" বা "বিকাশকারী শাখা" একা কাজ করা , তারপরে আপনি
git push --force
আপনার পোস্ট-রিবেস কমিটগুলি ( ব্যবহারকারীর 40406767 এর উত্তর অনুসারে ) রিমোটটি আপডেট করতে চালাতে পারেন ।
- একই সাথে একাধিক বিকাশকারীদের সাথে একটি শাখায় কাজ করা, তবে আপনার সম্ভবত
git rebase
প্রথম স্থানটি ব্যবহার করা উচিত নয় । আপডেট করতে dev
পরিবর্তনগুলির master
আপনি উচিত, পরিবর্তে চলমান git rebase master dev
, রান git merge master
থাকাকালীন উপর dev
( জাস্টিন এর উত্তর অনুযায়ী )।
কিছুটা দীর্ঘ ব্যাখ্যা
গিতে প্রতিটি কমিট হ্যাশ বিভিন্ন কারণের উপর ভিত্তি করে তৈরি করা হয়, যার মধ্যে একটি প্রতিশ্রুতি হ্যাশ যা এর আগে আসে।
যদি আপনি কমিটিকে পুনরায় অর্ডার করেন তবে প্রতিশ্রুতিবদ্ধ হ্যাশগুলি পরিবর্তন করবেন; রিবাজিং (যখন এটি কিছু করে) কমিট হ্যাশগুলিকে পরিবর্তন করবে। এটির সাথে , দৌড়ের ফলাফল git rebase master dev
, যেখানে dev
সামঞ্জস্যের বাইরে রয়েছে , সেখানে নতুন কমেটগুলি master
তৈরি করবে (এবং এইভাবে হ্যাশগুলি) একই বিষয়বস্তুতে রয়েছে তবে তাদের পূর্বে theোকানো প্রতিশ্রুতিগুলির সাথে ।dev
master
আপনি একাধিক উপায়ে এইরকম পরিস্থিতিতে শেষ করতে পারেন। দুটি উপায় যা আমি ভাবতে পারি:
- আপনি
master
নিজের dev
কাজের উপর ভিত্তি করে নিতে চাইলে তাতে কমিট থাকতে পারে
- আপনি এর উপর কমিটগুলি
dev
ইতিমধ্যে একটি দূরবর্তী স্থানে ঠেলাঠেলি করা যেতে পারে, যা আপনি তারপরে পরিবর্তন করতে এগিয়ে যান (পুনরায় শব্দ প্রতিশ্রুতি বার্তা, পুনরায় অর্ডার বার্তা, স্কোয়াশ কমিট ইত্যাদি)
আসুন কী ঘটেছিল তা আরও ভালভাবে বুঝতে পারি — এখানে একটি উদাহরণ রয়েছে:
আপনার কাছে একটি সংগ্রহস্থল রয়েছে:
2a2e220 (HEAD, master) C5
ab1bda4 C4
3cb46a9 C3
85f59ab C2
4516164 C1
0e783a3 C0
তারপরে আপনি কমিটগুলি পরিবর্তন করতে এগিয়ে যান।
git rebase --interactive HEAD~3 # Three commits before where HEAD is pointing
(এই জায়গাতেই আপনাকে এখানে আমার শব্দটি গ্রহণ করতে হবে: গিতে কমিটগুলি পরিবর্তন করার বিভিন্ন উপায় রয়েছে this এই উদাহরণে আমি সময় পরিবর্তন করেছি C3
তবে আপনি নতুন কমিট সন্নিবেশ করছেন, প্রতিশ্রুতি বার্তাগুলি পরিবর্তন করছেন, কমিটগুলি পুনরায় অর্ডার করছেন, স্কোয়াশিং একসাথে কমিট করে, ইত্যাদি)
ba7688a (HEAD, master) C5
44085d5 C4
961390d C3
85f59ab C2
4516164 C1
0e783a3 C0
এখানেই এটি লক্ষ্য করা গুরুত্বপূর্ণ যে প্রতিশ্রুতিবদ্ধ হ্যাশগুলি আলাদা। আপনি তাদের সম্পর্কে কিছু (কিছু) পরিবর্তন করেছেন বলে এটি প্রত্যাশিত আচরণ। এটি ঠিক আছে, তবে:
চাপ দেওয়ার চেষ্টা করা আপনাকে একটি ত্রুটি দেখাবে (এবং আপনাকে চালানো উচিত এমন ইঙ্গিত git pull
)।
$ git push origin master
To git@bitbucket.org:username/test1.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:username/test1.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
আমরা যদি চালাই তবে আমরা git pull
এই লগটি দেখতে পাচ্ছি:
7df65f2 (HEAD, master) Merge branch 'master' of bitbucket.org:username/test1
ba7688a C5
44085d5 C4
961390d C3
2a2e220 (origin/master) C5
85f59ab C2
ab1bda4 C4
4516164 C1
3cb46a9 C3
0e783a3 C0
অথবা, অন্যভাবে দেখানো হয়েছে:
এবং এখন আমাদের স্থানীয়ভাবে সদৃশ কমিট রয়েছে। যদি আমাদের চালানো হয় তবে git push
আমরা সেগুলি সার্ভারে প্রেরণ করব।
এই পর্যায়ে না এড়াতে, আমরা দৌড়াতে পারি git push --force
(যেখানে আমরা তার পরিবর্তে ছুটে এসেছি git pull
)। এটি কোনও সমস্যা ছাড়াই সার্ভারে নতুন হ্যাশ সহ আমাদের কমিটগুলি প্রেরণ করত। এই পর্যায়ে সমস্যাটি সমাধান করতে, আমরা দৌড়ানোর আগেই আবার রিসেট করতে পারি git pull
:
আমাদের দৌড়ানোর আগেgit reflog
কমিট হ্যাশটি কী ছিল তা দেখতে রিফ্লগ ( ) দেখুন ।git pull
070e71d HEAD@{1}: pull: Merge made by the 'recursive' strategy.
ba7688a HEAD@{2}: rebase -i (finish): returning to refs/heads/master
ba7688a HEAD@{3}: rebase -i (pick): C5
44085d5 HEAD@{4}: rebase -i (pick): C4
961390d HEAD@{5}: commit (amend): C3
3cb46a9 HEAD@{6}: cherry-pick: fast-forward
85f59ab HEAD@{7}: rebase -i (start): checkout HEAD~~~
2a2e220 HEAD@{8}: rebase -i (finish): returning to refs/heads/master
2a2e220 HEAD@{9}: rebase -i (start): checkout refs/remotes/origin/master
2a2e220 HEAD@{10}: commit: C5
ab1bda4 HEAD@{11}: commit: C4
3cb46a9 HEAD@{12}: commit: C3
85f59ab HEAD@{13}: commit: C2
4516164 HEAD@{14}: commit: C1
0e783a3 HEAD@{15}: commit (initial): C0
উপরে আমরা দেখতে পাই যে ba7688a
দৌড়ানোর আগে আমরা যে প্রতিশ্রুতিবদ্ধ ছিল তা ছিল git pull
। হাতে থাকা এই প্রতিশ্রুতিবদ্ধ হ্যাশটির সাহায্যে আমরা সেই ( git reset --hard ba7688a
) টিতে পুনরায় সেট করতে পারি এবং তারপরে চালাতে পারি git push --force
।
এবং আমরা সম্পন্ন করেছি।
তবে অপেক্ষা করুন, আমি সদৃশ কমিটগুলি বন্ধ করে দিয়েছি
যদি আপনি কোনওভাবেই লক্ষ্য করেন না যে কমিটগুলি সদৃশ হয়ে গেছে এবং সদৃশ কমিটের শীর্ষে কাজ চালিয়ে যেতে অগ্রসর হয়েছে, আপনি সত্যই নিজের জন্য একটি গোলযোগ করেছেন। গণ্ডির আকার আপনার সদৃশগুলির উপরে থাকা কমিটের সংখ্যার সাথে সমানুপাতিক।
এর মতো দেখতে:
3b959b4 (HEAD, master) C10
8f84379 C9
0110e93 C8
6c4a525 C7
630e7b4 C6
070e71d (origin/master) Merge branch 'master' of bitbucket.org:username/test1
ba7688a C5
44085d5 C4
961390d C3
2a2e220 C5
85f59ab C2
ab1bda4 C4
4516164 C1
3cb46a9 C3
0e783a3 C0
অথবা, অন্যভাবে দেখানো হয়েছে:
এই দৃশ্যে আমরা সদৃশ কমিটগুলি সরিয়ে ফেলতে চাই, তবে তাদের উপর ভিত্তি করে করা কমিটগুলি রাখি — আমরা C10 এর মাধ্যমে C6 রাখতে চাই। বেশিরভাগ জিনিসগুলির মতোই, এ সম্পর্কে অনেকগুলি উপায় রয়েছে:
উভয় ক্ষেত্রেই:
- সর্বশেষ সদৃশ কমিট 1 এ একটি নতুন শাখা তৈরি করুন ,
cherry-pick
প্রতিটি কমিট (সি 10 এর মাধ্যমে সি 6 অন্তর্ভুক্ত) সেই নতুন শাখায়, এবং সেই নতুন শাখাটিকে ক্যানোনিকাল হিসাবে বিবেচনা করুন।
- চালান
git rebase --interactive $commit
, সদৃশ 2 টির পূর্বে$commit
প্রতিশ্রুতিবদ্ধ কোথায় । এখানে আমরা ডুপ্লিকেটগুলির জন্য লাইনগুলি সরাসরি মুছে ফেলতে পারি।
1 আপনি দুজনের মধ্যে যে কোনওটি বেছে নিন ba7688a
বা 2a2e220
ঠিকঠাক কাজ করুন তা বিবেচ্য নয়।
2 উদাহরণে এটি হবে 85f59ab
।
টি এল; ডিআর
এতে সেট advice.pushNonFastForward
করুন false
:
git config --global advice.pushNonFastForward false