আপনি কীভাবে কেবল কিছু স্থানীয় গিটকে চাপ দেন?


160

ধরুন আমার কাছে 5 টি স্থানীয় কমিট রয়েছে। আমি তাদের মধ্যে কেবল 2 জনকে কেন্দ্রীয়ীকৃত রেপোতে (একটি এসভিএন-স্টাইলের ওয়ার্কফ্লো ব্যবহার করে) চাপতে চাই। আমি এটা কিভাবে করবো?

এটি কার্যকর হয়নি:

git checkout HEAD~3  #set head to three commits ago
git push #attempt push from that head

এটি সমস্ত 5 স্থানীয় কমিটগুলিকে ধাক্কা দিয়ে শেষ করে।

আমি মনে করি আমি আমার কমিটগুলি পূর্বাবস্থায় ফিরিয়ে আনার জন্য গিট রিসেট করতে পারি, তারপরে গিট স্ট্যাশ এবং তারপরে গিট পুশ করতে পারি - তবে আমি ইতিমধ্যে কমিটেড ম্যাসেজগুলি লিখেছি এবং ফাইলগুলি সংগঠিত করেছি এবং সেগুলি পুনরায় করতে চাই না।

আমার অনুভূতি হ'ল ধাক্কা দিতে বা পুনরায় সেট করতে কিছু পতাকা কার্যকর হবে।

যদি এটি সহায়তা করে তবে আমার গিট কনফিগারেশনটি এখানে

[ramanujan:~/myrepo/.git]$cat config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = ssh://server/git/myrepo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

উত্তর:


192

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

$ git push origin master~3:master

আপনি যদি গিট-এসএনএন ব্যবহার করছিলেন:

$ git svn dcommit master~3

গিট-এসএনএন-এর ক্ষেত্রে, আপনি হেড ~ 3ও ব্যবহার করতে পারেন, যেহেতু এটি প্রতিশ্রুতি প্রত্যাশা করে। স্ট্রেট গিটের ক্ষেত্রে, আপনাকে শাখার নামটি ব্যবহার করা প্রয়োজন কারণ রেফস্পেকটিতে হেডের সঠিক মূল্যায়ন হয় না।

আপনি আরও দীর্ঘ পদ্ধতির গ্রহণ করতে পারেন:

$ git checkout -b tocommit HEAD~3
$ git push origin tocommit:master

আপনি যদি এই ধরণের কাজের প্রবাহের অভ্যাস তৈরি করে থাকেন তবে আপনার নিজের কাজটি আলাদা একটি শাখায় করা বিবেচনা করা উচিত। তাহলে আপনি এর মতো কিছু করতে পারেন:

$ git checkout master
$ git merge working~3
$ git push origin master:master

মনে রাখবেন যে "উত্স মাস্টার: মাস্টার" অংশটি সম্ভবত আপনার সেটআপের জন্য alচ্ছিক।


14
দ্রষ্টব্য: আপনি ব্যবহার করতে হবে না master~3। কাঙ্ক্ষিত "আপ" কমিটের যে কোনও রেফারেন্স সমানভাবে বৈধ, যেমন HEAD~3বা HEAD~~~, বা নির্দিষ্ট এসএইচএ, বা এমন ট্যাগ যা কোনও লেবেল প্রতিশ্রুতিবদ্ধ।
কাজ

2
ভাল জিনিস. যদিও একটি সতর্কতা: এই উদাহরণগুলি মূল উত্সের দিকে ধাক্কা দেয়। আপনি যদি এই সমাধানটি অনুলিপি করে আটকে দিচ্ছেন তবে আপনি দুর্ঘটনাক্রমে মাস্টার শাখাটি আপডেট করতে পারেন। (অবশ্যই, আপনার সর্বদা সতর্ক হওয়া উচিত এবং একটি জারির আগে আপনার আদেশটি ডাবল-চেক করা উচিত git push...)
নোফিনেটর

দেখা যাচ্ছে যে এটি প্রতিশ্রুতি দেয় না, তবে ব্রাঙ্কটি দূর থেকে যুক্ত করে না।
নাটোয়ামি

@ নাটোয়ামীর জন্য আপনাকে রেফস্পেকের masterদূরবর্তী দিক ছাড়া অন্য কিছু নির্দিষ্ট করতে হবে , যেমনgit push origin tocommit:newbramch
রায়ান গ্রাহাম

আমি দেখি. শাখার নাম স্থানীয়ভাবে ইতিমধ্যে বিদ্যমান ছিল; আমি মনে করি এটি এটি পছন্দ করেনি। যদিও রিমোটটির শাখার নাম এখনও ছিল না।
নাটোয়ামি

16

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

উজান থেকে আমার মাস্টার শাখায় পরিবর্তনগুলি টানানোর পরে, আমি git checkout workএবং git rebase master। এটি আমার সমস্ত স্থানীয় পরিবর্তনগুলি ইতিহাসের শেষে হতে পুনরায় লিখে দেয়।

আমি আসলে git svnএই কর্মপ্রবাহটি ব্যবহার করছি , সুতরাং আমার "পুশ" অপারেশন জড়িত git svn dcommit। আমি tigচিরি-চয়ন করার জন্য মাস্টার হিসাবে উপযুক্ত প্রতিশ্রুতিগুলি ব্যবহার করার জন্য একটি দুর্দান্ত টেক্সট মোড গুই সংগ্রহস্থল দর্শক view


গিট এসএনএন ডিকমিটের সাহায্যে আপনি কমপিউটার প্রতিশ্রুতি নির্দিষ্ট করতে পারেন, তাই কাঙ্ক্ষিত প্রভাব গিট-এসএনএন-এর সাথে বেশ তুচ্ছ।
রায়ান গ্রাহাম

