গিটে কমিট করার মধ্যে আমি কীভাবে এগিয়ে এবং পিছনে যেতে পারি?


110

আমি একটি করছি git bisectএবং সমস্যাবদ্ধ প্রতিশ্রুতিতে পৌঁছানোর পরে, আমি এখন সঠিক পদে আছি কিনা তা নিশ্চিত করার জন্য আমি এখন এক ধাপ এগিয়ে / পিছনে নেওয়ার চেষ্টা করছি।

আমি HEAD^ইতিহাসে পিছিয়ে যেতে জানি তবে আমার এগিয়ে যাওয়ার জন্য (ভবিষ্যতে একটি নির্দিষ্ট প্রতিশ্রুতির দিকে) এর মতো আরও একটি শর্টকাট রয়েছে:

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

আমি জানি যে আমার টার্গেট এফ এবং আমি সি থেকে ডি তে যেতে চাই ।


দ্রষ্টব্য: এটি গিটের সদৃশ নয় : কমিটের মধ্যে কীভাবে পিছন পিছন অগ্রসর হয় , আমার প্রশ্নটি কিছুটা আলাদা এবং সেখানে উত্তর দেওয়া হয়নি


4
stackoverflow.com/questions/2263674/… সাহায্য করতে পারে।
ভনসি

git checkout -b new_branch HEAD~4ফিরে হিসাবে মাথা থেকে 4 করে যেতে stackoverflow.com/a/4940090/911945
আন্তন Tarasenko

উত্তর:


61

আমি কিছুটা পরীক্ষা-নিরীক্ষা করেছি এবং এটি অগ্রণী নেভিগেট করার কৌশলটি করতে পারে বলে মনে হয় ( সম্পাদনা করুন : এটি কেবল তখনই কার্যকর হয় যখন আপনার একীভূতকরণ ব্যতিরেকে লিনিয়ার ইতিহাস থাকে):

git checkout $(git rev-list --topo-order HEAD..towards | tail -1)

towardsপ্রতিশ্রুতি বা একটি ট্যাগের একটি SHA1 যেখানে ।

ব্যাখ্যা:

  • কমান্ডটির অভ্যন্তরের $()অর্থ: বর্তমান HEADএবং towardsপ্রতিশ্রুতিবদ্ধ (বাদে HEAD) সমস্ত চুক্তি সম্পাদন করুন এবং এগুলি অগ্রাধিকার ক্রমে বাছাই করুন ( git logপূর্বনির্ধারিত ক্ষেত্রে যেমন - কাল্পনিক ক্রমের পরিবর্তে যা অদ্ভুতভাবে ডিফল্ট হয় rev-list), এবং তারপরে সর্বশেষটি গ্রহণ করুন ( tail), যার কাছে আমরা যেতে চাই।
  • এটি সাবশেলে মূল্যায়ন করা হয় এবং git checkoutএকটি চেকআউট সম্পাদন করতে পাস করা হয়।

.profileনির্দিষ্ট প্রতিশ্রুতির দিকে এগিয়ে যেতে আপনার ফাইলের প্যারামিটার-প্রত্যাশিত উপন্যাস হিসাবে অ্যাক্সেসযোগ্য একটি ফাংশন আপনি সংজ্ঞায়িত করতে পারেন :

# Go forward in Git commit hierarchy, towards particular commit 
# Usage:
#  gofwd v1.2.7
# Does nothing when the parameter is not specified.
gofwd() {
  git checkout $(git rev-list --topo-order HEAD.."$*" | tail -1)
}

# Go back in Git commit hierarchy
# Usage: 
#  goback
alias goback='git checkout HEAD~'

4
এগিয়ে যাওয়া ইতিহাসের সোজা অংশগুলিতে সূক্ষ্মভাবে কাজ করে তবে একত্রিত হওয়ার সময় লুপগুলিতে চলে যায়।
Kostas

হ্যাঁ, আমি আসলে এটি মার্জ করে পরীক্ষা করে দেখিনি। আমি অতিরিক্ত সময়ে একবার দেখার চেষ্টা করব, তবে অস্থায়ীভাবে আমার কিছুটা প্রণোদনা আছে, যেহেতু আমরা আমাদের প্রকল্পে কঠোর রৈখিক ইতিহাসের বিষয়ে সম্মত হয়েছি;)
jakub.g

