git - গিটহাব




কিভাবে আমি স্থানীয় ফাইল overwrite "গিট টান" বলবেন? (20)

গুরুত্বপূর্ণ: যদি আপনার কোন স্থানীয় পরিবর্তন থাকে, তবে এটি হারিয়ে যাবে। --hard বিকল্পের সাথে বা ছাড়া, যে কোনও স্থানীয় কমিটি যা ধাক্কা দেওয়া হয়নি তা হারিয়ে যাবে। [*]

যদি আপনার কোন ফাইল থাকে যা গিট দ্বারা ট্র্যাক করা হয় না (যেমন আপলোড করা ব্যবহারকারী সামগ্রী), এই ফাইলগুলি প্রভাবিত হবে না।

আমি এই সঠিক উপায় মনে করি:

git fetch --all

তারপরে আপনার দুটি বিকল্প রয়েছে:

git reset --hard origin/master

অথবা আপনি যদি অন্য কোন শাখায় থাকেন:

git reset --hard origin/<branch_name>

ব্যাখ্যা:

git fetch কিছু মার্জ বা রিবেজ করার চেষ্টা ছাড়াই রিমোট থেকে সর্বশেষ ডাউনলোড।

তারপরে git reset রিসেটটি মাস্টার শাখাকে আপনি যা ঠিক করেছেন তা git reset সেট করে। origin/master ফাইলে --hard বিকল্পটি আপনার কাজের গাছের সমস্ত ফাইল পরিবর্তন করে

বর্তমান স্থানীয় কমিটি বজায় রাখা

[*] : এটি রিসেট করার আগে master থেকে একটি শাখা তৈরি করে বর্তমান স্থানীয় কমিটিগুলি বজায় রাখা সম্ভাব্য:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

এর পর, পুরোনো কমিটিগুলি new-branch-to-save-current-commits

অস্বাভাবিক পরিবর্তন

অস্বাভাবিক পরিবর্তন, তবে (এমনকি স্টেজ), হারিয়ে যাবে। আপনি প্রয়োজন কিছু stash এবং প্রতিশ্রুতি নিশ্চিত করুন। যে জন্য আপনি নিম্নলিখিত চালাতে পারেন:

git stash

এবং তারপর এই অস্বাভাবিক পরিবর্তনগুলি পুনরায় প্রয়োগ করতে:

git stash pop

আমি কিভাবে একটি git pull স্থানীয় ফাইল একটি overwrite জোর করবেন?

দৃশ্যকল্প অনুসরণ করা হয়:

  • একটি দল সদস্য আমরা যে কোনও ওয়েবসাইটে কাজ করার জন্য টেম্পলেটগুলি সংশোধন করছি
  • তারা ইমেজ ডিরেক্টরি কিছু ছবি যোগ করা হয় (কিন্তু তাদের উৎস নিয়ন্ত্রণ অধীনে যোগ করতে ভুলবেন না)
  • তারা ইমেইলের মাধ্যমে পরে আমাকে পাঠাচ্ছে
  • আমি উৎস নিয়ন্ত্রণের অধীনে ইমেজ যোগ করছি এবং অন্যান্য পরিবর্তনগুলির সাথে একসঙ্গে গিথহাব এ তাদের ধাক্কা দিচ্ছি
  • তারা GitHub থেকে আপডেটগুলি টানতে পারে না কারণ Git তাদের ফাইলগুলিকে ওভাররাইট করতে চায় না।

এই ত্রুটিটি আমি পেয়েছি:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

আমি কিভাবে তাদের উপর overwrite গিট জোর করবেন? ব্যক্তি একটি ডিজাইনার - সাধারণত আমি সব দ্বন্দ্ব হাত দ্বারা সমাধান করি, তাই সার্ভারটির সাম্প্রতিকতম সংস্করণ রয়েছে যা তাদের কম্পিউটারে আপডেট করতে হবে।


বোনাস:

পূর্বের উত্তরে পুল / fetch / একত্রিত করে বলার অপেক্ষা রাখে না, আমি একটি আকর্ষণীয় এবং উত্পাদনশীল কৌশল শেয়ার করতে চাই,

git pull --rebase

এই উপরের কমান্ড আমার গিট জীবনের সবচেয়ে দরকারী কমান্ড যা অনেক সময় বাঁচায়।

সার্ভারে আপনার নতুন প্রতিশ্রুতিটি চাপিয়ে দেওয়ার আগে, এই কমান্ডটি ব্যবহার করে দেখুন এবং এটি স্বয়ংক্রিয়ভাবে সর্বশেষ সার্ভার পরিবর্তনগুলি (একটি আনয়ন + মার্জ সহ) স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ করবে এবং গিট লগটিতে আপনার সংঘটিত শীর্ষে অবস্থান করবে। ম্যানুয়াল পুল / মার্জ সম্পর্কে চিন্তা করার কোন প্রয়োজন নেই।

