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




গিটহাব (24)

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

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

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

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

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

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


আমি সব প্রশ্নের মাধ্যমে পড়া কিন্তু আমি এই কাজ করতে একটি একক কমান্ড খুঁজছেন ছিল। এখানে আমি কি করেছি। .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

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

প্রথমে আপনার পরিবর্তন একটি কমিট করুন

 git add *
 git commit -a -m "local file server commit message"

তারপর একটি সংঘাত আছে যদি পরিবর্তন আনা এবং overwrite

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

"-X" একটি বিকল্প নাম, এবং "theirs" সেই বিকল্পটির মান। আপনি যদি "আপনার" পরিবর্তনের পরিবর্তে "তাদের" পরিবর্তনগুলি ব্যবহার করতে চান তবে কোনও দ্বন্দ্ব থাকে।


আমি শুধু এই দ্বারা নিজেকে সমাধান:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

যেখানে শেষ কমান্ড আপনার স্থানীয় পরিবর্তনগুলির একটি তালিকা দেয়। এটি গ্রহণযোগ্য না হওয়া পর্যন্ত "tmp" শাখাটি পরিবর্তন করুন এবং তারপরে মাস্টারের সাথে আবার মার্জ করুন:

git checkout master && git merge tmp

পরের বার, আপনি সম্ভবত "গিট স্ট্যাশ শাখা" সন্ধান করে পরিষ্কারভাবে এটি পরিচালনা করতে পারেন যদিও স্ট্যাশ প্রথম কয়েকটি চেষ্টাগুলিতে আপনাকে সমস্যার কারণ হতে পারে, তাই প্রথমে একটি অ-সমালোচনামূলক প্রকল্পে পরীক্ষা করুন ...


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

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

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

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

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


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

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

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


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

নিম্নোক্ত সংস্করণটি আপনার স্থানীয় পরিবর্তনগুলি একটি অস্থায়ী শাখা ( 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


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

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

#/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 HEAD --hard # Remove all not committed changes

উপরে যদি সাহায্য না করে এবং আপনি আপনার অটোক্রেড ফাইল / ডিরেক্টরিগুলি সম্পর্কে উদ্বিগ্ন না হন (কেবলমাত্র ক্ষেত্রেই ব্যাকআপটি তৈরি করুন), নিম্নলিখিত সহজ পদক্ষেপগুলি চেষ্টা করুন:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

এটি সমস্ত জিট ফাইলগুলি সরিয়ে .git/ (Excempt .git/ dir, যেখানে আপনি সমস্ত কিছু করেন) এবং এটি আবার টানুন।

কেন git reset HEAD --hard কিছু ক্ষেত্রে ব্যর্থ হতে পারে?

  1. .gitattributes file কাস্টম নিয়ম

    eol=lfeol=lf থাকার eol=lf কিছু টেক্সট ফাইলগুলিতে CRLF লাইন-এন্ডগুলি LF রূপান্তর করে কিছু ফাইল পরিবর্তন সংশোধন করতে গিট সৃষ্টি করতে পারে।

    যদি এমন হয় তবে আপনাকে এই CRLF / LF পরিবর্তনগুলি ( git status পর্যালোচনা করে) করতে হবে, অথবা চেষ্টা করুন: git config core.autcrlf false অস্থায়ীভাবে তাদের উপেক্ষা করা git config core.autcrlf false

  2. ফাইল সিস্টেম অসঙ্গতি

    আপনি ফাইল-সিস্টেম ব্যবহার করছেন যখন অনুমতি বৈশিষ্ট্য সমর্থন করে না। উদাহরণস্বরূপ আপনার দুটি রিপোজিটরি রয়েছে, লিনাক্স / ম্যাক ( hfs+ / hfs+ ) এবং hfs+ / এনটিএফএস ভিত্তিক ফাইল-সিস্টেমে অন্য একটি।

    আপনি লক্ষ্য করেন যে, দুটি ভিন্ন ধরনের ফাইল সিস্টেম রয়েছে, তাই ইউনিক্স অনুমতিগুলিকে সমর্থন করে না এমনটি মূলত সিস্টেমের এমন ফাইলের অনুমতিগুলি পুনরায় সেট করতে পারে না যা এই ধরণের অনুমতিগুলি সমর্থন করে না, তাই আপনার কোনও ক্ষতি নেই চেষ্টা করুন, গিট সবসময় কিছু "পরিবর্তন" সনাক্ত।


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

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

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


প্রয়োজনীয়তা:

  1. স্থানীয় পরিবর্তনগুলি সন্ধান করুন যাতে কেউ এখানে কখনো তাদের হারিয়ে না।
  2. স্থানীয় সংগ্রহস্থলটি রিমোট মূল সংগ্রহস্থলের সাথে মেলে।

সমাধান:

  1. স্থানীয় পরিবর্তন স্ট্যাশ
  2. পান একটি সঙ্গে পরিষ্কার এর ফাইল এবং ডিরেক্টরি উপেক্ষা .gitignore এবং হার্ড রিসেট করার মূল

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    

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

কিছু উত্তর ভয়ানক বলে মনে হচ্ছে। ডেভিড 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 fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

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


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

git rm [file]

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


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

git reset origin/master

আমি একই সমস্যা ছিল। কেউ আমাকে এই সমাধান দিয়েছেন, কিন্তু এটা আমার জন্য কাজ করে।

আমি এটি দ্বারা সমাধান:

  1. সব ফাইল মুছে ফেলা হচ্ছে। শুধু .git ডিরেক্টরি ছেড়ে দিন।
  2. git reset --hard HEAD
  3. git pull
  4. git push

এখন এটা কাজ করছে.


মনে হচ্ছে এখানে বেশিরভাগ উত্তর 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 reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

এই কমান্ড নির্বাহ করার পরে চেক / টান

git pull origin master

আমি অনেক চেষ্টা করেছি কিন্তু অবশেষে এই কমান্ডগুলির সাথে সফলতা অর্জন করেছি।


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

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

এটা চেষ্টা কর:

git reset --hard HEAD
git pull

এটা আপনি চান কি করা উচিত।


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

git fetch --all

অনুসরণ করে:

git reset --hard origin/master



বোনাস:

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

git pull --rebase

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

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

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


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

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

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


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







git-fetch