শুধুমাত্র সর্বশেষ প্রতিশ্রুতিবদ্ধতার জন্য গিটহাবে একটি টান অনুরোধ প্রেরণ করুন


280

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

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

আমি ধারণাগুলি সঠিক করার চেষ্টা করছি এবং আমার যা প্রয়োজন তা করার জন্য সঠিক কমান্ড লাইনগুলি বের করতে চেষ্টা করছি।


এবং যদি আপনি অন্য সমস্ত প্রতিশ্রুতিগুলির সাথে একটি টানার অনুরোধ করেন তবে কি হবে? আমি ভেবেছিলাম যে গিটটি ইতিমধ্যে টানিয়া দেওয়া কমিটগুলি উপেক্ষা করার জন্য যথেষ্ট চালাক?
জয়য়ারজো

3
সম্ভবতঃ উজানের প্রবাহটি এখনও মধ্যস্থতাকারী হিসাবে স্বীকৃতি দেয় নি বা চায় না।
মাইকেল স্কট কুথবার্ট

@ জয়য়ারজো আমি উদাহরণস্বরূপ অন্যান্য পরিবর্তন করেছি যা আমি প্রবাহে প্রেরণ করতে চাই না। প্রধান সংগ্রহস্থলকে উপেক্ষা করে গিটের পরিবর্তনের উদাহরণ প্রয়োজন হবে না। গিট দিয়ে কিছুই সহজ নয়।
মার্টিন

সম্পর্কিত: গিটে (সফ্টওয়্যার) এবং গিটহাব (ওয়েব সার্ভিস) -এ কীভাবে টানার অনুরোধগুলি আলাদা সে সম্পর্কে কিছু ভাল বিবরণ
আরবিটি

উত্তর:


302

আপনাকে মূলত একটি নতুন শাখা তৈরি করতে হবে এবং আপনি যে কমিটগুলিতে যুক্ত করতে চান তা চেরি-বাছাই করতে হবে।

দ্রষ্টব্য: চেকআউট / চেরি-পিক কমান্ডগুলির আগে আপনার এগুলির প্রয়োজন হতে পারে

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master

git cherry-pick <SHA hash of commit>

git push origin <new-branch-name>

এরপরে, আপনি <new-branch-name>গিথুবে শাখা দেখতে পাবেন , এতে স্যুইচ করুন এবং আপনি যে পরিবর্তনগুলি চান তার সাথে টানার অনুরোধ জমা দিতে পারেন।


32
গিট চেকআউট-বি আপস্ট্রিম / মাস্টার চালানোর আগে আমারও প্রয়োজন git remote add upstream <git repository>এবং git remote updateআগে।
প্লেইজিম্বো 21

6
এটি কাজ করে, তবে আপনার এটি কীভাবে করা উচিত তা নয়, কারণ এখন আপনার আপস্ট্রীম শাখা এবং আপস্ট्रीम / মাস্টার পৃথক এবং সর্বদা আলাদা হবে যদি আপনার টানার অনুরোধটি মার্জ করা প্রথম কাজ না হয় stream এজন্য আপনার স্ট্যাকওভারফ্লো . com/a/5256304/1904815 করা পছন্দ করা উচিত ।
জনিজেডি

2
বিস্তারিত বলার জন্য: এটি কোনও প্রযুক্তিগত সমস্যা নয়, তবে একটি যৌক্তিক one আপনি যখন প্রবাহের সাথে কিছু করতে চান (সেখান থেকে মার্জ করার মতো) আপনাকে একটি শাখা "রিয়েল-আপস্ট্রিম" যুক্ত করতে হবে বা আপনার প্রবাহকে পুনরায় সেট করতে হবে (অতিরিক্ত পরিবর্তনের জন্য আপনার টানার অনুরোধের জন্য কোনও স্থানীয় শাখা ছাড়বে না)।
জনিজেডি

15
পৃথিবীতে কেন আমার অতিরিক্ত শাখা দরকার, কেবলমাত্র কোডের একক পরিবর্তিত লাইনের জন্য পিআর তৈরি করতে ?! গিথুবের কেউ কি এর মধ্য দিয়ে ভেবেছিল?
CodeManX

