আমি কীভাবে সহজেই কোনও অতীত প্রতিশ্রুতি ফিক্সআপ করতে পারি?


115

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

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

git stash                      # temporarily put my work aside
git rebase -i <bad_commit>~1   # rebase one step before the bad commit
                               # mark broken commit for editing
vim <affected_sources>         # fix the bug
git add <affected_sources>     # stage fixes
git commit -C <bad_commit>     # commit fixes using same log message as before
git rebase --continue          # base all later changes onto this

যাইহোক, এটি প্রায়শই ঘটে থাকে যে উপরের ক্রমটি বিরক্তিকর হয়ে উঠছে। বিশেষত 'ইন্টারেক্টিভ রিবেস' বিরক্তিকর। উপরের ক্রমটির কোনও শর্টকাট আছে, যা আমাকে অতীতের মঞ্চ পরিবর্তনগুলি দিয়ে একটি স্বেচ্ছাসেবক অঙ্গীকার সংশোধন করতে দেয়? আমি পুরোপুরি সচেতন যে এটি ইতিহাস পরিবর্তন করে, তবে আমি প্রায়শই ভুল করে থাকি যে সত্যিই এমন কিছু করতে পছন্দ করি

vim <affected_sources>             # fix bug
git add -p <affected_sources>      # Mark my 'fixup' hungs for staging
git fixup <bad_commit>             # amend the specified commit with staged changes,
                                   # rebase any successors of bad commit on rewritten 
                                   # commit.

সম্ভবত একটি স্মার্ট স্ক্রিপ্ট যা নদীর গভীরতানির্ণয় সরঞ্জামগুলি ব্যবহার করে পুনরায় লিখতে পারে বা তাই?


"পুনর্বার" দ্বারা কমিট করার অর্থ কী? তারপর আপনি ইতিহাস পরিবর্তন করছি যদি সব পরিবর্তিত করে যেহেতু করে আছে আলাদা হতে, কিন্তু লিঙ্ক প্রশ্নের গৃহীত উত্তর পুনরায় অর্ডার নেই কোনো অর্থপূর্ণ অর্থে হলেও ক্ষতি নেই।
সিবি বেইলি

1
@ চারেলস: আমার অর্থ এই হিসাবে পুনরায় করা হয়েছে: যদি আমি লক্ষ্য করি যে হেড ~ 5 ভাঙ্গা প্রতিশ্রুতি, লিঙ্কিত প্রশ্নে নিম্নলিখিত গৃহীত উত্তর হ'ল (শাখার ডগা) স্থির প্রতিশ্রুতিবদ্ধ করে তোলে। যাইহোক, আমি চাই HE 5 স্থির প্রতিশ্রুতিবদ্ধ হতে - যা ইন্টারেক্টিভ রিবেস ব্যবহার করার সময় এবং ফিক্সিংয়ের জন্য একক প্রতিশ্রুতি সম্পাদনা করার সময় আপনি যা পান।
ফ্রেরিচ রাবাবে

হ্যাঁ, তবে তারপরে রিবাজে কমান্ডটি মাস্টারটিকে পুনরায় চেকআউট করবে এবং পরবর্তী কমিটগুলি নির্দিষ্ট প্রতিশ্রুতিতে পুনর্বার করবে। তুমি কি এভাবে চালাচ্ছ rebase -i?
সিবি বেইলি

আসলে, এই উত্তরটি নিয়ে একটি সম্ভাব্য সমস্যা রয়েছে, আমি মনে করি এটি হওয়া উচিত rebase --onto tmp bad-commit master। লিখিত হিসাবে এটি স্থির অঙ্গীকারের স্থিতিতে খারাপ প্রতিশ্রুতি প্রয়োগের চেষ্টা করবে।
সিবি বেইলি

ফিক্সআপ / রিবেস প্রক্রিয়াটি স্বয়ংক্রিয় করার জন্য এখানে অন্য একটি সরঞ্জাম: স্ট্যাকওভারফ্লো
মিকা এলোরান্ট

উত্তর:


164

উত্তর উত্তর