4
দুর্দান্ত উত্তর! স্বয়ংক্রিয়ভাবে বর্তমান শাখাটি নির্দিষ্ট করে সংশোধন করা হয়েছে: stackoverflow.com/a/23172256/480608
রাইন রেভের

এটি ভুল। পতাকা ব্যবহারের সময় ব্যতীত git logপূর্বনির্ধারিত হিসাবে একইভাবে কালানুক্রমিক ক্রমে কমিটগুলি দেখায় । rev-list--graph
পেপিরো

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

55

আমি বিশ্বাস করি আপনি করতে পারেন:

git reset HEAD@{1}

সময় মতো একজনকে এগিয়ে যেতে। একাধিক কমিটি এগিয়ে যাওয়ার জন্য, হেড @ {2}, হেড @ {3} ইত্যাদি ব্যবহার করুন


51

আপনার পরিষ্কার হওয়া দরকার, বিচ্ছিন্ন হেড স্টেট নয়, চেকআউট নয় reset

git reset HEAD@{1}

5
বা git reset "HEAD@{1}"মাছ এবং পাওয়ারশেলের মতো কয়েকটি শাঁসে .. git reflogসঠিক প্রতিশ্রুতি সন্ধান করতেও কার্যকর হতে পারে।
স্টিভ কুক

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

আমি সময় মতো ফিরে তাকানোর জন্য এটি করেছি, তারপর আমি git reset HEADযেখানে ছিলাম সেখানে ফিরে যেতে পেরেছিলাম ... এখন আমার ভাণ্ডারটি কী অবস্থানে আছে তা আমার কোনও ধারণা নেই এবং সব কিছু ভয়ঙ্কর। আমার এখন কি করা উচিত?
theonlygusti

20

এটি আমি পিছনে পিছনে নেভিগেট করতে ব্যবহার করছি।

পরবর্তী প্রতিশ্রুতিতে সরানো

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}

পূর্ববর্তী প্রতিশ্রুতিতে সরানো

function p() {
    git checkout HEAD^1
}

ধন্যবাদ! আমি এখন এটি ব্যবহার করছি! আমার মতো অন্যান্য নতুনদের জন্য নোটস : হেডকে পুনরায় git checkout <current branch>সংযুক্ত করা, সর্বশেষ প্রতিশ্রুতিতে সংযুক্ত। git checkout -b <new-branch-name>বর্তমান প্রতিশ্রুতি থেকে নতুন শাখায় পরিবর্তন অনুমতি দেয়। git rebase -iকাজ করে। এছাড়াও , নোড সংস্করণ পরিচালক "এন" এর সাথে বিরোধ না এড়াতে আমি আমার n()ফাংশনটির নাম রেখেছি nx()। এলিয়াস চেক করতে ভুলবেন না!
স্টিভেন চই

