আমি পূর্ববর্তী প্রতিশ্রুতিগুলি না করে কীভাবে কোনও নির্দিষ্ট প্রতিশ্রুতি দূরবর্তী স্থানে ঠেকাতে পারি?


826

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

এটা কি সম্ভব?



এখানে ভাল কৌশল দেখুন: stackoverflow.com/a/1789142/1579667
বেঞ্জ

উত্তর:


1086

ধাক্কা মাধ্যমে আপ একটি প্রদত্ত কমিট আপনি লিখতে পারেন:

git push <remotename> <commit SHA>:<remotebranchname>

সরবরাহ করা <remotebranchname>ইতিমধ্যে দূরবর্তীটিতে বিদ্যমান। (যদি তা না হয় তবে আপনি এটি git push <remotename> <commit SHA>:refs/heads/<remotebranchname>অটোক্রিয়েট করতে ব্যবহার করতে পারেন ))

আপনি যদি পূর্ববর্তী কমিটগুলি না ঠেকিয়ে কোনও প্রতিশ্রুতি চাপতে চান তবে আপনার প্রথমে git rebase -iকমিটগুলি পুনরায় অর্ডার করার জন্য ব্যবহার করা উচিত ।


66
git push <remotename> <commit SHA>:<remotebranchname>কাজ করে। কৌশলটি হ'ল এটির সাথে একত্রিত git rebase -iহোন আপনি যে প্রতিশ্রুতিটি প্রথম প্রতিশ্রুতি হিসাবে সরিয়ে নিতে চান এবং সেই কমিট-
শকে

29
আর একটি ভাল পরামর্শ হ'ল আপনি যে রিবাজে -i করার পরে আপনি যে
প্রতিশ্রুতিটি চাপতে

33
মনে রাখবেন যে দূরবর্তী শাখাটি এখনও বিদ্যমান না থাকলে এটি ব্যর্থ হয়। এর সাথে শাখা তৈরি করা যায় git push <remotename> <commit SHA>:refs/heads/<new remote branch name>। এর পরে, উত্তর বর্ণনার সাথে সাথে চাপ দিন।
ওয়েজ ওল্ডেনবুয়েভ

31
উদাহরণস্বরূপ, কিছু স্ট্যান্ডার্ড নাম ছাড়া শেষ প্রতিশ্রুতি ছাড়া সবকিছু ধাক্কা git push origin HEAD~1:master
নির্মম আওয়াজ

3
এছাড়াও নোট করুন, আপনি যদি ইতিমধ্যে কোনও SHA কে সেই দূরবর্তী শাখায় ঠেলে দিয়ে থাকেন তবে আপনাকে জোর করে এইটিকে চাপতে হবে। -fপতাকা ব্যবহার করুন ।
ইয়ান ভন

79

অন্যান্য উত্তরগুলির পুনঃক্রমের বিবরণগুলির অভাব রয়েছে।

git push <remotename> <commit SHA>:<remotebranchname>

একটি একক প্রতিশ্রুতি ঠেলে দেবে, তবে সেই প্রতিশ্রুতিটি আপনার স্থানীয়, পূর্ব-ধাক্কা দেওয়া, প্রতিশ্রুতিবদ্ধ হওয়া শীর্ষস্থানীয়, প্রথম বা টিপ কমিটের সাথে বিভ্রান্ত হওয়ার দরকার নেই, যা আমার মতে সমস্ত অস্পষ্ট বর্ণনীয় বর্ণনা। আপনার প্রতিশ্রুতিগুলির মধ্যে সবচেয়ে পুরানো প্রতিশ্রুতিটির প্রয়োজন, অর্থাৎ আপনার সাম্প্রতিক প্রতিশ্রুতি থেকে সবচেয়ে দূরে। যদি এটি সবচেয়ে পুরানো প্রতিশ্রুতি না থাকে তবে আপনার প্রাচীনতম, স্থানীয়, অ-চাপিত এসএইচএ থেকে নির্দিষ্ট এসএইচএ-তে সমস্ত প্রতিশ্রুতি ঠেলে দেওয়া হবে। কমিটগুলি ব্যবহার পুনরায় অর্ডার করতে:

git rebase -i HEAD~xxx

প্রতিশ্রুতিটি পুনরায় অর্ডার করার পরে আপনি এটিকে নিরাপদে দূরবর্তী সংগ্রহস্থলে রেখে দিতে পারেন।

সংক্ষেপে বলতে গেলে, আমি ব্যবহার করেছি

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

আমার রিমোট মাস্টার শাখায় একক প্রতিশ্রুতিবদ্ধ।