কিছুক্ষণ আগে, একটি নতুন --fixupযুক্তি যুক্ত করা হয়েছিল git commitযা উপযুক্ত লগ বার্তা সহ কমিট নির্মাণে ব্যবহার করা যেতে পারে git rebase --interactive --autosquash। অতীত প্রতিশ্রুতি ফিক্সআপ করার সহজ উপায় এখন:

$ git add ...                           # Stage a fix
$ git commit --fixup=a0b1c2d3           # Perform the commit to fix broken a0b1c2d3
$ git rebase -i --autosquash a0b1c2d3~1 # Now merge fixup commit into broken commit

মূল উত্তর

এখানে আমি পাইথন স্ক্রিপ্টটি কিছুক্ষণ আগে লিখেছিলাম যা এই git fixupযুক্তিকে বাস্তবায়ন করে যা আমি আমার আসল প্রশ্নে আশা করি। স্ক্রিপ্টটি ধরে নিয়েছে যে আপনি কিছু পরিবর্তন করেছিলেন এবং তারপরে প্রদত্ত প্রতিশ্রুতিতে এই পরিবর্তনগুলি প্রয়োগ করে।

দ্রষ্টব্য : এই স্ক্রিপ্টটি উইন্ডোজ-নির্দিষ্ট; এটি ব্যবহার git.exeকরে GIT_EDITORপরিবেশের পরিবর্তনশীল সন্ধান করে এবং সেট করে set। অন্যান্য অপারেটিং সিস্টেমের জন্য এটি প্রয়োজনীয় হিসাবে সামঞ্জস্য করুন।

এই স্ক্রিপ্টটি ব্যবহার করে আমি ঠিকভাবে 'ভাঙা উত্সগুলি, স্টেজ ফিক্সগুলি, গিট ফিক্সআপ চালাতে পারি' ওয়ার্কফ্লোটি আমি ঠিকভাবে প্রয়োগ করতে পারি:

#!/usr/bin/env python
from subprocess import call
import sys

# Taken from http://stackoverflow.com/questions/377017/test-if-executable-exists-in python
def which(program):
    import os
    def is_exe(fpath):
        return os.path.exists(fpath) and os.access(fpath, os.X_OK)

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file

    return None

if len(sys.argv) != 2:
    print "Usage: git fixup <commit>"
    sys.exit(1)

git = which("git.exe")
if not git:
    print "git-fixup: failed to locate git executable"
    sys.exit(2)

broken_commit = sys.argv[1]
if call([git, "rev-parse", "--verify", "--quiet", broken_commit]) != 0:
    print "git-fixup: %s is not a valid commit" % broken_commit
    sys.exit(3)

if call([git, "diff", "--staged", "--quiet"]) == 0:
    print "git-fixup: cannot fixup past commit; no fix staged."
    sys.exit(4)

if call([git, "diff", "--quiet"]) != 0:
    print "git-fixup: cannot fixup past commit; working directory must be clean."
    sys.exit(5)

call([git, "commit", "--fixup=" + broken_commit])
call(["set", "GIT_EDITOR=true", "&&", git, "rebase", "-i", "--autosquash", broken_commit + "~1"], shell=True)

2
আপনি আপনার git stashgit stash pop
রিবেসটি

@TobiasKienzler: ব্যবহার সম্পর্কে git stashএবং git stash pop: তুমি ঠিক আছে, কিন্তু দুর্ভাগ্যবশত git stashহয় অনেক তুলনায় এটি লিনাক্স বা OS / এক্স হয় Windows এ ধীর। যেহেতু আমার ওয়ার্কিং ডিরেক্টরিটি সাধারণত পরিষ্কার থাকে, তাই আদেশটি ধীর না করার জন্য আমি এই পদক্ষেপটি বাদ দিয়েছি।
ফ্রিরিচ রাবাব

আমি এটি নিশ্চিত করতে পারি, বিশেষত কোনও নেটওয়ার্ক শেয়ারে কাজ করার সময়: - /
টোবিয়াস কেইনজলার

1
খুশী হলাম। আমি দুর্ঘটনাক্রমে করেছি git rebase -i --fixup, এবং এটি সূচনা-পয়েন্ট হিসাবে শুরুর পয়েন্ট হিসাবে প্রত্যাবর্তন, তাই sha যুক্তি আমার ক্ষেত্রে প্রয়োজন ছিল না।
fwielstra

