git - গিটহাব




একটি গিট মার্জ পূর্বাবস্থায় ফিরিয়ে আনুন যে এখনও ধাক্কা করা হয় নি (18)

আমার মাস্টার শাখার মধ্যে, আমি স্থানীয়ভাবে git merge some-other-branch করেছিলাম, কিন্তু মূল মাস্টারের পরিবর্তনগুলি কখনও ধাক্কা দিলাম না। আমি মার্জ মানে না, তাই আমি এটা পূর্বাবস্থায় ফেরাতে চাই। আমার একত্রিত হওয়ার পরে একটি git status করার সময়, আমি এই বার্তাটি পেয়েছিলাম:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

আমি পাওয়া কিছু নির্দেশাবলী উপর ভিত্তি করে, আমি চলমান চেষ্টা

git revert HEAD -m 1

কিন্তু এখন আমি git status সাথে এই বার্তাটি পাচ্ছি:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

আমি আমার শাখা কোনো commits দ্বারা এগিয়ে হতে চান না। আমি কিভাবে যে বিন্দু ফিরে পেতে পারি?


  1. প্রথমে, আপনি সবকিছু করেছেন তা নিশ্চিত করুন।

  2. তারপরে পূর্ববর্তী কাজের অবস্থায় আপনার সংগ্রহস্থলটি পুনরায় সেট করুন:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    অথবা ব্যবহার করে - --hard ( এই সমস্ত স্থানীয় অপসারণ করা হবে, প্রতিশ্রুতিবদ্ধ পরিবর্তন না! ):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    আপনার ভুলভাবে একত্রিত সম্মতি আগে সেখানে ছিল হ্যাশ ব্যবহার করুন।

  3. আপনি যা পূর্ববর্তী সঠিক সংস্করণটির শীর্ষে পুনর্বিবেচনা করতে চান তা পরীক্ষা করে দেখুন:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. আপনার রিপোজিটরির সঠিক সংস্করণের শীর্ষে আপনার অধিকারটি প্রয়োগ করুন:

    • চেরি-পিক ব্যবহার করে (কিছু বিদ্যমান কমিট দ্বারা উপস্থাপিত পরিবর্তন)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • অথবা চেরি দ্বারা-দ্বারা সীমাবদ্ধতা বাছাই:

      • প্রথমে মার্জ করার আগে সঠিক পরিবর্তনগুলি পরীক্ষা করে দেখুন:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • প্রথমে মার্জ করার আগে সঠিক পরিবর্তনগুলি পরীক্ষা করে দেখুন:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        যেখানে আপনি সঠিক প্রতিশ্রুতির পরিসরটি করেছেন (ভুলভাবে প্রতিশ্রুত মার্জ ব্যতীত)।


আধুনিক গিট দিয়ে, আপনি যা করতে পারেন:

git merge --abort

পুরানো সিনট্যাক্স:

git reset --merge

পুরানো স্কুল:

git reset --hard

কিন্তু প্রকৃতপক্ষে, এটি git merge --abort git reset --merge সমান সমতুল্য - এটি MERGE_HEAD উপস্থিত git reset --merge প্রদত্ত MERGE_HEAD । এই কমান্ড একত্রিত করার জন্য গিট সাহায্য পড়া যেতে পারে।

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

একটি ব্যর্থ মার্জ করার পরে, যখন কোনও MERGE_HEAD , ব্যর্থ git reset --merge সাথে পূর্বাবস্থায় ফিরিয়ে আনা যেতে পারে, তবে git merge --abort সাথে এটি অপরিহার্য নয়, তাই এটি একই জিনিসটির জন্য পুরানো এবং নতুন সিনট্যাক্স নয়

ব্যক্তিগতভাবে আমি git reset --merge খুঁজে পাই - দৈনন্দিন কাজে অনেক বেশি শক্তিশালী এবং কার্যকর, তাই আমি সর্বদা ব্যবহার করি।


আপনি git-reset কমান্ড ব্যবহার করতে পারেন।

জিট-রিসেট - বর্তমান হেড রিসেট করুন

নির্দিষ্ট রাষ্ট্র। গিট রিসেট [- মিশ্র |

--সফট | - হার্ড | --merge] [-q] [] জিট রিসেট [-q] []