তথ্যসূত্র:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

আরো দেখুন:

  1. গিট: স্থানীয় রিবাসের পরে পুলের পরে ডুপ্লিকেট কমিটস
  2. গিট: একক কমিটি পুশ করা, পুনর্নির্মাণের সাথে পুনর্নির্মাণ, সদৃশ কমিট

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

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

1
স্যামুয়েল - এটি উপলব্ধি করতে পারে তবে গিট রিবেস -i কেবল আপনাকে স্থানীয় কমিটগুলি দেখায় যা দূরবর্তী হেডের চেয়ে পরে, সুতরাং আমি জানি না যে আমি কীভাবে এটি করতে পারতাম।
এড আভিস

1
স্যামুয়েল - প্রকৃতপক্ষে আমি এখন আংশিক ধাক্কা খেলতে পারি তাই আমি কী ভুল হয়েছে জানি না তবে এটি অবশ্যই একরকম বা অন্য কোনওভাবে দূরবর্তী হেড থেকে প্রাপ্ত প্রতিশ্রুতিটিকে ঠেলে দেওয়ার চেষ্টা করছিল।
এড আভিস

1
@ এড আপনি বলেছেন "গিট রিবেস -i কেবলমাত্র স্থানীয় কমিটগুলি দেখায় যা দূরবর্তী হেডের চেয়ে পরে", আমি মনে করি এটি সত্য নয়। আমি পরীক্ষা করেছিলাম এবং রিমোট হেডের অতীতটিকে পুনরায় চালু করতে সক্ষম হয়েছি।
স্যামুয়েল

25

আমি ব্যবহার করার পরামর্শ দিই git rebase -i; আপনি যে কমিট করেছেন তা শীর্ষে নিয়ে যেতে চাইছেন এমন প্রতিশ্রুতিটি সরান। তারপরে git logপ্রত্যাবর্তিত প্রতিশ্রুতিটির SHA পেতে ব্যবহার করুন , এটি পরীক্ষা করে দেখুন এবং এটি চাপ দিন। রিবেসটি নিশ্চিত করবে যে আপনার অন্যান্য সমস্ত প্রতিশ্রুতি এখন আপনি যেটির দিকে ধাক্কা দিয়েছিলেন তার সন্তান, সুতরাং ভবিষ্যতের ধাক্কাও খুব ভাল কাজ করবে।


3
আপনি সম্ভবত একটি পদক্ষেপ সম্পূর্ণ উদাহরণ দিতে পারেন esp। পুনরায় git logপদক্ষেপ?
ড্রুक्स

4
বলুন যে আপনার কাছে "এ", "বি", "সি" বার্তাগুলির সাথে তুলনামূলকভাবে স্বতঃ স্বতন্ত্র কমিট রয়েছে এবং আপনি "বি" টিপতে চান। 'গিট রিবেস -i' আপনাকে এবং সম্পাদককে তিনটি তালিকাভুক্ত করা উচিত; বি সরান এবং সংরক্ষণ / প্রস্থান করুন। 'গিট লগ - ব্যাখ্যা = অনলাইন-এন 3' প্রতিটি বার্তার আগে হ্যাশ সহ বি, এ, সি তালিকাভুক্ত করবে, বি সহ এখন শেষ last 'গিট চেকআউট-বি টেম্পি $ হ্যাশ_ফ_বি; গিট পুশ করা উচিত 'বিন্দু এ ধাক্কা। আপনি সম্ভবত 'গিট চেকআউট-বি মাস্টার করতে চান; গিট শাখা -d টেম্প 'আপনার পূর্ববর্তী অবস্থায় ফিরে আসার জন্য, ধরে নিই যে আপনি আপনার স্থানীয় মাস্টার শাখায় রয়েছেন; প্রযোজ্য হিসাবে প্রতিস্থাপন।
ওয়াল্টার মুন্ড

1
+1 রিবেস-পুশ-রিবেসের পরে আপনি কি কখনও "গিট দেবতাদের ক্রোধ" পেয়েছিলেন? (দুর্ঘটনাক্রমেও অনুমেয়ভাবে ঘটতে পারে, তাই না?)
ড্রুক্স

