তাদের ধাক্কা দেওয়ার পরে স্কোয়াশ কীভাবে গেটে কমিট করবে?


549

এটি একাধিক অঙ্গীকারকে স্কোয়াশ করার একটি ভাল ব্যাখ্যা দেয়:

http://git-scm.com/book/en/Git-Branching-Rebasing

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

সম্পাদনা: যখন আমি করি git rebase -i origin/master~4 master, প্রথমটিকে সেই হিসাবে রাখি , pickঅন্য তিনটি হিসাবে সেট করুন squashএবং তারপরে প্রস্থান করুন (ইমাসে সিএক্স সিসির মাধ্যমে), আমি পেয়েছি:

$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

যেখানে 2f40 হল pickকমিট। এবং এখন 4 টি কমিটের মধ্যে কোনওটিই উপস্থিত হয় না git log। আমি আশা করি আমার সম্পাদক পুনরায় চালু হবে যাতে আমি একটি প্রতিশ্রুতি বার্তা প্রবেশ করতে পারি। আমি কি ভুল করছি?

উত্তর:


779

স্কোয়াশ স্থানীয়ভাবে কমিট করে

git rebase -i origin/master~4 master

এবং তারপরে জোর করে চাপ দিন

git push origin +master

--forceএবং মধ্যে পার্থক্য+

এর ডকুমেন্টেশন থেকে git push:

লক্ষ্য করুন --forceসব refs যে push করা হয় প্রযোজ্য, অত: পর এটি ব্যবহার সঙ্গে push.defaultসেট matchingবা কনফিগার একাধিক ধাক্কা গন্তব্যস্থল সহ remote.*.pushবর্তমান শাখা (স্থানীয় refs যে তাদের দূরবর্তী সহযোগীর পিছনে কঠোরভাবে হয় সহ) ছাড়া অন্য refs মুছে যেতে পারে। কেবল একটি শাখায় একটি জোর + চাপানোর জন্য, চাপ দেওয়ার জন্য রেফস্পেকের সামনে একটি ব্যবহার করুন (উদাহরণস্বরূপ শাখায় git push origin +masterএকটি ধাক্কা দিতে বাধ্য করা master)।


30
git push --force origin master
আপনিও

7
দেনিথ : হ্যাঁ, তবে আমি এই সিনট্যাক্সটিকে আরও কম পছন্দ করি কারণ এটি সংক্ষিপ্ত।
অ্যালান হাগই আলাভি

85
এবং অবশ্যই, উপলব্ধি করুন যে অন্য কেউ যদি দূরবর্তী সংগ্রহস্থল থেকে টানতে পারেন তবে আপনি সম্ভবত এটি করতে চান না - এই ক্ষেত্রে উত্তরটি "আপনি করেন না"।
ক্যাসাবেল

10
এছাড়াও, আমি মনে করি ওপি হুবহু কমান্ডটি অনুলিপি করছে git rebase -i origin/masterএবং বাস্তবে কীভাবে প্রত্যাবর্তন করা যায় তা তার থেকে আরও পিছনে ফিরে যেতে উদাহরণস্বরূপ জানতে চাই git rebase -i origin/master~20 master
ক্যাসাবেল

6
গস্টাকোভারফ্লো :+এটি কেবলমাত্র রেফস্পেককে বাধ্য করে যা এর দ্বারা উপসর্গ করা হয়। --forceসমস্ত চাপকে চাপ দেওয়াতে বাধ্য করবে। আপডেট উত্তর দেখুন।
অ্যালান হাগই আলাভি

119

একটি শাখায় আমি এটি এটি করতে সক্ষম হয়েছি (শেষ 4 টি কমিটের জন্য)

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch

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

3
এক টন? কীভাবে এটি 4 এর বেশি হতে পারে? তুমি কি বিস্তারিত বলতে পারো?
jakob-r

আমি যে সম্পর্কে অনিশ্চিত তবে এর ইতিমধ্যে ধাক্কা দিয়ে প্রতিশ্রুতি স্কোয়াশ করার চেষ্টা করার সাথে এর কিছু ছিল। অন্যদের মত দেখায় অভিজ্ঞতা এখানে অনুরূপ - stackoverflow.com/questions/5189560/...
cchamberlain

4
আমি এটি প্রত্যাশিত উত্তর হিসাবে গ্রহণ করতে হবে। আরও ক্লিনার যে উত্তর গৃহীত।
বিক্রমভি

4
এটি মাত্র 4 ধাপে সর্বাধিক স্পষ্ট এবং স্বীকৃত উত্তর
আমেয়া সালাগ্রে

45