1
লোকেরা --autosquash প্রায়শই ব্যবহার করে এটি ডিফল্ট আচরণ হিসাবে সেট করা কার্যকর হতে পারে: git config --global rebase.autosquash true
taktak004

31

আমি যা করি তা হ'ল:

গিট অ্যাড ... # ফিক্স যুক্ত করুন।
গিট কমিট # প্রতিশ্রুতিবদ্ধ, তবে ভুল জায়গায়।
গিট রিবেস -i হেড ~ 5 # রিবেসিংয়ের জন্য সর্বশেষ 5 টি প্রতিশ্রুতি পরীক্ষা করুন।

আপনার সম্পাদক সর্বশেষ 5 টি কমিটের তালিকা সহ খোলার জন্য প্রস্তুত থাকবে with পরিবর্তন:

08e833c ভাল পরিবর্তন 1 বেছে নিন।
9134ac9 নিন ভাল পরিবর্তন 2।
বাছাই 5adda55 খারাপ পরিবর্তন!
400bce4 নিন ভাল পরিবর্তন 3।
2bc82n1 বাছাই করুন খারাপ পরিবর্তনের ফিক্স।

...প্রতি:

08e833c ভাল পরিবর্তন 1 বেছে নিন।
9134ac9 নিন ভাল পরিবর্তন 2।
বাছাই 5adda55 খারাপ পরিবর্তন!
f 2bc82n1 খারাপ পরিবর্তনের ফিক্স। # উপরে সরান এবং 'ফিক্সআপ' এর জন্য 'বাছাই' পরিবর্তন করুন 'চ' তে।
400bce4 নিন ভাল পরিবর্তন 3।

আপনার সম্পাদককে সংরক্ষণ করুন এবং প্রস্থান করুন এবং এটির সাথে সম্পর্কিত প্রতিশ্রুতিতে ফিক্সটি আবার স্কোয়েশ হয়ে যাবে।

কয়েকবার এটি করার পরে, আপনি এটি আপনার ঘুমের মধ্যে কয়েক সেকেন্ড পরে করবেন। ইন্টারেক্টিভ রিবেসিং এমন বৈশিষ্ট্য যা আমাকে সত্যিই গিটে বিক্রি করেছিল sold এটি এর জন্য অবিশ্বাস্যভাবে কার্যকর এবং আরও কিছু ...


9
স্পষ্টতই আপনি আরও পিছনে যেতে হেড ~ 5 কে হেড ~ n এ পরিবর্তন করতে পারেন। আপনি উপরের দিকে ধাক্কা খাওয়া কোনও ইতিহাসের সাথে আপনি হস্তক্ষেপ করতে চাইবেন না, তাই আমি কেবল 'গিট রিবেস -i উত্স / মাস্টার' টাইপ করি তা নিশ্চিত করতে যে আমি কেবল অনাবৃত ইতিহাস পরিবর্তন করছি।
ক্রিস জেনকিনস

4
এটি অনেকটা আমি সর্বদা যা করার মতো; এফডব্লিউআইডাব্লু, আপনি সম্ভবত --autosquashস্যুইচ করতে আগ্রহী হতে পারেন git rebaseযা স্বয়ংক্রিয়ভাবে আপনার জন্য সম্পাদকের পদক্ষেপগুলিকে পুনর্বিন্যাস করে। কোনও স্ক্রিপ্টের জন্য আমার প্রতিক্রিয়া দেখুন যা কোনও git fixupকমান্ড বাস্তবায়নের জন্য এর সদ্ব্যবহার করে ।
ফ্রেরিচ রাবাবে

আমি জানতাম না যে আপনি কেবল হ্যাশগুলি পুনরায় অর্ডার করতে পারবেন, দুর্দান্ত!
অ্যারন ফ্র্যাঙ্ক

ওটা দারুন! সমস্ত রিবেস কাজ সম্পন্ন হয়েছে তা নিশ্চিত করার জন্য পৃথক বৈশিষ্ট্য শাখা branch এবং মাস্টারের মতো সাধারণ শাখায় গণ্ডগোল না।
জয় মোদী

22

পার্টিতে কিছুটা দেরি হলেও এখানে এমন একটি সমাধান যা লেখকের কল্পনা অনুসারে কাজ করে।

