git - স্থানীয় রিপোজিটরি শাখাটি রিমোট রিপোজিটরি HEAD এর মত রিসেট করুন




undo (12)

আপনি আপস্ট্রিম শাখাতে সর্বশেষ স্থানীয় কমিটিতে আপনার স্থানীয় শাখাটি পুনরায় সেট করতে চান তবে আমার জন্য এটি কী কাজ করে:

আপনার রিমোট পরীক্ষা করে দেখুন, আপনার আপস্ট্রিম এবং মূলটি যা আপনি প্রত্যাশা করেন তা যদি নিশ্চিত না হয় তবে git remote add upstream <insert URL> , যেমন মূল গিটহাব রেপোর যা আপনি ফর্ক করেছেন এবং / অথবা git remote add origin <insert URL of the forked GitHub repo>

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;

বা:

git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;

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

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

তারপর যদি আপনি এই পরিবর্তনগুলি অন্য শাখার সাথে একত্রিত করতে চান তবে কোনও দ্বন্দ্ব আছে, বিকাশের পরিবর্তনগুলি সংরক্ষণ করে ব্যবহার করুন:

git merge -s recursive -X theirs develop

ব্যবহার করার সময়

git merge -s recursive -X ours develop

branch_name এর দ্বন্দ্বজনক পরিবর্তনগুলি সংরক্ষণ করতে। অন্যথায় git mergetool সঙ্গে একটি mergetool ব্যবহার করুন।

একসাথে সব পরিবর্তন সঙ্গে:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

নোট করুন যে আপস্ট্রিম / বিকাশের পরিবর্তে আপনি একটি হ্যাস হ্যাশ, অন্যান্য শাখার নাম ইত্যাদি ব্যবহার করতে পারেন। আপনার শাখাটি হরিণ নির্দেশ করে এমন একটি সিএলআই টুল ব্যবহার করুন যাতে কমিটিটি কোনও কাজ করতে পারে না এবং ওয়ার্কিং ডিরেক্টরিটি পরিষ্কার হয়। যা git status দ্বারা নিশ্চিত বা যাচাইযোগ্য)। উল্লেখ্য, এটি আপস্ট্রিম বিকাশের তুলনায় প্রকৃতপক্ষে আরও যোগ করতে পারে, যদি কোনও কাজ দ্বারা স্বয়ংক্রিয়ভাবে যোগ করা হয়, যেমন, ইউএমএল চিত্র, লাইসেন্স শিরোনাম ইত্যাদি, তাই ক্ষেত্রে, আপনি origin develop পরিবর্তনগুলি upstream develop origin develop করতে পারেন। প্রয়োজন ছিল।

রিমোট রিপোজিটরিতে শাখার মতো হতে আমি কীভাবে আমার স্থানীয় শাখাটি পুনরায় সেট করব?

আমি করেছিলাম:

git reset --hard HEAD

কিন্তু যখন আমি একটি git status চালানো,

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

দয়া করে আমাকে বলুন কেন আমার এই 'সংশোধিত' আছে? আমি এই ফাইল স্পর্শ করেনি? আমি যদি, আমি তাদের অপসারণ করতে চান।


আপনি যদি আপনার স্থানীয় পরিবর্তনগুলি সংরক্ষণের বিষয়ে কিছু মনে করেন না তবে এখনও আপনার সংগ্রহস্থলটি মূল / হেডের সাথে মিলিয়ে আপডেট করতে চান, আপনি কেবল আপনার স্থানীয় পরিবর্তনগুলি টানতে পারেন এবং তারপর টানতে পারেন:

git stash
git pull

আপনি যদি বর্তমান পরিবর্তনগুলি পরে ব্যবহার করতে চান তবে পরিবর্তনগুলি অন্যভাবে সাজান যাতে আপনি এই দুটি কমান্ড ব্যবহার করতে পারেন,

git fetch origin
git reset --hard origin/master

আমি করতে হবে (গৃহীত উত্তর সমাধান):

git fetch origin
git reset --hard origin/master

অনুসরণ করেছেন:

git clean -f

স্থানীয় ফাইল অপসারণ করতে

কোন ফাইল সরানো হবে তা দেখতে (প্রকৃতপক্ষে তাদের সরিয়ে ফেলা ছাড়া):

git clean -n -f

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

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* আপনার গিগাবাইট ফাইল দূষিত হয় অনুমান


উপরের সমস্ত প্রস্তাব সঠিক, তবে প্রায়শই আপনার প্রকল্পটি পুনরায় সেট করার জন্য, আপনাকে আপনার। .gitignore ফাইলগুলিও সরাতে হবে।

আপনার প্রকল্প ডিরেক্টরি মুছে ফেলার এবং রিমোট থেকে পুনরায় ক্লোন করার নৈতিক সমতুল্য পেতে:

git fetch
git reset --hard
git clean -x -d -f

সতর্কতা : git clean -x -d -f অপ্রচলিত এবং আপনি ফাইল এবং ডেটা হারাতে পারেন (উদাহরণস্বরূপ, যা আপনি .gitignore ব্যবহার করে উপেক্ষা .gitignore )।


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

আমি একটি "আপনি নিশ্চিত" প্রম্পট, এবং কিছু প্রতিক্রিয়া আউটপুট যোগ করা হয়েছে

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

তবে রিমোট রিপোজিটরিটি origin , এবং আপনি branch_name আগ্রহী হন branch_name :

git fetch origin
git reset --hard origin/<branch_name>

এছাড়াও, আপনি origin শাখাটিকে HEAD থেকে রিসেট করার জন্য যান।

git fetch origin
git reset --hard origin/HEAD

কিভাবে এটা কাজ করে:

git fetch origin বা রিবেজ চেষ্টা ছাড়া git fetch origin ডাউনলোড দূরবর্তী থেকে সর্বশেষ ডাউনলোড।

তারপরে <branch_name> আপনি যা <branch_name> তা <branch_name> শাখাটি git reset সেট করে। origin/branch_name ফাইলে মিলিয়ে আপনার কার্যক্ষেত্রের সমস্ত ফাইল পরিবর্তন করে।


পূর্ববর্তী উত্তর অনুমান করে যে শাখা পুনরায় সেট করা বর্তমান শাখা (চেক আউট)। মন্তব্যে, OP HAP497 ব্যাখ্যা করেছে যে শাখাটি প্রকৃতপক্ষে চেক আউট করা হয়েছে, তবে এটি মূল প্রশ্নটি স্পষ্টভাবে প্রয়োজন হয় না। যেহেতু কমপক্ষে একটি "সদৃশ" প্রশ্ন রয়েছে, তাই শাখাটিকে সম্পূর্ণরূপে সংগ্রহস্থলের অবস্থাতে রিসেট করুন , যা অনুমান করে না যে শাখাটি চেক আউট আছে, এখানে একটি বিকল্প রয়েছে:

যদি শাখাটি "মাইব্র্যাঞ্চ" বর্তমানে চেক আউট না হয় তবে রিমোট শাখায় "মারেমিট / মিব্র্যাঞ্চ" এর মাথাটি রিসেট করার জন্য, আপনি এই low-level কমান্ডটি ব্যবহার করতে পারেন:

git update-ref refs/heads/mybranch myremote/mybranch

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

যদিও এটি করার সময় সতর্কতা অবলম্বন করুন এবং gitk বা অনুরূপ সরঞ্জামটি gitk উৎস এবং গন্তব্য চেক করার জন্য ব্যবহার করুন। যদি আপনি ঘটনাক্রমে বর্তমান শাখায় এটি করেন (এবং জিট আপনাকে এগুলি থেকে রক্ষা করবে না), আপনি বিভ্রান্ত হয়ে পড়তে পারেন কারণ নতুন শাখার সামগ্রীটি কার্যকারী গাছের সাথে মিলছে না, যা পরিবর্তন হয়নি (ঠিক করার জন্য, শাখাটিকে আবার আপডেট করুন, এটা আগে যেখানে ছিল)।


প্রথমত, সংশ্লিষ্ট আপস্ট্রিম শাখাটির পূর্বে প্রাপ্ত HEAD পুনরায় সেট করুন:

git reset --hard @{u}

@{u} বা তার verbose ফর্ম @{upstream} নির্দিষ্ট করার সুবিধাটি হল রিমোট রেপো এবং শাখাটির নাম স্পষ্টভাবে উল্লেখ করা হবে না।

পরবর্তী, প্রয়োজন অনুসারে, অট্যাকড ফাইলগুলি সরান, বিকল্পভাবে -x :

git clean -df

অবশেষে, প্রয়োজনীয় হিসাবে, সর্বশেষ পরিবর্তন পেতে:

git pull

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

সৌভাগ্যক্রমে আমার কোনও শাখা ছিল না যা আমি যত্ন নিয়েছিলাম।

xkcd: গিট


git reset --hard HEAD আসলে শুধুমাত্র শেষ প্রতিশ্রুতি রাষ্ট্র রিসেট। এই ক্ষেত্রে HEAD আপনার শাখার HEAD বোঝায়।

যদি আপনার অনেকগুলি কাজ থাকে তবে এটি কাজ করবে না ..

সম্ভবত আপনি যা করতে চান তা মূলের মূল দিকে রিসেট হয় অথবা আপনি যে কোনও রিমোটরিটি যা বলা হয় তা পুনরায় সেট করা হয়। আমি সম্ভবত ভালো কিছু করতে চাই

git reset --hard origin/HEAD

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





undo