স্বীকৃত উত্তরের ক্ষেত্রে সামান্য পার্থক্য, তবে স্কোয়াশ করতে আমার প্রচুর অসুবিধা হয়েছিল এবং শেষ পর্যন্ত তা পেয়ে গেল।

$ git rebase -i HEAD~4
  • ইন্টারেক্টিভ স্ক্রিনে যেটি খোলে, আপনি স্কোয়াশ করতে চান এমন সমস্ত কমিটের জন্য শীর্ষে স্কোয়াশের সাথে বাছাই প্রতিস্থাপন করুন ।
  • মাধ্যমে সম্পাদক সংরক্ষণ এবং বন্ধ করুন esc --> :wq

ব্যবহার করে রিমোটে পুশ করুন:

$ git push origin branch-name --force

2
সংক্ষিপ্ত এবং কার্যকর, বিস্তারিত:
7'19

22

শুধুমাত্র branchকাজ করার জন্য এবং কাজ না করার মাধ্যমে অনেক সমস্যা এড়ানো যায় master:

git checkout -b mybranch

নীচে remoteইতিমধ্যে ধাক্কা দেওয়া কমিটস এবং remoteধাক্কা দেওয়া কমিটস / localকেবল কমিটের মিশ্রণের জন্য কাজ করে:

# example merging 4 commits

git checkout mybranch
git rebase -i mybranch~4 mybranch

# at the interactive screen
# choose fixup for commit: 2 / 3 / 4

git push -u origin +mybranch

আমার কাছে কিছু টানার অনুরোধ নোটও রয়েছে যা সহায়ক হতে পারে।


17

git rebase -i master

আপনি সম্পাদক ভিএম খোলা পাবেন এবং এমএসএসের মতো কিছু পাবেন

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

এখানে আমি অন্য সমস্ত প্রতিশ্রুতিগুলির জন্য বাছাই পরিবর্তন করেছি "চ" (ফিক্সআপের জন্য দাঁড়ায়) to

git push -f origin feature/feature-branch-name-xyz

এটি একটি প্রতিশ্রুতিতে সমস্ত প্রতিশ্রুতিগুলি ঠিক করে দেবে এবং অন্যান্য সমস্ত চুক্তি সরিয়ে দেবে। আমি এটি করেছি এবং এটি আমাকে সহায়তা করেছে।


3

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

git rebase -i HEAD~4
or
git rebase -i origin/master

আপনার প্রতিশ্রুতিবদ্ধতার জন্য স্কোয়াশ বা ফিক্সআপ নির্বাচন করুন। এই মুহুর্তে আপনি গিট স্ট্যাটাস দিয়ে পরীক্ষা করবেন। এবং বার্তাটি হতে পারে:

    On branch ABC-1916-remote
    Your branch and 'origin/ABC-1916' have diverged,
    and have 1 and 7 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)

এবং আপনি এটি টানতে প্রলুব্ধ হতে পারে। এটা করো না বা আপনি আগের মতো পরিস্থিতিতে থাকবেন।

পরিবর্তে আপনার উত্স দিকে এটি চাপুন:

git push origin +ABC-1916-remote:ABC-1916

+ কেবল একটি শাখায় জোর করে চাপতে দেয়।


টানতে কোনও অসুবিধা নেই, বিশেষত যদি আপনার দ্বন্দ্ব থাকে তবে আপনি ধাক্কা
খাওয়ার

2

দুটি কমিটি স্কোয়াশ করার জন্য, যার একটি ইতিমধ্যে ঠেলাঠেলি করা হয়েছিল, একটি শাখায় নিম্নলিখিত কাজ করেছে:

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git push --force

ডিফল্টরূপে, এটি পুরানো প্রতিশ্রুতি সম্পর্কে মন্তব্য হিসাবে নতুন প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতি বার্তা অন্তর্ভুক্ত করা হবে।


2

1) git rebase -i HEAD~4

বিস্তারিত বলতে: এটি বর্তমান শাখায় কাজ করে; হেড ~ 4 এর অর্থ সর্বশেষ চারটি কমিটকে স্কোয়াশ করা; ইন্টারেক্টিভ মোড (-i)

2) এই মুহুর্তে, সম্পাদকটি দ্বিতীয়টি এবং নিম্নলিখিত কমিটগুলি পরিবর্তনের জন্য কমিটের তালিকা সহ খোলার পরে স্কোয়াশের সাহায্যে পিকটি প্রতিস্থাপন করে এটি সংরক্ষণ করুন।

আউটপুট: সাফল্যের সাথে রিবেসড এবং আপডেট করা রেফ / হেড / শাখা-নাম।

3) git push origin refs/heads/branch-name --force

আউটপুট:

remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
 + 84b4b60...5045693 branch-name -> branch-name (forced update)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.