এটি আপনার .gitconfig এ যুক্ত করুন:

[alias]
    fixup = "!sh -c '(git diff-files --quiet || (echo Unstaged changes, please commit or stash with --keep-index; exit 1)) && COMMIT=$(git rev-parse $1) && git commit --fixup=$COMMIT && git rebase -i --autosquash $COMMIT~1' -"

ব্যবহারের উদাহরণ:

git add -p
git fixup HEAD~5

তবে আপনার যদি স্টেস্টেড পরিবর্তন না থেকে থাকে তবে আপনাকে অবশ্যই রিবেসের আগে স্ট্যাশ করতে হবে।

git add -p
git stash --keep-index
git fixup HEAD~5
git stash pop

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


এটি বেশ সহায়ক। আমার কাছে সর্বাধিক সাধারণ ইউজকেস হ'ল পূর্বের প্রতিশ্রুতিতে পরিবর্তনগুলি ঠিক করা, তাই git fixup HEADআমি একটি উপকরণ তৈরি করেছি। আমি মনে করি এটির জন্য আমি সংশোধনও ব্যবহার করতে পারি।
তৃণমূল

ধন্যবাদ! আমি প্রায়শই প্রায়শই এটি সর্বশেষ প্রতিশ্রুতিতে ব্যবহার করি তবে দ্রুত সংশোধন করার জন্য আমার আরেকটি উপাধি রয়েছে। amend = commit --amend --reuse-message=HEADতারপরে আপনি কমিট ম্যাসেজের জন্য কেবল টাইপ git amendবা সম্পাদনা করতে পারেন git amend -a
dschlyter

3
সংশোধন করার সমস্যাটি হ'ল এটি কীভাবে বানান তা আমার মনে নেই। আমাকে সর্বদা ভাবতে হবে, এটি কি প্রশংসিত বা সংশোধন করা এবং এটি ভাল নয়।
ঘাসফড়িং

12

একটি প্রতিশ্রুতি স্থির করতে:

git commit --fixup a0b1c2d3 .
git rebase --autosquash -i HEAD~2

যেখানে a0b1c2d3 প্রতিশ্রুতিবদ্ধ হয় যে আপনি ফিক্সআপ চান এবং যেখানে 2 পরিবর্তন করেছেন তার সংখ্যা +1 আপনি যে পরিবর্তন করতে চান তা পোস্ট করা হয়েছে।

দ্রষ্টব্য: গিট রিবেস --আউটসকোয়াশ -i ছাড়া কাজ করে না তবে -i কাজ করে যা আশ্চর্যজনক।


2016 এবং --autosquashছাড়া -iএখনও কাজ করে না।
জোনাথন ক্রস

1
ম্যান পেজ যেমন বলে: এই বিকল্পটি কেবল তখনই বৈধ হয় যখন - ইন্টারেক্টিভ বিকল্পটি ব্যবহৃত হয়। তবে সম্পাদকটি এড়িয়ে যাওয়ার সহজ উপায় রয়েছে:EDITOR=true git rebase --autosquash -i
জোয়েটউইডল

২ য় পদক্ষেপটি আমার পক্ষে কাজ করে না, বলেছেন: দয়া করে আপনি কোন শাখার বিরুদ্ধে পুনর্বাসনা করতে চান তা নির্দিষ্ট করুন।
7:30 এ জাজোনৌট

