একটি কনফিগার ফাইলের নির্দিষ্ট উদাহরণে আমি রনের উত্তরের সাথে একমত হব :
একটি কনফিগারেশন আপনার কর্মক্ষেত্রের "ব্যক্তিগত" হওয়া উচিত (সুতরাং "একটি .gitignore
ফাইলের মধ্যে ঘোষিত" হিসাবে "উপেক্ষা করা ")।
এতে টোকেনাইজড মান সহ আপনার একটি কনফিগার ফাইল টেমপ্লেট থাকতে পারে এবং সেই ফাইলটিকে ব্যক্তিগত (এবং উপেক্ষা করা) কনফিগার ফাইলে রূপান্তরকারী একটি স্ক্রিপ্ট থাকতে পারে ।config.template
তবে, এই নির্দিষ্ট মন্তব্যটি আরও বেশি বিস্তৃত সাধারণ প্রশ্নের উত্তর দেয় না, যেমন আপনার প্রশ্ন (!):
আমি গিটকে কীভাবে বলি যে কোনও নির্দিষ্ট ফাইলে সংঘাতের সংশ্লেষের জন্য সর্বদা আমার স্থানীয় সংস্করণটি নির্বাচন করতে পারি? (যে কোনও ফাইল বা ফাইলের গ্রুপের জন্য)
এই জাতীয় মার্জটি একটি "অনুলিপি সংযুক্তি", যাতে আপনি যখনই কোনও বিরোধ হয় তখন সর্বদা একটি ফাইলের 'আমাদের' বা 'তাদের' সংস্করণটি অনুলিপি করবেন।
(যেমন ব্রায়ান Vandenberg নোট মন্তব্য , ' ours
' এবং ' theirs
' এখানে একটি একত্রীকরণ জন্য ব্যবহার করা হয় ।
তারা হয় বিপরীত একটি জন্য রি-বেসের ফলে : দেখুন " Why is the meaning of “ours” and “theirs” reversed with git-svn
", যা একটি রি-বেসের ফলে ব্যবহার করে, " git rebase
, সম্পর্কে অবগত থাকার 'স্থানীয়' এবং 'রিমোট' ' )
"একটি ফাইল" (সাধারণভাবে একটি ফাইল, "কনফিগারেশন" ফাইলের কথা বলছেন না, কারণ এটি একটি খারাপ উদাহরণ), আপনি এটি মার্জগুলির মাধ্যমে ডাকা একটি কাস্টম স্ক্রিপ্টের মাধ্যমে অর্জন করতে পারবেন would
গিট সেই স্ক্রিপ্টটিকে কল করবে কারণ আপনার কাছে গিটট্রিবিটস মান নির্ধারণ করা হবে যা একটি কাস্টম মার্জ ড্রাইভারকে সংজ্ঞায়িত করে ।
"কাস্টম মার্জ ড্রাইভার" এই ক্ষেত্রে, একটি খুব সাধারণ স্ক্রিপ্ট যা মূলত বর্তমান সংস্করণটি অপরিবর্তিত রাখবে, তাই আপনাকে সর্বদা আপনার স্থানীয় সংস্করণ নির্বাচন করতে দেয়।
আইই।, সিরো সান্টিলি দ্বারা উল্লিখিত :
echo 'path/to/file merge=ours' >> .gitattributes
git config --global merge.ours.driver true
আসুন পরীক্ষা করে দেখি যে একটি সাধারণ দৃশ্যে, উইন্ডোজে একটি এমএসসিগিট 1.6.3 সহ, কেবলমাত্র ডস সেশনে:
cd f:\prog\git\test
mkdir copyMerge\dirWithConflicts
mkdir copyMerge\dirWithCopyMerge
cd copyMerge
git init
Initialized empty Git repository in F:/prog/git/test/copyMerge/.git/
এখন, দুটি ফাইল তৈরি করুন, যার উভয়টির মধ্যে দ্বন্দ্ব থাকবে, তবে কোনটি আলাদাভাবে মার্জ হবে।
echo a > dirWithConflicts\a.txt
echo b > dirWithCopyMerge\b.txt
git add -A
git commit -m "first commit with 2 directories and 2 files"
[master (root-commit) 0adaf8e] first commit with 2 directories and 2 files
আমরা এই দুটি ফাইলের সামগ্রীতে দুটি ভিন্ন গিট শাখায় "বিরোধ" প্রবর্তন করব:
git checkout -b myBranch
Switched to a new branch 'myBranch'
echo myLineForA >> dirWithConflicts\a.txt
echo myLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in myBranch"
[myBranch 97eac61] add modification in myBranch
git checkout master
Switched to branch 'master'
git checkout -b hisBranch
Switched to a new branch 'hisBranch'
echo hisLineForA >> dirWithConflicts\a.txt
echo hisLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in hisBranch"
[hisBranch 658c31c] add modification in hisBranch
এখন, এর সাথে "মাই ব্রাঞ্চ" এর সাথে "তাঁর ব্রাঞ্চ" মার্জ করার চেষ্টা করা যাক:
- বিরোধী মার্জগুলির জন্য ম্যানুয়াল রেজোলিউশন
- ছাড়া জন্য
dirWithCopyMerge\b.txt
যেখানে আমি সব সময় রাখতে চান আমার সংস্করণ b.txt
।
যেহেতু মার্জটি ' MyBranch
' এ দেখা যায় , তাই আমরা এটিতে আবার ফিরে যাব, এবং ' gitattributes
' 'নির্দেশাবলী যুক্ত করব যা মার্জ আচরণটি কাস্টমাইজ করবে।
git checkout myBranch
Switched to branch 'myBranch'
echo b.txt merge=keepMine > dirWithCopyMerge\.gitattributes
git config merge.keepMine.name "always keep mine during merge"
git config merge.keepMine.driver "keepMine.sh %O %A %B"
git add -A
git commit -m "prepare myBranch with .gitattributes merge strategy"
[myBranch ec202aa] prepare myBranch with .gitattributes merge strategy
আমাদের ডিরেক্টরিতে .gitattributes
সংজ্ঞায়িত একটি ফাইল রয়েছে dirWithCopyMerge
(কেবলমাত্র সেই শাখায় সংজ্ঞায়িত হবে যেখানে মার্জটি ঘটবে myBranch
:), এবং আমাদের একটি .git\config
ফাইল রয়েছে যা এখন মার্জ ড্রাইভার রয়েছে।
[merge "keepMine"]
name = always keep mine during merge
driver = keepMine.sh %O %A %B
আপনি যদি এখনও KeepMine.sh সংজ্ঞায়িত না করে এবং যাহাই হউক না কেন মার্জটি চালু করেন, আপনি যা পান তা এখানে।
git merge hisBranch
sh: keepMine.sh: command not found
fatal: Failed to execute internal merge
git st
# On branch myBranch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: dirWithConflicts/a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
type dirWithConflicts\a.txt
a
<<<<<<< HEAD:dirWithConflicts/a.txt
myLineForA
=======
hisLineForA
>>>>>>> hisBranch:dirWithConflicts/a.txt
ওটা দারুন:
a.txt
একীভূত হতে প্রস্তুত এবং এতে বিরোধ রয়েছে
b.txt
এখনও বিচ্ছিন্ন, যেহেতু মার্জ ড্রাইভারটি এটির যত্ন নেবে ( .gitattributes
তার ডিরেক্টরিতে ফাইলটিতে নির্দেশের কারণে) to
keepMine.sh
আপনার %PATH%
(অথবা $PATH
আমাদের ইউনিক্স বন্ধুর জন্য যে কোনও জায়গায় সংজ্ঞা দিন) আমি অবশ্যই উভয়টিই করি: ভার্চুয়ালবক্স সেশনে আমার উবুন্টু সেশন রয়েছে
যেমন lrkwz দ্বারা মন্তব্য করা হয়েছে , এবং গিট - গিট বৈশিষ্ট্যগুলি অনুকূলিতকরণের " মার্জ কৌশল " বিভাগে বর্ণনা করা হয়েছে , আপনি শেল স্ক্রিপ্টটি শেল কমান্ডের সাথে প্রতিস্থাপন করতে পারেন ।true
git config merge.keepMine.driver true
তবে সাধারণ ক্ষেত্রে, আপনি একটি স্ক্রিপ্ট ফাইল সংজ্ঞায়িত করতে পারেন:
keepMine.sh
# I want to keep MY version when there is a conflict
# Nothing to do: %A (the second parameter) already contains my version
# Just indicate the merge has been successfully "resolved" with the exit status
exit 0
(যে এক সহজ একত্রীকরণ চালক ছিল;) (যে ক্ষেত্রে, ব্যবহারে এমনকি সহজ true
)
(আপনি অন্য সংস্করণ চালিয়ে যেতে, শুধুমাত্র সামনে যোগ চেয়েছিলেন exit 0
লাইন:
cp -f $3 $2
।
ব্যাস আপনি একত্রীকরণ চালক aways সংস্করণ অপরের থেকে আসছে রাখা হবে। শাখা, যে কোনও স্থানীয় পরিবর্তনকে উপেক্ষা করে)
এখন, শুরু থেকে মার্জটি আবার চেষ্টা করুন:
git reset --hard
HEAD is now at ec202aa prepare myBranch with .gitattributes merge strategy
git merge hisBranch
Auto-merging dirWithConflicts/a.txt
CONFLICT (content): Merge conflict in dirWithConflicts/a.txt
Auto-merging dirWithCopyMerge/b.txt
Automatic merge failed; fix conflicts and then commit the result.
মার্জ ব্যর্থ হয় ... কেবলমাত্র a.txt এর জন্য ।
A.txt সম্পাদনা করুন এবং 'hisBunch' থেকে লাইনটি ছেড়ে দিন, তারপরে:
git add -A
git commit -m "resolve a.txt by accepting hisBranch version"
[myBranch 77bc81f] resolve a.txt by accepting hisBranch version
আসুন পরীক্ষা করুন যে এই মার্জ চলাকালীন b.txt সংরক্ষণ করা হয়েছে
type dirWithCopyMerge\b.txt
b
myLineForB
শেষ প্রতিশ্রুতি সম্পূর্ণ মার্জ প্রতিনিধিত্ব করে :
git show -v 77bc81f5e
commit 77bc81f5ed585f90fc1ca5e2e1ddef24a6913a1d
Merge: ec202aa 658c31c
git merge hisBranch
Already up-to-date.
(মার্জ দিয়ে শুরু হওয়া লাইনটি এটি প্রমাণ করে)
গিট যেমন করবে তেমন আপনি মার্জ ড্রাইভারকে সংজ্ঞায়িত করতে, একত্রিত করতে এবং / অথবা ওভাররাইট করতে পারেন তা বিবেচনা করুন:
- পরীক্ষা করুন
<dir>/.gitattributes
(যা প্রশ্নের দিকের একই ডিরেক্টরিতে রয়েছে): .gitattributes
ডিরেক্টরিতে অন্যটির উপর বিজয়ী হবে
- তারপরে এটি পরীক্ষা করে
.gitattributes
(যা মূল ডিরেক্টরিতে রয়েছে), ইতিমধ্যে সেট না থাকলে কেবল নির্দেশিকা সেট করবে
- অবশেষে এটি পরীক্ষা করে
$GIT_DIR/info/attributes
। এই ফাইলটি ইন-ট্রি সেটিংগুলিকে ওভাররাইড করতে ব্যবহৃত হয়। এটি <dir>/.gitattributes
নির্দেশকে ওভাররাইট করবে ।
"সম্মিলন" দ্বারা, আমি "একত্রিত" একাধিক মার্জ ড্রাইভার।
নিক গ্রিন মন্তব্যগুলিতে প্রকৃতপক্ষে মার্জ চালকদের একত্রিত করার চেষ্টা করেছেন : " পাইথন গিট ড্রাইভারের মাধ্যমে পোমগুলি মার্জ করুন " দেখুন।
তবে, তাঁর অন্যান্য প্রশ্নে যেমন উল্লেখ করা হয়েছে , এটি কেবল দ্বন্দ্বের ক্ষেত্রে কাজ করে (উভয় শাখায় একযোগে পরিবর্তন)।