[-] ... জিট রিসেট - প্যাচ

[] [-] [...]

GIT-Reset


আপনি একটি মার্জ প্রত্যাহার বা একটি নির্দিষ্ট কমিটি দ্বারা পুনরায় আরম্ভ করতে শুধুমাত্র দুটি কমান্ড ব্যবহার করতে পারেন:

  1. git reset --hard commitHash (আপনি যেটি পুনরায় শুরু করতে চান সেটি ব্যবহার করুন, যেমন 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force ( git push origin HEAD --force স্থানীয় মাস্টারের শাখার মূল / মাস্টার পাঠানো)

শুভকামনা এবং এগিয়ে যান!


আপনি পূর্ববর্তী চেকআউট খুঁজে পেতে git reflog ব্যবহার করতে পারে। কখনও কখনও যে একটি ভাল রাষ্ট্র আপনি ফিরে ফিরে যেতে চান।

concretely,

$ git reflog
$ git reset --hard [email protected]{0}

আপনি যদি এখনো এটি না করেন তবে আপনি কেবল ব্যবহার করতে পারবেন

$ git checkout -f

এটি মার্জটি পূর্বাবস্থায় ফিরিয়ে আনবে (এবং আপনি যা করেছেন তা)।


আমি মনে করি আপনি git rebase -i [hash] [branch_name] যেখানে [hash] হ'ল শনাক্তকারী হ্যাশ তবে যতদূর আপনি প্লাস এক git rebase -i [hash] [branch_name] করতে চান (অথবা অনেকগুলি যা আপনি যেতে চান) এবং তারপরে লাইন মুছে ফেলুন আপনি যে কোনও সম্পাদককে সম্পাদন করতে চান না। ফাইল সংরক্ষণ করুন। থেকে প্রস্থান করুন। প্রার্থনা। এবং এটি rewound করা উচিত। আপনি একটি git reset --hard , কিন্তু এই সময়ে ভাল হতে হবে। আপনি যদি আপনার ইতিহাসে তাদের রাখতে চান না তবে স্ট্যাক থেকে নির্দিষ্ট ক্রিটগুলি টেনে আনতে এটি ব্যবহার করতে পারেন তবে এটি এমন একটি অবস্থানে আপনার সংগ্রহস্থল ছেড়ে যেতে পারে যা আপনি সম্ভবত চান না।


এই ক্ষেত্রে, আপনি আপনার শাখাটি git reset --hard <branch_name> দিয়ে পুনরায় সেট করতে চান। যদি আপনি তাদের রিসেট করার আগে আপনার পরিবর্তনগুলি সংরক্ষণ করতে চান তবে একটি নতুন শাখা এবং git checkout <branch_name> তৈরি করতে ভুলবেন না।

আপনি git reset --hard <commit_id> একটি নির্দিষ্ট git reset --hard <commit_id> রাষ্ট্রটি পুনরায় সেট করতে পারেন।

যদি পরিবর্তনগুলি ধাক্কা দেওয়া হয় তবে আপনি পরিবর্তে git revert <branch_name> ব্যবহার করতে পারেন। পাশাপাশি অন্যান্য দৃশ্যকল্প মধ্যে গিট রিভার্ট এবং গিট চেকআউট ব্যবহার করতে কিভাবে পরীক্ষা করে দেখুন।


এটা অদ্ভুত যে সহজ কমান্ড অনুপস্থিত ছিল। বেশিরভাগ উত্তর কাজ করে, তবে আপনি যে মার্জটি করেছেন তা পূর্বাবস্থায় ফিরিয়ে আনুন, এটি সহজ এবং নিরাপদ উপায় :

git reset --merge ORIG_HEAD

রেফারেন্স ORIG_HEAD মার্জ করার আগে থেকে আসল ORIG_HEAD দিকে নির্দেশ করবে।

( --merge বিকল্পটি মার্জের সাথে কিছু করার নেই। এটি git reset --hard ORIG_HEAD মতো - git reset --hard ORIG_HEAD , কিন্তু নিরাপদ কারণ এটি git reset --hard ORIG_HEAD পরিবর্তনগুলি স্পর্শ করে না।)


ঠিক আছে, এখানে অন্যান্য লোকেরা উত্তর আমাকে বন্ধ ছিল, কিন্তু এটি কাজ করে না। এখানে আমি কি করেছি।

এটা করছি...

git reset --hard HEAD^
git status

... আমাকে নিম্নলিখিত অবস্থা দিয়েছেন।

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

আমি তারপর একই git reset কমান্ড টাইপ অনেক সময় টাইপ ছিল। প্রতিটি সময় আমি এটি করেছি, আপনি নীচের দেখতে পারেন হিসাবে বার্তা এক দ্বারা পরিবর্তিত।

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

এই মুহুর্তে, আমি স্ট্যাটাস বার্তা পরিবর্তিত দেখেছি, তাই আমি একটি git pull চেষ্টা করেছি, এবং যে কাজ করলো:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

এত দীর্ঘ গল্প সংক্ষিপ্ত, আমার আদেশ নিচে এসেছিলেন:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

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

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

git reset --hard remotes/origin/HEAD

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


যদি আপনি একটি কমান্ড-লাইন সমাধান চান তবে আমি কেবল এমবিওর উত্তর দিয়ে যেতে পরামর্শ দিই।

আপনি যদি একজন নবীন হন, তবে আপনি গ্রাফিক্যাল পদ্ধতি পছন্দ করতে পারেন:

  1. gitk কেটে gitk (কমান্ড লাইন থেকে বা আপনার যদি ফাইল ব্রাউজারে ডান ক্লিক করুন)
  2. আপনি সহজে সেখানে একত্রিতকরণ মজুরি স্পট করতে পারেন - দুই পিতামাতার সঙ্গে শীর্ষ থেকে প্রথম নোড
  3. প্রথম / বাম পিতা-মাতার লিংকটি অনুসরণ করুন (একত্রীকরণের আগে আপনার বর্তমান শাখাটির একটি, সাধারণত আমার জন্য লাল)
  4. নির্বাচিত কমিটিতে, "এখানে শাখাটি রিসেট করুন" রাইট-ক্লিক করুন, সেখানে হার্ড রিসেট চয়ন করুন

যদি আপনি লক্ষ্য করেন যে একত্রীকরণের পরে আপনাকে অবিলম্বে ফিরতে হবে এবং মার্জ প্রচেষ্টা করার পরে আপনি অন্য কিছু না করে থাকেন তবে আপনি এই কমান্ডটি ইস্যু করতে পারেন: git reset --hard [email protected]{1}

মূলত, আপনার মার্জ sha [email protected]{0} দিকে নির্দেশ করা হবে যদি মার্জ হওয়ার পরে আর কিছুই না করা হয় এবং তাই [email protected]{1} পূর্বে [email protected]{1} পূর্ববর্তী বিন্দু হবে।


শুধু দেখার জন্য অতিরিক্ত বিকল্পের জন্য, আমি এখানে বর্ণিত শাখা মডেলটি অনুসরণ করেছি: http://nvie.com/posts/a-successful-git-branching-model/ branching-model/ এবং এর সাথে মিলিত হয়েছে --no-ff (কোন দ্রুত এগিয়ে) সাধারণত।

আমি কেবল এই পৃষ্ঠাটি পড়ি কারণ আমি পরিত্যাগের জন্য মাস্টারের সাথে আমার মুক্তির শাখার পরিবর্তে একটি পরীক্ষা শাখার সাথে মিলিত হয়েছি (ওয়েবসাইট, মাস্টার যা লাইভ হয়)। পরীক্ষার শাখায় এটিতে মিলিত দুইটি শাখা রয়েছে এবং প্রায় ছয়টি সমষ্টি রয়েছে।

সুতরাং পুরো কমিটটি ফিরিয়ে আনতে আমার শুধু একটি git reset --hard HEAD^ দরকার - git reset --hard HEAD^ এবং এটি পুরো মার্জটিকে ফিরিয়ে দেয়। মার্জেস দ্রুত ফরোয়ার্ড করা হয়নি, যেহেতু মার্জ একটি ব্লক ছিল এবং এক ধাপ পিছনে "শাখা মার্জ করা হয় না"।


সর্বাধিক সহজতম সহজ উপায়, যা কিছু চেয়ে অনেক সহজ এখানে বলা হয়েছে:

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


সাম্প্রতিককালে, আমি এই সঙ্গে সাহায্য করার জন্য git reflog ব্যবহার করা হয়েছে। এটি বেশিরভাগই কেবল তখনই কাজ করে যদি এটি একত্রিত হয় এবং এটি আপনার মেশিনে থাকে।

git reflog কিছু ফেরত git reflog পারে:

fbb0c0f [email protected]{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 [email protected]{1}: checkout: moving from master to my-branch
e3753a7 [email protected]{2}: rebase finished: returning to refs/heads/master
e3753a7 [email protected]{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 [email protected]{4}: reset: moving to HEAD^
8400a0f [email protected]{5}: rebase: aborting

প্রথম লাইন একটি মার্জ ঘটেছে নির্দেশ করে। দ্বিতীয় লাইন আমার মার্জ আগে সময়। আমি সহজেই git reset --hard 43b6032 এই শাখাটিকে একত্রিত করার আগে থেকে ট্র্যাক করতে বাধ্য করে git reset --hard 43b6032 , এবং বহন করে।


git reflog চেক দিয়ে কোনটি একত্রীকরণের আগে (গিট রিফ্লগটি গিট লগের চেয়ে ভাল বিকল্প হবে)। তারপর আপনি এটি ব্যবহার করে পুনরায় সেট করতে পারেন:

git reset --hard commit_sha

আরেকটি উপায় আছে

git reset --hard HEAD~1

আপনাকে ফিরে পাবেন 1 প্রতিশ্রুতি।

সচেতন থাকুন যে কোনও সংশোধিত এবং অকার্যকর / অস্থির ফাইলগুলি তাদের অসংযুক্ত অবস্থায় পুনরায় সেট করা হবে । তাদের বাছাই পরিবর্তন দূরে রাখতে বা নিচে দেখুন --merge বিকল্প।

@ ওয়েলমন্ট তার উত্তরে নীচের প্রস্তাব দিয়েছেন, এই সরাসরি ক্ষেত্রে ব্যবহার করে:

git reset --hard ORIG_HEAD

ভাল ফলাফল উত্পন্ন হতে পারে, এটি আপনার পরিবর্তন সংরক্ষণ করা উচিত। একত্রিত হওয়ার আগে ORIG_HEAD সরাসরি একটি ORIG_HEAD নির্দেশ করবে, তাই আপনাকে নিজের জন্য এটি সন্ধান করতে হবে না।

আরও একটি টিপ হল --hard পরিবর্তে --merge সুইচটি ব্যবহার করা যা এটি --merge ফাইলগুলি পুনরায় সেট না করে:

--merge

সূচীটি রিসেট করে এবং <comm> এবং HEAD এর মধ্যে আলাদা আলাদা কাজগুলির মধ্যে থাকা ফাইলগুলি আপডেট করে, তবে সূচী এবং কার্যক্ষেত্রের মধ্যে ভিন্ন যাগুলি রাখে (যা পরিবর্তিত হয়েছে যা পরিবর্তিত হয়নি)।


কৌশল: সবকিছু ভাল ছিল যেখানে থেকে একটি নতুন শাখা তৈরি করুন।

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

সমাধান:

আসুন আপনি feature-1 মধ্যে dev একত্রিত করতে চান বলে।

  1. আপনি মার্জ পেতে চান সংশোধন খুঁজুন:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. এটি পরীক্ষা করে দেখুন (সময় ফিরে যান):

    git checkout e5f6g7h8
    
  3. সেখানে থেকে একটি নতুন শাখা তৈরি করুন এবং এটি পরীক্ষা করে দেখুন:

    git checkout -b feature-1
    

এখন আপনি আপনার মার্জ পুনরায় আরম্ভ করতে পারেন:

  1. মার্জ করুন: git merge dev

  2. আপনার মার্জ দ্বন্দ্ব ঠিক করুন।

  3. Commit: git commit

  4. আপনি ফলাফলের সাথে সন্তুষ্ট হলে, পুরানো শাখাটি মুছে দিন: git branch --delete feature-1 মুছে ফেলার git branch --delete feature-1





git-merge