'হারানো' জনসহ সমস্ত গিট কমিটের একটি তালিকা পান


139

বলি যে আমার এই জাতীয় গ্রাফ রয়েছে:

A---B---C---D (master)
     \
      \-E---F (HEAD)

যদি আমি তা করি তবে আমি git log --all --onelineআমার ছয়টি কমিট পেয়ে যাব।

তবে গ্রাফটি যদি হয়

A---B---C---D (master, HEAD)
     \
      \-E---F

আমি ই এবং এফ দেখতে পাব না, নাম না থাকা শাখাগুলি সহ সমস্ত কমিট আমাকে বলার জন্য কি আমি গিট পেতে পারি?

ধন্যবাদ

উত্তর:


63

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

সুতরাং অপ্রকাশিত উত্তরটি হ'ল, আপনার আগ্রহী জিনিসগুলি ট্র্যাক করবেন না More আরও গুরুত্বের সাথে, রিফ্লাগগুলি ডিফল্টরূপে আপনি গত days০ দিন বা তার বেশি সময় ধরে ব্যবহার করেছেন এমন সমস্ত কমিটের রেফারেন্স রাখবে। আরও গুরুত্বপূর্ণ, তারা যেসব প্রতিশ্রুতিবদ্ধ সেগুলি সম্পর্কে কিছু প্রসঙ্গ দেবে ।


7
+1: ইচ্ছাকৃতভাবে অনাথ commit --amendবা rebaseএকটি বিচ্ছিন্নভাবে হেডের সাথে কাজ করে অনাথ হয়ে যাওয়া কোনও অঙ্গীকারের মধ্যে একেবারেই পার্থক্য নেই , বলুন।
ক্যাসাবেল

3
প্রকৃতপক্ষে. সম্ভবত সেই পরিস্থিতি থেকে পুনরুদ্ধার করার সহজতম উপায় হ'ল হেডের নিজেই রিফ্লোগটি সন্ধান করা।
আরাকনিদ

@ জেফ্রোমি: মৃতপ্রান্ত git commit --amendছেড়ে যাওয়া, হারিয়ে যাওয়া কমিটিকে ছেড়ে দেওয়া ইত্যাদি সম্পর্কে দুর্দান্ত বিষয় point আমি কিছু রিবিসিং এবং হোয়াট নট করেছিলাম এবং কিছু শাখা থেকে পৌঁছনীয় নয় এমন কিছু প্রতিশ্রুতি দিয়ে শেষ করেছি এবং এগুলিকে রেপোতে রেখে কিছুটা নোংরা অনুভব করেছি। এখন ভাবনা আর তেমন উদ্বেগজনক নয়। :)
এমিল লুন্ডবার্গ

2
@ আরাকনিদ আমি নিজেই মূল পোস্টারের মতো আচারে উঠলাম এবং আপনার রিফ্লোগটি দেখার পরামর্শটি করণীয় ছিল।
ইগনাজিও

7
আমি এই উত্তরের সাথে একমত, তবে যে ক্ষেত্রে ইচ্ছাকৃত বা দুর্ঘটনাক্রমে অনাথদের সহ সকলের প্রতিশ্রুতি দেখার প্রয়োজন আছে সেই ক্ষেত্রে তা সরবরাহ git fsck --unreachableকরে না। আমি এটি চেষ্টা করেছিলাম। কেনোরব উত্তর হিসাবে, আরও ভাল পদ্ধতির --reflogবিকল্প হয় । এ সম্পর্কে বিশেষত দুর্দান্ত যা এর সাথে মিলিত হয়েছে , আপনি ভিজ্যুয়াল প্রসঙ্গটি পার্স করার পক্ষে একটি সহজ পেতে পারেন, মূল প্রশ্নের মধ্যে এটির মতোই। উদাহরণস্বরূপ, চেষ্টা করুন:git log--graphgit log --graph --all --oneline --reflog
Inigo

111

চেষ্টা করুন:

git log --reflog

যা রেফ্লোগ ( git reflog) দ্বারা উল্লিখিত সমস্ত বস্তু হিসাবে কমান্ড লাইনে তালিকাভুক্ত রয়েছে তা ভান করে সমস্ত গিট কমিটকে তালিকাবদ্ধ করে <commit>


1
এটিই আমি সন্ধান করছিলাম - --ফ্রলগ যুক্তির কার্যকারিতা।
অ্যানোমালি

3
বিটিডব্লিউ, গিটক এটিকে সমর্থন করে: gitk --reflog।
ald.li

50

আমি যখন এই সমস্যাটি মোকাবেলা করি তখন আমি নিম্নলিখিত কমান্ডটি ব্যবহার করি:

git reflog |  awk '{ print $1 }' | xargs gitk