2
@ জোহনহনা না ... আপনি কেন একেবারে একটি শাখা মার্জ করতে হবে? কেন আপনি কেবল একটি অঙ্গীকার মার্জ করতে পারবেন না?
কেভিন ক্রামউইদে

57

সর্বশেষ প্রতিশ্রুতি থেকে শুরু করে একটি নতুন শাখা তৈরি করুন, এটিও মূল সংগ্রহস্থলে রয়েছে:

git branch new-branch origin/master
git checkout new-branch

তারপরে git cherry-pickএকক প্রতিশ্রুতি পেতে আপনি যে টানতে চান তার জন্য অনুরোধ করুন। যদি এই প্রতিশ্রুতিযুক্ত শাখাটি ডাকা হয় featureএবং আপনি যে প্রতিশ্রুতি চান তা এই শাখার সর্বশেষ প্রতিশ্রুতি হয়, এটি হবে

git cherry-pick feature

এই প্যাচটি দ্বন্দ্ব ছাড়াই প্রযোজ্য বলে ধরে নেওয়া, আপনি এখন একটি শাখা পেয়েছেন যার জন্য আপনি আপনার টানার অনুরোধটি করতে পারেন।

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


আমি এই বার্তাটি চেরি-পিকের পরে পেয়েছি। কমিট করার জন্য কিছুই যোগ করা হয়নি তবে উপস্থিত থাকা তালিকার চিহ্নযুক্ত ফাইল উপস্থিত রয়েছে (ট্র্যাক করতে "গিট অ্যাড" ব্যবহার করুন)। সব কিছুই আমার মাস্টারের মধ্যে রয়েছে তবে আমার শাখাটি উজান থেকে তৈরি করা দরকার।
কেভিন হাকানসন

5
যদি featureইতিমধ্যে প্রতিশ্রুতিবদ্ধ হয় তবে origin/masterকিছু ঘটে না cherry-pick। নতুন শাখাটি হওয়া উচিত upstream/master(অর্থাত্ কেভিন হাকানসনের উত্তর)
ওহহো

26

আমি এমন পরিস্থিতিতে শেষ হয়েছি যেখানে আমি কাঁটাচামচ কাঁটাচামচ করেছিলাম এবং একটি প্রকল্পের অনুরোধটি মূল প্রকল্পে ফিরে যেতে চেয়েছিলাম।

আমার ছিল:

  • orignal_project
  • ফোরকড_প্রজেক্ট (SHA: 9685770 এ মূল প্রকল্প থেকে তৈরি)
  • my_fork (SHA: 207e29b তে অবস্থিত প্রকল্প থেকে তৈরি করা হয়েছে)
  • আমার কাঁটাচামড়ার একটি প্রতিশ্রুতি (SHA: b67627b) যা আমি মূল প্রকল্পে ফিরে জমা দিতে চেয়েছিলাম

এটি করার জন্য, আমি:

  1. এসএএচএ থেকে একটি নতুন শাখা তৈরি করেছে যেখানে মূল প্রকল্পটি কাঁটাচামচ করা হয়েছিল
  2. আসল প্রকল্প থেকে সমস্ত টানা
  3. চেরি সেই প্রতিশ্রুতিটি বেছে নিয়েছিল যা আমি একটি টানার অনুরোধ হিসাবে জমা দিতে চাই
  4. এটি সমস্ত গিথুবে ঠেলে দিয়েছে

গিট কমান্ডগুলি এমন কিছু ছিল:

  1. গিট শাখা আমার বৈশিষ্ট্য-অনুরোধ 9685770
  2. গিট চেকআউট আমার বৈশিষ্ট্য-অনুরোধ
  3. গিট টান https://github.com/original_project/original_project.git
  4. গিট চেরি-পিক b67627b
  5. গিট পুশ অরিজিন আমার বৈশিষ্ট্য-অনুরোধ

তারপরে আমি মূল প্রকল্পে আমার টানার অনুরোধের জন্য শাখা হিসাবে আমার বৈশিষ্ট্য-অনুরোধটি বেছে নিয়েছি।


6

এটি প্রায় আমার জন্য কাজ করেছে:

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git push origin upstream

পার্থক্য কেবল এটি ছিল:

git push origin upstream:upstream

আমার সেই শেষ লাইনটি পরিবর্তন করার দরকার ছিল যাতে গিট পুশটি আমার গিটহাব রেপোতে উজানের শাখা তৈরি করে যাতে আমি এটি থেকে আরআর তৈরি করতে পারি।


5

আমি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ করেছি যা আমি বর্তমান শাখায় ফিরে যাওয়ার অনুরোধ হিসাবে আলাদা করতে সক্ষম হতে চেয়েছিলাম।

তাই আমি একটি নতুন শাখা পরীক্ষা করে দেখলাম

git checkout -b isolated-pull

এবং এখানেই আমার সমাধান @ কেভিন হাকানসনের থেকে পৃথক হয়েছে , যেহেতু আমার এই শাখাকে ইতিহাসের সেই জায়গায় পুনরায় সেট করা দরকার যা আমি আলাদা করতে চাই

git reset --hard [sha-to-diff-by]

এবং চেরি-বাছাই করুন সেই প্রতিশ্রুতি থেকে যা থেকে আমি বিচ্ছিন্নভাবে টানা অনুরোধ তৈরি করতে চাই

git cherry-pick [my-isolated-commit-sha]

অবশেষে এটিকে দূরবর্তী পর্যন্ত ধাক্কা দিন

git push origin isolated-pull

এবং টান অনুরোধ ডেট শি।


1

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

প্রথমে সমস্ত আগ্রহের জন্য প্যাচ ফাইল তৈরি করুন:

git format-patch -1 <sha>

আগ্রহের প্রতিশ্রুতিবদ্ধতাটি যদি শেষটি হয়ে যায় তবে আপনি তার HEADপরিবর্তে ব্যবহার করতে পারেন <sha>

এখন, আপনি উত্স সংগ্রহস্থলের রক্ষণাবেক্ষণকারীকে প্যাচগুলি প্রেরণ করতে পারেন, যারা এগুলি প্রয়োগ করতে পারেন:

git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch

git am < <the patch>
...

git checkout master
git merge new-branch

অবশেষে এটি দেখতে একই রকম হওয়া উচিত যেমন একটি অস্থায়ী শাখা একটি টান অনুরোধের মাধ্যমে একত্রিত করা হয়েছিল, তবে কাঁটা-সংগ্রহশালায় অতিরিক্ত শাখা না রেখে।


0

@ কেভিন-হ্যাকানসনের উত্তরের ভিত্তিতে, আমি এই প্রক্রিয়াটিকে আরও সহজ করতে এই সামান্য বাশ লিপিটি লিখেছি। এটি উজানের রেপো যুক্ত করে যদি এটি ইতিমধ্যে উপস্থিত না থাকে (ইউআরএলের জন্য আপনাকে অনুরোধ জানায়) তারপরে নতুন শাখার নাম তৈরি করার জন্য এবং সেই শাখায় চেরি বাছাই করার প্রতিশ্রুতি ট্যাগ / এসএইচএ উভয়ের জন্য অনুরোধ জানাবে। আপনি বর্তমানে কোন শাখা বা প্রতিশ্রুতিবদ্ধ তা যাচাই করে তা পরে যে কোনও পরিবর্তনকে স্ট্যাশ করে যাতে আপনি নতুন শাখাটি চেকআউট করতে পারেন। মার্জ কৌশল চেরি-বাছাই করা কমিট থেকে পরিবর্তনগুলি রাখে। নতুন শাখাটিতে চাপ দেওয়ার পরে origin(আপনার দূরবর্তী রেপোর নাম হিসাবে ধরে নেওয়া), আপনি যে শাখা বা প্রতিশ্রুতি রেখেছিলেন তা আবার পরীক্ষা করে দেখা হবে এবং আপনার পূর্ববর্তী পরিবর্তনগুলি স্ট্যাশ থেকে পপড হয়ে গেছে।

if ! git remote | grep -q upstream; then
    read -p "Upstream git repo URL: " upstream
    git remote add upstream $upstream
    git remote update
fi

read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha

current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
    # detached HEAD; just get the commit SHA
    current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git push origin $feature_branch
git checkout $current_branch
git stash pop

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.