ফাংশন () {... একটি ইউনিক্স / লিনাক্স ব্যাশ স্ক্রিপ্টিং ফাইল লেখার জন্য, আমি উইন্ডোজ থেকে এসেছি, আমার বুঝতে প্রথমে কিছুটা কঠিন
IcyBrk

9

বলুন এফ সর্বশেষ প্রতিশ্রুতিবদ্ধ trunk(এখানে নিজের শাখার নাম সন্নিবেশ করান) ... আপনি এটিকে trunk~0(বা ন্যায়সঙ্গত trunk), ই হিসাবে trunk~1, ডি trunk~2ইত্যাদি হিসাবে উল্লেখ করতে পারেন Say

কমিটের নাম দেওয়ার আরও আরও উপায়ের জন্য আপনার রেফ্লোগলটি একবার দেখুন।


4
back ফিরে যায়, প্রিয় নয়, ট্রাঙ্ক ~ 2 এ
এমমানুয়েলমেস

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

@ থিওনলিগুস্টি আপনি দুবার HEAD থেকে ফিরে যান।
এমানুয়েলমেস

আপনি এখনও অভিমানী করছি যে শাখা trunkএবং আপনার বর্তমান HEADঅভিন্ন যা হয় না প্রশ্ন, যা আমি বিবৃত করেছি প্রদর্শিত নেই না আমি কি অভিমানী করছি, এবং যা একটি মাধ্যমে খুব অসম্ভাব্য অর্ধ উপায়bisect
বেহুদা

4

আপনি গাছের নীচে চলে যাচ্ছেন বলে পশ্চাদপটে ট্র্যাফিক করা তুচ্ছ কারণ এবং সর্বদা যাওয়ার একটি উপায় আছে

  function git_down
        git checkout HEAD^
  end

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

  function git_up 
        git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
  end

ব্যবহার: git down,git up <branch-name>


পেছনে যাওয়া পুরোপুরি অনন্য নয়, যখন মার্জগুলি জড়িত থাকে। যদিও HEAD^সাধারণত যুক্তিসঙ্গত ডিফল্ট হয়।
কেডিবি

2

আপনি যদি সামনে দেখতে চান তবে আপনি এই কৌশলটি করতে পারেন, কারণ গিটের পক্ষে এর জন্য কঠোর আদেশ নেই।

git log --reverse COMMIT_HASH..

উদাহরণ

লগ ইতিহাসের হ্যাশগুলির তালিকা:

A
B
C -> put this
D

কমান্ড ব্যবহার করে git log --reverse C..আউটপুট আপনি দেখতে পাবেন বি এবং


1

সম্ভবত সর্বোত্তম উপায় নয় তবে আপনি কমিটের git logতালিকা দেখতে ব্যবহার করতে পারেন এবং তারপরে git checkout [sha1 of D]ডি তে স্থানান্তর করতে পারেন use


6
আমি এটি পাই না, যদি সে সি থাকে তবে গিট লগ তাকে কেবল সি, বি এবং এ
দেখাবে

ঠিক আছে, এটি পেয়েছেন, তবে আপনাকে ভোকের দেওয়া লিঙ্কে উল্লিখিত একটি গিট-লগের মতো করতে হবে
বিলথন

1

আমি এই সম্পর্কে একটি পরীক্ষা করেছি। উদাহরণস্বরূপ বলুন আপনি মাস্টার শাখায় আছেন তারপর করুন:

git checkout HEAD@{3}

সুতরাং মাথাটি বিচ্ছিন্ন হয়ে যায় এবং আপনি অন্য কোনও প্রতিশ্রুতিতে যেতে আবার চেষ্টা করতে পারেন:

git checkout HEAD@{4}

একবার আপনার চারপাশে নজর কাড়ানোর পরে, কেবল সেই শাখায় পরীক্ষা করে আপনি আপনার মূল অবস্থায় ফিরে যেতে পারেন। আমার উদাহরণে: মাস্টার শাখা

git checkout master

যদি আপনি মূল অবস্থায় যেতে না চান এবং যদি চান তবে যে কোনও একটি অঙ্গীকারকে আপনার মাথা হিসাবে ধরে রাখুন এবং সেখান থেকে চালিয়ে যেতে চান, তবে আপনাকে সেখান থেকে শাখা করা দরকার। উদাহরণস্বরূপ "গিট চেকআউট হেড @ {4}" পরে, আপনি ইস্যু করতে পারেন

git checkout -b MyNewBranch

0

কর্মপরিকল্পনা হিসাবে, আপনি কেবল তার সাথে HEAD এ ফিরে আসতে পারেন

git checkout <branch>

এবং তারপরে আপনি যে প্রতিশ্রুতিটি করতে চান তাতে যান

git checkout HEAD~<offset>

0

আপনি যদি বনাম কোড ব্যবহার করছেন তবে গিট ইতিহাস হ'ল একটি দুর্দান্ত প্লাগইন যেখানে আপনি দক্ষতার সাথে কমিটগুলি দেখতে এবং সম্পাদকের মধ্যেই তাদের সামগ্রীগুলি পরীক্ষা করতে পারেন। খুঁজে বার করো লিংক


0
branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)

কোথায়:

branchName শাখার নাম সমান

commitInOrder নির্বাচিত শাখায় প্রথম প্রতিশ্রুতি থেকে কমিটের সমান হয় (সুতরাং 1 খুব প্রথম কমিট, 2 শাখায় দ্বিতীয় কমিট ইত্যাদি)

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