এটি আমাকে সাম্প্রতিক কমিটগুলি কল্পনা করতে দেয় যা মাথা বিহীন হয়ে পড়েছে।

আমি এটিকে একটি স্ক্রিপ্ট সাহায্যকারী হিসাবে আবৃত করেছি ~/bin/git-reflog-gitk


1
এটি কেবল আমাকে বড় সময় বাঁচিয়েছে ... ধন্যবাদ!
ব্রেট রয়েস্টার

এটা সত্যিই দারুন! ধন্যবাদ! এটি সত্যই গাছের গুরুত্বপূর্ণ অংশগুলির দৃশ্যধারণ করে izes
ম্লাদেন বি।

কেবলমাত্র একটি টিপ: এটি আপনার স্থানীয় কাজের জন্য কেবল রিফ্লগ রেকর্ড হিসাবে কাজ করবে when the tips of branches and other references were updated in the *local repository*। আপনি git log --reflogযদি অ-স্থানীয় রেফার পরিবর্তনের জন্য এটি করতে চান তবে আপনি ব্যবহার করতে চাইতে পারেন
কৃষ্ণ গুপ্ত

29

আমার জীবন যা রক্ষা করেছিল তা হ'ল নিম্নলিখিত আদেশ:

git reflog

সেখানে আপনি ইতিহাসের মতো একটি পর্দা পাবেন যাতে এটির মতো গিটার কাজ করা যায়:

এখানে চিত্র বর্ণনা লিখুন

এই মুহুর্তে, আপনাকে কেবলমাত্র HEAD@{X}আপনার প্রয়োজনীয় জিনিসগুলি সন্ধান করতে হবে, একটি অস্থায়ী শাখা তৈরি করতে হবে এবং এটিতে এভাবে চলে যেতে হবে:

git checkout -b temp_branch HEAD@{X}

সেভাবে আপনার গিট রিপোজিটরিটি ছাড় বা ছাড়িয়ে না ফেলে আপনার হারানো প্রতিশ্রুতি সহ অস্থায়ী শাখা থাকবে।

আশাকরি এটা সাহায্য করবে...


26

@ কিয়েরান এর উত্তর পছন্দ করুন তবে কনসোলের জন্য: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')


আপনার কি শেষ অংশটি অন্তর্ভুক্ত করা দরকার: $ (গিট রিফ্লগ | অ্যাজক '{মুদ্রণ $ 1}')? এটি কি করে? আপনার সমাধানটি চেষ্টা করার পরে, দেখে মনে হচ্ছে এটি শেষ অংশ ছাড়াই একই আউটপুট উত্পাদন করে।
wmock

যদি আপনি আপনার শাখার পয়েন্টারটি সরান এবং কোনও রেফারেন্স ছাড়াই কিছু কমিটগুলি ছেড়ে দেন (যেমন ওপি করেছেন) তারা আর প্রদর্শিত হবে না git log --all। একটি দ্রুত উদাহরণ: git reset --hard @^আপনার হেড @ {0} প্রতিশ্রুতিটি কেবল পুনর্বিবেজে থাকবে এবং যেহেতু git reflogসমর্থন করে না --graphআপনাকে git log --graphভিজ্যুয়াল উপস্থাপনা পাওয়ার জন্য কমিটগুলি পাস করতে হবে।
ফ্লোরিয়ান ফিদা

5
আপনি এর --reflogপরিবর্তে $(git reflog | awk '{print $1}')
সিল্ড

আমি তুলনা git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')করি git log --oneline --all --graph --decorate --reflog, তারা --reflog বাদে প্রায় অভিন্ন যেমন ডাব্লুআইপি এন্ট্রি হিসাবে বিশদ বিবরণ অন্তর্ভুক্ত।
স্ক্রিপ্ট ওল্ফ

@ ফ্লোরিয়ানফিডা, এর পরিবর্তে reflogকেন ব্যবহার করবেন log --reflogনা?
পেসারিয়ার

9

আমি কীভাবে এই সমস্যার সমাধান করব? ব্যবহার git fsckএবং লগিং!

প্রথমে হারিয়ে যাওয়া (অ্যাক্সেসযোগ্য) কমিট এবং ব্লবসযুক্ত একটি ফাইল তৈরি করুন। (দ্রষ্টব্য: আপনি যদি এমন কিছু করেন git gcতবে এটি আবদ্ধ করা সমস্তগুলি আবর্জনা সংগ্রহ করবে এবং আপনি এটি এখানে পাবেন না!)

$git fsck --lost-found > lost_found.commits

এটি আপনাকে এই জাতীয় একটি ফাইল দেয়:

আনত কমিট dec2c5e72a81ef06963397a49c4b068540fc0dc3
আনত ফোঁটা f8c2579e6cbfe022f08345fa7553feb08d60a975
আনত ফোঁটা 0eb3e86dc112332ceadf9bc826c49bd371acc194
আনত ফোঁটা 11cbd8eba79e01f4fd7f496b1750953146a09502
আনত কমিট 18733e44097d2c7a800650cea442febc5344f9b3
আনত ফোঁটা 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

তারপরে আপনি সেখান থেকে কমিট / ব্লগ হ্যাশ অনুলিপি করতে আপনার প্রিয় পাঠ্য সম্পাদক সহ এই ফাইলটি খুলতে পারেন। (* কাশি * ভিম ম্যাক্রোস এই * কাশি * এর জন্য দুর্দান্ত কাজ করে )

এখন আপনি এই প্রতিশ্রুতি থেকে আবার কিছু দিয়ে লগ ইন করতে পারেন git log --oneline <commit hash>। বিকল্পভাবে, গিটক, টিগ বা অন্য কোনও গিট ভিউয়ারকে কাজ করা উচিত।

আপনার ক্ষেত্রে যদি আপনি কমিটের জন্য F হ্যাশ পান তবে লগটি আপনাকে এরকম কিছু দেখায়,

A---B---E---F

দ্রুত এবং সহজ! এখন আপনি এই সমস্ত ঝুঁকিপূর্ণ কমিটের পিছনে প্রসঙ্গটি খুঁজে পেতে পারেন।

পিএস হ্যাঁ, আমি জানি, দেরী পোস্ট, তবে ওহ ভাল, কেউ এটি এখানে খুঁজে পেতে এবং এটি দরকারী মনে হতে পারে। (সম্ভবত আমি যখন এটি আবার গুগল করি তখন 6 মাসের মধ্যে সম্ভবত)


5

আমার কাছে ভাগ্য ছিল যে রেফ্লগটি ছিল, যা এখানে ছিল তা দেখে প্রতিশ্রুতি পুনরুদ্ধার করতে পেরেছি .git/logs/HEAD

তারপরে আমাকে ফাইলটির শেষের দিকে যেতে হয়েছিল এবং আমি সবেমাত্র হারিয়ে যাওয়া প্রতিশ্রুতিটি পেয়েছি।


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

5

আমরা git logকখনও কখনও সমস্ত কমিটের বিবরণ পেতে ভাল না, তাই এটি দেখতে ...

ম্যাকের জন্য: গিট প্রকল্পে প্রবেশ করুন এবং টাইপ করুন:

$ nano .git/logs/HEAD

আপনি যে সমস্ত প্রতিশ্রুতিবদ্ধ তা দেখতে, বা:

$ gedit .git/logs/HEAD

আপনাকে সমস্ত প্রতিশ্রুতি দেখার জন্য,

তারপরে আপনি আপনার যে কোনও প্রিয় ব্রাউজারে সম্পাদনা করতে পারবেন।


3

@bsimmons

git fsck --lost-found | grep commit

তারপরে প্রত্যেকের জন্য একটি শাখা তৈরি করুন:

$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4

$ git branch  branch_2806a3 2806a3
$ git branch  branch_6d0e49 6d0e49
$ git branch  branch_91ca9b 91ca9b

এখন অনেক সরঞ্জাম আপনাকে সেই হারানো কমিটগুলির গ্রাফিকাল ভিজ্যুয়ালাইজেশন দেখায়।


2

আপনি যদি গিট এক্সটেনশানস জিইউআই ব্যবহার করেন এটি যদি আপনি "দেখুন -> রিফ্লগের রেফারেন্সগুলি দেখান" পরীক্ষা করে থাকেন তবে তা ঝুঁকিপূর্ণ কমিটগুলির একটি গ্রাফিকাল ভিজ্যুয়ালাইজেশন প্রদর্শন করতে পারে। এটি অন্যান্য অন্যান্য রেফারেন্সযুক্তদের মতো গাছের মধ্যে ঝোলা ঝাঁকুনির কাজ করবে। আপনি যা সন্ধান করছেন এটি এটি সহজ উপায়।

প্রদর্শনের জন্য এই চিত্রটি দেখুন । চিত্রটিতে কমিটস সি 2, সি 3, সি 4 এবং সি 5 ঝুঁকছে তবে এখনও দৃশ্যমান।


2
git log --reflog

আমাকে বাঁচাতে! হেড মার্জ করার সময় আমি আমার হারিয়ে ফেলেছিলাম এবং আমার লেটস কমিট করতে পেলাম না! উত্স ট্রিতে দেখানো হচ্ছে না তবে এর git log --reflogআগে আমার সমস্ত স্থানীয় কমিটগুলি দেখান

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.