এই পদ্ধতির অসুবিধাগুলি রয়েছে (সংক্ষেপে এখানে স্ট্যাকওভারফ্লো . com/a/881014/1116674 )। একটি ভাল বিকল্প হ'ল আপনি যে বৈশিষ্ট্যটিতে কাজ করছেন তার workশাখা এবং একটি শাখা তৈরি করা। তারপরে, আপনি নির্দিষ্ট শাখাগুলিকে মার্জ করে ফেলুন masterযাতে আপনি সেগুলির উপরে ইতিহাসটি হারাবেন না। সাথে কাজ করার সময় work, আপনি আপনার সমস্ত শাখা এতে মার্জ করুন। এটি বেশি ওভারহেড, তবে কিছু ক্ষেত্রে এটির পক্ষে উপযুক্ত হতে পারে।
হডন

16

ডিফল্টরূপে, গিট-পুশ সমস্ত শাখা ঠেলে দেয়। আপনি যখন এটি করবেন:

 git checkout HEAD~3  #set head to three commits ago
 git push #attempt push from that head

আপনি একটি বিচ্ছিন্ন হেডে চলে যান (আপনি কোনও শাখায় নেই) এবং তারপরে আপনি স্থানীয় মাস্টার (যা এখনও সেখানে ছিলেন) সহ সমস্ত শাখা দূরবর্তী মাস্টারে চাপান push

ম্যানুয়াল সমাধানটি হ'ল:

 git push origin HEAD:master

যদি আপনি সমস্ত শাখাকে বিভ্রান্ত করার (এবং বিপজ্জনক!) চাপ দেওয়ার ডিফল্ট আচরণটি খুঁজে পান তবে এটি আপনার ~ / .gitconfig এ যুক্ত করুন:

 [remote.origin]
    push = HEAD

তারপরে কেবলমাত্র আপনি যে শাখায় আছেন তা ধাক্কা দেওয়া হবে। আপনার উদাহরণে (একটি বিচ্ছিন্ন মাথা), ভুলক্রমে ভুলভাবে চাপ দেওয়ার পরিবর্তে আপনি এই ত্রুটি বার্তাটি পেয়েছিলেন:

 error: unable to push to unqualified destination: HEAD

10

সংক্ষিপ্ত উত্তর:

git push <latest commit SHA1 until you want commits to be pushed>

উদাহরণ:

git push fc47b2

git push HEAD~2

দীর্ঘ উত্তর:

অভিভাবক / শিশু ব্যবস্থার সাথে শৃঙ্খলা হিসাবে কমিটগুলি একসাথে যুক্ত হয়। সুতরাং, একটি প্রতিশ্রুতিবদ্ধ চাপ দেওয়া আসলে সমস্ত পিতামাতাকে এই প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতি দেয় যা দূরবর্তী অঞ্চলে জানা নেই। আপনি যখন git pushবর্তমান প্রতিশ্রুতিবদ্ধ তখন এটি স্পষ্টতই সম্পন্ন হয় : পূর্ববর্তী সমস্ত কমিটগুলিও পুশ করা হয় কারণ এই আদেশটি সমতুল্য git push HEAD

সুতরাং প্রশ্নটি কোনও নির্দিষ্ট প্রতিশ্রুতিটিকে কীভাবে চাপ দেবে তাতে পুনরায় লিখিত হতে পারে এবং উদাহরণস্বরূপ এই সুনির্দিষ্ট প্রতিশ্রুতি মাথা। 2 হতে পারে।

আপনি যে কমিটগুলি ধাক্কা দিতে চান তা যদি অবিচ্ছিন্ন হয় git rebase -iতবে নির্দিষ্ট ধাক্কা দেওয়ার আগে কেবল তাদের পুনরায় অর্ডার করুন ।


5

1) আপনি চাইলে আপনার প্রতিশ্রুতিগুলি পুনরায় অর্ডার করতে "গিট রিবেস" ব্যবহার করুন।

git rebase -i

এই কমান্ডটি আপনার সম্পাদকটিতে এর মতো কিছু প্রদর্শন করবে (আমি ভিএম ব্যবহার করছি)

pick 4791291 commitA
pick a2bdfbd commitB
pick c3d4961 commitC
pick aa1cefc commitD
pick 9781434 commitE

# Rebase ..............
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out




^G Get Help         ^O WriteOut         ^R Read File        ^Y Prev Page                ^K Cut Text         ^C Cur Pos
^X Exit             ^J Justify          ^W Where Is         ^V Next Page            ^U UnCut Text       ^T To Spell

2) সাধারণ কাটা পেস্ট দ্বারা আপনার পছন্দ অনুসারে আপনার কমিটগুলি পুনরায় অর্ডার করুন। ধরা যাক নতুন অর্ডারটি

9781434 কমিট বাছাই করুন

সি 3 ডি 4961 কমিটিকে বাছাই করুন

4791291 কমিএ বাছাই করুন

aa1cefc কমডি বাছাই করুন

a2bdfbd কমিটিকে বাছাই করুন

আপনার সম্পাদক এ এই পরিবর্তনগুলি করুন এবং ctrl + O টিপুন (Writout)

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

git rebase -i HEAD~<commitNumber>

এর সাথে আপনি নতুন সিকোয়েন্স চেক করতে পারেন

git log

3) এখন ব্যবহার করুন

git push <remoteName> <commit SHA>:<remoteBranchName>

দূরবর্তী (উত্স) এ কেবল একটি শাখা এবং স্থানীয় (মাস্টার) এ কেবল একটি শাখা থাকলে কেবল ব্যবহার করুন

git push <commit SHA>
git push aa1cefc

এটি কমিটবি এবং কমিটিকে ধাক্কা দেবে।

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