2
আপনি যদি আমার উত্তরটি মনোযোগ সহকারে পড়েন, আপনি দেখতে পাবেন যে ধাক্কাটি কেবল রিবেসের পরেই ঘটে এবং অব্যাহত প্রতিশ্রুতি কেবলমাত্র অন্যান্য প্রতিশ্রুতিগুলির উপরে চলে যায় যা এখনও ঠেলা যায়নি। প্রতিশ্রুতি একবার ধাক্কা পরে, এটি সাধারণত পাথরের মধ্যে সেট হিসাবে বিবেচনা করা উচিত; ভবিষ্যতে রিবেসিংয়ে এটিকে একা রেখে দিন। এই কৌশলটি কেবল তাই আপনি একাধিক স্থানীয় পরিবর্তনগুলিকে ধাক্কা দেওয়ার আগে একটি ভাল ক্রমের মধ্যে বাছাই করতে পারেন। যদি আপনি সঠিকভাবে ট্র্যাকিং সেট আপ করে থাকেন তবে 'গিট রিবেস -i' অন্য কোনও আরোগুলি সহ আপনাকে ডিফল্ট কমিটস না দেখিয়ে ডিফল্ট করবে, সুতরাং এটি অন্যান্য পদ্ধতির চেয়ে দুর্ঘটনা থেকে নিরাপদ।
ওয়াল্টার মুন্ড

21

নির্দিষ্ট প্রতিশ্রুতি দেওয়ার সময় চেরি-পিক অন্যান্য সমস্ত পদ্ধতির তুলনায় সেরা কাজ করে।

এটি করার উপায় হ'ল:

একটি নতুন শাখা তৈরি করুন -

git branch <new-branch>

আপনার মূল শাখার সাথে আপনার নতুন শাখা আপডেট করুন -

git fetch

git rebase

এই ক্রিয়াগুলি নিশ্চিত করবে যে আপনার উত্সের মতো ঠিক একই জিনিস আপনার আছে stuff

sha idআপনি যে ধাক্কা দিতে চান তা চেরি-বাছাই করুন -

git cherry-pick <sha id of the commit>

আপনি sha idচালিয়ে পেতে পারেন

git log

এটি আপনার উত্সে ঠেলাও -

git push

gitkআপনি যেভাবে চান ঠিক একইভাবে সবকিছু দেখতে দেখতে ছুটে যান।


2
git rebase -iউপরের সমাধানগুলিতে প্রস্তাবিত হিসাবে ব্যবহার করা আদর্শ সমাধান হবে। আপনি যখন কমিটের নকল করতে চান তখনই চেরি পিকটি ব্যবহার করতে হবে be
বিনয় ভরগব

13

আমি বিশ্বাস করি আপনাকে সেই প্রতিশ্রুতিতে "গিট রিভার্ট" করতে হবে এবং তারপরে এটি চাপ দিতে হবে। অথবা আপনি cherry-pickএকটি নতুন শাখায় অঙ্গীকারবদ্ধ করতে পারেন এবং এটিকে দূরবর্তী সংগ্রহস্থলের শাখায় ঠেলাতে পারেন। কিছুটা এইরকম:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}


1
@ হাসেন: আপনি তখন কেবল cherry-pickনিজের প্রতিশ্রুতি রাখতে পারেন।
জোশ কে

4
রিভার্ট এবং চেরি-পিক উভয়ই খারাপ ধারণা। গিট রিবেস -i এখানে আপনার বন্ধু, নীচে ওয়াল্টার মুন্ডের উত্তর দেখুন।
নিকোলাস সি

3
@ নিকোলাস, চেরি-কেন একটি খারাপ ধারণা?
এন্টোইন

3
@ এন্টাইন, সাধারণত আপনি চান যে আপনার শাখাটি এটির সাথে ট্র্যাক করা একটির সাথে সুসংগত থাকে। আপনি যদি চেরি-বাছাই করেন, আপনি একটি অনুলিপি / পেস্ট করছেন, এবং আপনাকে কোনও সময়ে ধাক্কা দেওয়া অনুলিপিটি মোকাবেলা করতে হবে। যদি আপনি -i রিবেস করেন তবে আপনি "কাট এবং পেস্ট করুন" এবং আপনার শাখাটি যেখানেই আপনি চান সেটিকে রিমোটের সাথে সিঙ্ক করে রাখুন।
নিকোলাস সি

0

আপনি অন্য ডিরেক্টরিতেও করতে পারেন:

  • গিট ক্লোন [আপনার ভাণ্ডার]
  • আপনি এখনই ক্লোন করেছেন এমন সংগ্রহস্থলের .git ডিরেক্টরি সহ আপনার মূল সংগ্রহস্থলের .git ডিরেক্টরিটি মুছে ফেলুন।
  • গিট অ্যাড এবং গিট আপনার আসল প্রতিশ্রুতিবদ্ধ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.