গিট রিবেস --autosquash -i হেড ~ 2 (যেখানে আপনি পরিবর্তন করতে চান এমন +1 পোস্ট করা কমিটের সংখ্যা 2
সের্গিও

6

আপডেট: স্ক্রিপ্টের একটি ক্লিনার সংস্করণ এখন এখানে পাওয়া যাবে: https://github.com/deiwin/git-dotfiles/blob/docs/bin/git-fixup

আমি অনুরূপ কিছু সন্ধান করছি। পাইথনের এই লিপিটি অত্যন্ত জটিল বলে মনে হচ্ছে, অতএব, আমি নিজের সমাধানটি একসাথে রেখেছি:

প্রথমত, আমার গিট এলিয়াসগুলি দেখতে দেখতে ( এখান থেকে ধার করা ):

[alias]
  fixup = !sh -c 'git commit --fixup=$1' -
  squash = !sh -c 'git commit --squash=$1' -
  ri = rebase --interactive --autosquash

এখন বাশ ফাংশনটি বেশ সহজ হয়ে যায়:

function gf {
  if [ $# -eq 1 ]
  then
    if [[ "$1" == HEAD* ]]
    then
      git add -A; git fixup $1; git ri $1~2
    else
      git add -A; git fixup $1; git ri $1~1
    fi
  else
    echo "Usage: gf <commit-ref> "
  fi
}

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

if [[ "$1" == HEAD* ]]অংশ (থেকে ধার এখানে ), ব্যবহার করা হয় কারন যদি আপনি ব্যবহার, উদাহরণস্বরূপ, মাথা ~ 2 আপনার যেমন কমিট (কমিট আপনার সাথে বর্তমান পরিবর্তন ঠিক চান) রেফারেন্স তারপর মাথা বাস্তুচ্যুত করা হবে পরে ফিক্সআপ তৈরি করা হয়েছে কমিট এবং একই প্রতিশ্রুতি উল্লেখ করতে আপনাকে হেড ~ 3 ব্যবহার করতে হবে।


আকর্ষণীয় বিকল্প। +1
ভোনসি

4

আপনি "নাল" সম্পাদক ব্যবহার করে ইন্টারেক্টিভ পর্যায়টি এড়াতে পারেন:

$ EDITOR=true git rebase --autosquash -i ...

এটি /bin/trueপরিবর্তে সম্পাদক হিসাবে ব্যবহার করবে /usr/bin/vim। এটি সর্বদা বিনা অনুরোধে গিটের পরামর্শ অনুসারে গ্রহণ করে।


প্রকৃতপক্ষে, আমি 30 শে সেপ্টেম্বর 2010 থেকে পাইথন স্ক্রিপ্টের উত্তরটি আমার 'আসল উত্তর' তে ঠিক ঠিক এটাই করেছি (স্ক্রিপ্টের নীচে কীভাবে তা উল্লেখ করুন call(["set", "GIT_EDITOR=true", "&&", git, "rebase", "-i" ...)।
ফ্রেরিচ রাবাবে

4

ফিক্সআপ ওয়ার্কফ্লো সম্পর্কে আমাকে সত্যিই বিরক্ত করেছিল তা হ'ল আমি নিজেকে খুঁজে বের করতে হয়েছিল যে প্রতিশ্রুতিতে আমি যে পরিবর্তনটি স্কোয়াশ করতে চেয়েছিলাম তা প্রতিশ্রুতিবদ্ধ। আমি একটি "গিট ফিক্সআপ" কমান্ড তৈরি করেছি যা এটির সাথে সহায়তা করে।

এই কমান্ডটি যুক্ত যাদু দ্বারা ফিক্সড কমিটস তৈরি করে যা এটি গিট-ডিপগুলি স্বয়ংক্রিয়ভাবে প্রাসঙ্গিক প্রতিশ্রুতি সন্ধান করতে ব্যবহার করে, তাই কর্মপ্রবাহটি প্রায়শই নেমে আসে:

# discover and fix typo in a previously committed change
git add -p # stage only typo fix
git fixup

# at some later point squash all the fixup commits that came up
git rebase --autosquash master

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

পূর্ববর্তী পরিবর্তিত রেখায় ছোট পরিবর্তনগুলি আমার কার্যকারী শাখায় কমিটে দ্রুত সংহত করতে আমি এটি আমার দৈনন্দিন কর্মপ্রবাহে প্রচুর ব্যবহার করি । স্ক্রিপ্টটি যতটা সুন্দর হতে পারে তেমন সুন্দর নয়, এবং এটি zsh এ লেখা হয়েছে, তবে এটি আমার পক্ষে কাজটি বেশ ভাল সময়ের সাথে করে চলেছে আর এখনই আমি কখনই এটি পুনরায় লেখার প্রয়োজন বোধ করি নি:

https://github.com/Valodim/git-fixup


2

আপনি এই উপনামটি ব্যবহার করে একটি নির্দিষ্ট ফাইলের জন্য একটি ফিক্সআপ তৈরি করতে পারেন ।

[alias]
...
# fixup for a file, using the commit where it was last modified
fixup-file = "!sh -c '\
        [ $(git diff          --numstat $1 | wc -l) -eq 1 ] && git add $1 && \
        [ $(git diff --cached --numstat $1 | wc -l) -eq 1 ] || (echo No changes staged. ; exit 1) && \
        COMMIT=$(git log -n 1 --pretty=format:"%H" $1) && \
            git commit --fixup=$COMMIT && \
            git rebase -i --autosquash $COMMIT~1' -"

আপনি যদি কিছু পরিবর্তন করেছেন myfile.txtতবে আপনি তাদের নতুন প্রতিশ্রুতিতে রাখতে চান না, সেই প্রতিশ্রুতিটির জন্য git fixup-file myfile.txtএকটি তৈরি করবেন fixup!যেখানে myfile.txtসর্বশেষ পরিবর্তন হয়েছিল এবং তারপরে এটি হবে rebase --autosquash


খুব চালাক, আমি পছন্দ করি যে git rebaseস্বয়ংক্রিয়ভাবে বলা হয় নি।
হুরিখান 77

2

commit --fixupএবং rebase --autosquashদুর্দান্ত, কিন্তু তারা যথেষ্ট করে না। আমার যখন কমিট করার ক্রম হয় A-B-Cএবং আমি আমার কার্যক্ষম গাছটিতে আরও কিছু পরিবর্তন লিখি যা বিদ্যমান কমিটগুলির মধ্যে এক বা একাধিকের অন্তর্ভুক্ত থাকে, তখন আমাকে ম্যানুয়ালি ইতিহাসের দিকে নজর দিতে হবে, কোনটি পরিবর্তন হয় সেগুলির মধ্যে সিদ্ধান্ত নিতে হবে, তাদের মঞ্চস্থ করতে হবে এবং তৈরি করতে হবে fixup!হলেও ক্ষতি নেই। তবে গিটটিতে ইতিমধ্যে আমার জন্য সমস্ত কিছু করতে সক্ষম হতে পর্যাপ্ত তথ্যের অ্যাক্সেস রয়েছে, তাই আমি একটি পার্ল স্ক্রিপ্ট লিখেছি যা কেবল এটিই করে।

git diffস্ক্রিপ্টের প্রতিটি কুঁচকির git blameজন্য প্রাসঙ্গিক রেখাগুলি শেষের দিকে স্পর্শ করেছে এবং git commit --fixupউপযুক্ত fixup!কমিটগুলি লেখার জন্য কলগুলি সন্ধান করতে ব্যবহার করে, মূলত আমি নিজে আগে যে কাজটি করছিলাম সেটাই করছিল।

যদি আপনি এটি দরকারী মনে করেন তবে দয়া করে এটির উন্নতি করতে এবং পুনরাবৃত্তি করতে দ্বিধা বোধ করুন এবং সম্ভবত একদিন আমরা সঠিকভাবে এই জাতীয় বৈশিষ্ট্যটি পেয়ে যাব git। আমি এমন একটি সরঞ্জাম দেখতে চাই যা বুঝতে পারে যে কোনও ইন্টারেক্টিভ রিবেস চালু করার সাথে সাথে মার্জ সংঘাত কীভাবে সমাধান করা উচিত।


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

1

আমি একটি সামান্য শেল ফাংশন লিখেছি gcfযা ফিক্সআপ কমিট সম্পাদন করতে এবং স্বয়ংক্রিয়ভাবে রিবেস করতে:

$ git add -p

  ... select hunks for the patch with y/n ...

$ gcf <earlier_commit_id>

  That commits the fixup and does the rebase.  Done!  You can get back to coding.

উদাহরণস্বরূপ, আপনি সর্বশেষটির সাথে দ্বিতীয় প্রতিশ্রুতিটি প্যাচ করতে পারেন: gcf HEAD~~

এখানে ফাংশন । আপনি এটি আপনার পেস্ট করতে পারেন~/.bashrc

git_commit_immediate_fixup() {
  local commit_to_amend="$1"
  if [ -z "$commit_to_amend" ]; then
    echo "You must provide a commit to fixup!"; return 1
  fi

  # Get a static commit ref in case the commit is something relative like HEAD~
  commit_to_amend="$(git rev-parse "${commit_to_amend}")" || return 2

  #echo ">> Committing"
  git commit --no-verify --fixup "${commit_to_amend}" || return 3

  #echo ">> Performing rebase"
  EDITOR=true git rebase --interactive --autosquash --autostash \
                --rebase-merges --no-fork-point "${commit_to_amend}~"
}

alias gcf='git_commit_immediate_fixup'

এটি --autostashস্ট্যাশ করে এবং প্রয়োজনে যে কোনও অনিচ্ছাকৃত পরিবর্তনগুলি পপ করতে ব্যবহার করে।

--autosquashএকটি --interactiveরিবেস প্রয়োজন , কিন্তু আমরা একটি ডামি ব্যবহার করে মিথস্ক্রিয়া এড়াতে চাই EDITOR

--no-fork-pointবিরল পরিস্থিতিতে নিঃশব্দে বাদ দেওয়া থেকে প্রতিশ্রুতি রক্ষা করে (যখন আপনি একটি নতুন শাখা চালু করেছেন, এবং ইতিমধ্যে কেউ অতীতের প্রতিশ্রুতিগুলিকে প্রত্যাখ্যান করেছেন)।


0

আমি একটি স্বয়ংক্রিয় উপায় সম্পর্কে অবগত নই, তবে এখানে একটি সমাধান যা সহজেই মানব-বোটাইজ হতে পারে:

git stash
# write the patch
git add -p <file>
git commit -m"whatever"   # message doesn't matter, will be replaced via 'fixup'
git rebase -i <bad-commit-id>~1
# now cut&paste the "whatever" line from the bottom to the second line
# (i.e. below <bad-commit>) and change its 'pick' into 'fixup'
# -> the fix commit will be merged into the <bad-commit> without changing the
# commit message
git stash pop

কোনও স্ক্রিপ্টের জন্য আমার প্রতিক্রিয়া দেখুন যা কোনও git fixupকমান্ড বাস্তবায়নের জন্য এর সদ্ব্যবহার করে ।
ফ্রেরিচ রাবাবে

@ ফ্রেরিচ রাবাবে: ভাল লাগছে, আমি জানিনা--autosquash
টোবিয়াস কেইনজলার

0

আমি https://github.com/tummychow/git-absorb সুপারিশ করব :

লিফট পিচ

কয়েকটি কমিটের সাথে আপনার একটি বৈশিষ্ট্য শাখা রয়েছে। আপনার সতীর্থ শাখাটি পর্যালোচনা করেছেন এবং কয়েকটি বাগ নির্দেশ করেছেন। আপনার বাগগুলির জন্য ফিক্স রয়েছে, তবে আপনি এগুলি সবগুলি সংশোধনকারী একটি অস্বচ্ছ প্রতিশ্রুতিতে স্থান দিতে চান না, কারণ আপনি পারমাণবিক চুক্তিতে বিশ্বাসী believe git commit --fixupম্যানুয়াল ইন্টারেক্টিভ রিবেসটির জন্য ম্যানুয়ালি কমিট এসএএএচগুলি অনুসন্ধান করার বা চালানোর পরিবর্তে এটি করুন:

  • git add $FILES_YOU_FIXED

  • git absorb --and-rebase

  • বা: git rebase -i --autosquash master

git absorbকোন কমিটগুলি সংশোধন করা নিরাপদ এবং কোনটি সূচকযুক্ত পরিবর্তনগুলি প্রতিটি কমিটের অন্তর্ভুক্ত তা স্বয়ংক্রিয়ভাবে সনাক্ত করবে। এটি তখন ফিক্সআপ লিখবে! এই প্রতিটি পরিবর্তনের জন্য প্রতিশ্রুতিবদ্ধ। আপনি যদি এটির উপর নির্ভর না করেন তবে আপনি তার আউটপুটটি ম্যানুয়ালি পরীক্ষা করতে পারেন, এবং তারপরে গিটের অন্তর্নির্মিত অটোস্কোয়া কার্যকারিতা সহ আপনার বৈশিষ্ট্য শাখায় ফিক্সআপগুলি ভাঁজ করতে পারেন।

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