"Git pull --rebase" কি করে বিস্তারিত খুঁজুন ?


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

মনে আছে যে, আমি শুধু কাস্টডিকের স্ক্রিপ্টটি আপডেট করার জন্য আপডেট করেছি। আমি একটি টাইপও স্থির করেছি (একটি অনুপস্থিত 'মূল')।

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

আমারও একই সমস্যা ছিল। আমি এই কাজ করতে ছিল:

git reset --hard HEAD
git clean -f
git pull

আমি অন্যান্য উত্তর সংক্ষিপ্ত বিবরণ। আপনি ত্রুটি ছাড়া git pull নির্বাহ করতে পারেন:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

সতর্কতা : এই স্ক্রিপ্টটি খুব শক্তিশালী, তাই আপনার পরিবর্তনগুলি হারাতে পারে।


আমি একই সমস্যা ছিল এবং কিছু কারণে, এমনকি একটি git clean -f -d এটা করতে হবে না। এখানে কেন: কিছু কারণে, যদি আপনার ফাইলটি গিট দ্বারা উপেক্ষা করা হয় (একটি। জিটিগেনোর এন্ট্রির মাধ্যমে, আমি অনুমান করি), এটি এখনও পরবর্তী টান দিয়ে এটি ওভাররাইট করার বিষয়ে বিরক্ত হয় তবে একটি পরিষ্কার এটি মুছে ফেলবে না, যতক্ষণ না আপনি add- -x


আমি একটি অদ্ভুত পরিস্থিতি যে neither git clean বা git reset কাজ আছে। প্রতিটি অটোক্রেড ফাইলে নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করে আমি git index থেকে বিবাদী ফাইলটি সরাতে হবে:

git rm [file]

তারপর আমি ঠিক জরিমানা করতে সক্ষম।


আমি বিশ্বাস করি দ্বন্দ্বের দুটি সম্ভাব্য কারণ রয়েছে, যা আলাদাভাবে সমাধান করা উচিত, এবং যতদূর পর্যন্ত আমি বলতে পারি যে উপরে উল্লেখিত কোনও উত্তর দুটির সাথে সম্পর্কিত নয়:

  • অট্যাক্ক্যাকড স্থানীয় ফাইলগুলি মুছে ফেলতে হবে, ম্যানুয়ালি (নিরাপদ) বা অন্য উত্তরের প্রস্তাব অনুসারে, git clean -f -d

  • রিমোট শাখায় থাকা স্থানীয় কাজগুলিও মুছে ফেলতে হবে। এটি অর্জনের সবচেয়ে সহজ উপায় আইএমও: git reset --hard origin/master (যে কোনও শাখার মাধ্যমে আপনি 'মাস্টার' প্রতিস্থাপন করুন এবং প্রথমে একটি git fetch origin চালান)


আমি সব প্রশ্নের মাধ্যমে পড়া কিন্তু আমি এই কাজ করতে একটি একক কমান্ড খুঁজছেন ছিল। এখানে আমি কি করেছি। .Gitconfig একটি গিট উপনাম যোগ করা হয়েছে

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

হিসাবে আপনার কমান্ড চালান

git fp origin master

সমতুল্য

git fetch origin master
git reset --hard origin/master

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

নিম্নোক্ত সংস্করণটি আপনার স্থানীয় পরিবর্তনগুলি একটি অস্থায়ী শাখা ( tmp ) তে সম্পাদন করে, মূল শাখা (যা আমি অনুমান করছি যে master ) পরীক্ষা করে এবং আপডেটগুলিকে বিযুক্ত করে। আপনি stash দিয়ে এটি করতে পারেন, কিন্তু আমি সহজেই শাখা / মার্জ পদ্ধতির ব্যবহার করা সহজভাবে খুঁজে পেয়েছি।

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

যেখানে আমরা অন্য সংগ্রহস্থল অনুমান origin master


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

এখানে আমরা ব্যবহার করা হয় সবচেয়ে পরিষ্কার সমাধান:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • প্রথম কমান্ড নতুন তথ্য fetches।

  • দ্বিতীয় কমান্ডটি যদি কোনও ফাইল থাকে যা রিপোজিটোরিতে যোগ করা হয় এবং স্থানীয় সংগ্রহস্থল থেকে সেই অনির্ধারিত ফাইলগুলি মুছে দেয় যা দ্বন্দ্ব সৃষ্টি করবে।

  • তৃতীয় কমান্ড স্থানীয়ভাবে সংশোধন করা হয়েছে যে সব ফাইল চেক আউট।

  • অবশেষে আমরা নতুন সংস্করণে আপডেট করার জন্য একটি পল করি, কিন্তু এই সময় কোন দ্বন্দ্ব ছাড়াই, যেহেতু অনাকাঙ্ক্ষিত ফাইলগুলি রেপোতে নেই তাই আর বিদ্যমান নেই এবং সমস্ত স্থানীয়ভাবে সংশোধিত ফাইলগুলি ইতিমধ্যেই রিপোজিটোরির মতো একই।


একটি সহজ উপায় হতে হবে:

git checkout --theirs /path/to/file.extension
git pull origin master

এটি আপনার স্থানীয় ফাইলটি git ফাইলের সাথে ওভাররাইড করবে


পরিবর্তে করছেন:

git fetch --all
git reset --hard origin/master

আমি নিম্নলিখিত কাজ করতে পরামর্শ চাই:

git fetch origin master
git reset --hard origin/master

আপনি মূল / মাস্টার শাখা থেকে রিসেট করতে যাচ্ছেন যদি সব remotes এবং শাখা আনতে কোন প্রয়োজন?


প্রথমটি করার সর্বোত্তম উপায় দেখে মনে হচ্ছে:

git clean

সব untracked ফাইল মুছে ফেলুন এবং তারপর স্বাভাবিক git pull দিয়ে অবিরত ...


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

আরএনএর উত্তরের সমন্বয়ের উপর ভিত্তি করে এবং একই প্রশ্নে টেরেকের উত্তরের ভিত্তিতে আমি চমকপ্রদভাবে এটি নিয়ে এসেছি:

git fetch
git reset --hard @{u}

এটি একটি শাখা থেকে চালান এবং এটি কেবল আপনার স্থানীয় শাখাটিকে আপস্ট্রিম সংস্করণে রিসেট করবে।

এটি চমত্কারভাবে একটি গিট ওরফে ( git forcepull ) হিসাবে করা যেতে পারে:

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

অথবা, আপনার .gitconfig ফাইলের মধ্যে:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

উপভোগ করুন!


শুধু কর

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

সুতরাং আপনি সমস্ত অবাঞ্ছিত পার্শ্বপ্রতিক্রিয়া এড়ানোর জন্য, যেমন ফাইল বা ডিরেক্টরিগুলি আপনি রাখতে চান ইত্যাদি মুছে ফেলতে।


সূচী এবং মাথাটি origin/master রিসেট করুন, তবে কার্যকরী গাছটি পুনরায় সেট করবেন না:

git reset origin/master

স্থানীয় কমান্ডগুলি নিক্ষেপ করার জন্য আপনি এই কমান্ডটি সহায়ক হতে পারেন:

git checkout <your-branch> -f

এবং তারপর একটি ক্লিনআপ (কাজ গাছ থেকে অপ্রচলিত ফাইল মুছে ফেলা):

git clean -f

আপনি অপ্রচলিত ফাইল ছাড়াও অট্যাকড ডিরেক্টরি অপসারণ করতে চান:

git clean -fd

সাবধান, আপনার জিটিগনোর ফাইলের মধ্যে কোন ডিরেক্টরি / * এন্ট্রি থাকলে আপনার এটির ফাইলগুলি স্থায়ীভাবে মুছবে।

কিছু উত্তর ভয়ানক বলে মনে হচ্ছে। ডেভিড Avsajanishvili পরামর্শ অনুসরণ করে @ Lauri কি ঘটেছে অর্থে ভয়ঙ্কর।

বরং (git> v1.7.6):

git stash --include-untracked
git pull

পরে আপনি স্ট্যাশ ইতিহাস পরিষ্কার করতে পারেন।

ম্যানুয়ালি, এক-এক:

$ git stash list
[email protected]{0}: WIP on <branch>: ...
[email protected]{1}: WIP on <branch>: ...

$ git stash drop [email protected]{0}
$ git stash drop [email protected]{1}

নিষ্ঠুরভাবে, সব সময়ে একযোগে:

$ git stash clear

অবশ্যই আপনি যদি স্ট্যাশ হয়ে যাবেন তবে ফিরে যেতে চান:

$ git stash list
...
$ git stash apply [email protected]{5}

git pull দিয়ে মার্জ করার পরিবর্তে এটি চেষ্টা করুন:

git fetch --all

অনুসরণ করে:

git reset --hard origin/master






git-fetch