গিট ফাইলের কোন সংস্করণ শেষ অবধি ব্যবহৃত হবে: লোকাল, বেস বা রিমোট?


174

সময় একটি collison আছে যখন git merge, আমি একটি mergetool নামক খুলতে মেশানো । এটি স্থানীয়, বেস এবং রিমোট তিনটি ফাইল খোলে। যেহেতু আমি পড়েছি লোকাল আমার স্থানীয় শাখা, বেস সাধারণ পিতৃপুরুষ এবং রিমোট শাখাকে একীভূত করতে হবে।

এখন আমার প্রশ্ন: ফাইলটির কোন সংস্করণটি শেষ পর্যন্ত ব্যবহৃত হবে? এটি কি রিমোট? যদি তাই হয়, তবে আমি উদাহরণস্বরূপ বেস শাখায় যা আছে তা নির্বিশেষে আমি কী এটিকে সম্পাদনা করতে পারি?

উত্তর:


142

এটা তোলে মাঝখানে এক: BASE

আসলে, BASEসাধারণ পূর্বপুরুষ নয়, তবে অর্ধ-সমাপ্ত মার্জ যেখানে বিবাদগুলি চিহ্নিত করা হয় >>>>এবং <<<<

আপনি ফাইলের নামগুলি মেল্ড সম্পাদনা উইন্ডোর শীর্ষে দেখতে পারেন।

স্ক্রিনশটটি এখানে দেখুন

মেল্ড বেস

আপনি BASEমেল্ড কমান্ড ব্যবহার না করে বা আপনার ইচ্ছা মতো ফাইল সম্পাদনা করতে পারেন।
আপনি মেল্ড থেকে মুক্তি পেতে পারেন এবং কেবল আপনার প্রিয় পাঠ্য সম্পাদক দিয়ে ফাইল সম্পাদনা করতে পারেন।

  • মার্জারগুলির মধ্যে <<<< HEADএবং =====চিহ্নিতকারীগুলির মধ্যে কোডটি হ'ল মার্জ হওয়ার আগে আপনার স্থানীয় ফাইলগুলির মধ্যে একটি।
  • এর মধ্যে ====এবং কোডটি >>>> <branch name>দূরবর্তী ফাইলগুলির মধ্যে একটি।

3
কিছু লোক একটি ফাইলের বিরোধী খণ্ডগুলি সম্পর্কে আরও ভালভাবে বুঝতে পারে যা ডিফল্টের পরিবর্তে merge.conflictstyleকনফিগারেশন বিকল্প সেট থাকলে তাদের স্বয়ংক্রিয়ভাবে মার্জ করা ব্যর্থ হয়েছিল । diff3merge
কোস্টিক্স

3
আমি আসলে হেড, <<< এবং === গাইতে দেখি না। ক্ষেত্রে আপনি সরবরাহ করেছেন মাঝের উইন্ডোটি খালি থাকবে be তবে এটি অন্যের জন্য কেবল একটি নোট, আপনার উত্তরের জন্য ধন্যবাদ।
tsusanka

আপনি না দেখতে পেলে HEAD, <<<<<এবং =====চিহ্ন, এটা মানে সব সময়ে কোন দ্বন্দ্ব নেই। এই ক্ষেত্রে, মাঝের উইন্ডোটি খালি হবে না, এটি মার্জ ফলাফলটি দেখায়, তবে কোনও "লাল" অংশ থাকবে না
ফ্যাবিয়েন কোয়াটারভাক্স

10
আমি যখন মেশানো সঙ্গে মার্জ করছি, আমি কোনো দেখতে পাচ্ছ না <<<<<<, ======কিংবা >>>>>>মধ্যম ফলকে চিহ্নিতকারী (বেস সংস্করণ অর্থাত্) হয়; এবং কখনও কখনও, মাঝের ফলকটি খালি হয়ে যাবে, যেমন এজিআর রিপোর্ট করেছে। হয়তো এই পার্থক্যটি বিভিন্ন সেটিংসের কারণে। আমি যখন মেশানো টুল শুরু, নিম্নলিখিত ফাইল, বিদ্যমান থাকবে অভিমানী যে সংগ্রহস্থলের মধ্যে ফাইলের নাম X.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#, যেখানে #কিছু সংখ্যা। একীকরণের ফলাফলটি BASE সংস্করণকে বিভ্রান্ত করছে; মার্জড ভাল হবে।
তিমু লইস্তি

3
BASE আসলে সাধারণ পূর্বপুরুষ, এতে আংশিক একত্রীকরণের তথ্যের সাথে ফাইলটির নাম মার্জড। দয়া করে আমার প্রশ্নোত্তর দেখুন এবং মেল্টটিকে আপনার গিট ডিফ্টল এবং মার্জেটুল হিসাবে সেট আপ এবং ব্যবহার করুন যা এটি ঠিক কীভাবে কাজ করে তা ব্যাখ্যা করে। আছে HTH।
ম্যাটসেট

107

মাঠের একটি লুকানো 3-উপায় সংযুক্তি বৈশিষ্ট্য রয়েছে 4 র্থ প্যারামিটারে পাস করে:

meld $LOCAL $BASE $REMOTE $MERGED

ডান এবং বাম প্যানগুলি কেবল পঠনযোগ্য মোডে খোলা হয়েছে, সুতরাং আপনি দুর্ঘটনাক্রমে ভুল উপায়ে চারদিকে মার্জ করতে পারবেন না। মাঝের ফলকটি মার্জটির ফলাফল দেখায়। দ্বন্দ্বগুলির জন্য এটি বেস সংস্করণটি দেখায় যাতে আপনি সমস্ত গুরুত্বপূর্ণ বিট দেখতে পাবেন: মাঝখানে মূল পাঠ্য এবং উভয় পক্ষের বিরোধী পরিবর্তন mod অবশেষে, আপনি "সংরক্ষণ করুন" বোতামটি টিপলে, $ মার্জড ফাইলটি লেখা হয় - গিটের দ্বারা প্রত্যাশিত হিসাবে।

আমি যে ~ / .gitconfig ফাইলটি ব্যবহার করি তাতে নিম্নলিখিত সেটিংস থাকে:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

এটি 3 টি ট্যাব সহ মেল্ড খোলে, 1 ম এবং 2 য় ট্যাবটিতে সরল ডিফগুলি রয়েছে যা আমি মার্জ করার চেষ্টা করছি এবং 3 য় ট্যাব, ডিফল্টরূপে খোলা, 3-উপায় সংযুক্তির দৃশ্য দেখায়।

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

সম্পাদনা: মাইল্ডের নতুন সংস্করণগুলিতে সিনাক্স কিছুটা পরিবর্তন হয়েছে। এটি মন্তব্যে ছিল, তবে এটি উত্তরের অন্তর্ভুক্ত।

মেল্ড কমান্ড এখন --output বিকল্প ব্যবহার করে, সুতরাং উপরের স্নিপেট থেকে শেষ লাইনটি হ'ল:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@ জেসি, @ লম্ব্রিক, এটি প্রদর্শিত হয় যে নতুন নতুন সংস্করণগুলি --output$ মার্জড ফলাফলের জন্য পতাকা ব্যবহার করে। আমার গিট সংস্করণটি নিয়ে আসা মেলড
জোহান

1
@ লাম্ব্রিক আমি বিশ্বাস করি যে এটি মাঠের 1.7.x + এর সাথে রয়েছে --output option। লঞ্চ স্ক্রিপ্টে এই লাইনটি দেখুন:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
জোহান

12
সর্বশেষতম মেল্ডে (সংস্করণ> 1.8.4), আমাদের --auto- মার্জ বিকল্পটি ব্যবহার করতে হবে। সেমিডি = মেল্ড
ডিফ

7
আমার কাছে একই সমস্যা ছিল পেপিংবস মেল্ড ১.৮.৪ ব্যবহার করে: মেল্ড তৃতীয় ট্যাবটি না খোলার পরিবর্তে পৃথক ফলকে জিনিসগুলি খুলছিল। কমান্ড পরিশেষে কাজ জরিমানা: cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED। সুতরাং, এটি 3 টি ট্যাব খোলে (ভাল পুরাতন উপায়), অটো বিবাদ বিরোধী মার্জগুলিকে মাঝখানে মিশে দেয়, যেখানে মাঝখানেটি ER মার্জড, এবং এটি বিরোধ নিষ্পত্তি আউটপুট হিসাবে ব্যবহৃত হবে।
ফরহির

2
আউটপুট জন্য সিনট্যাক্স হতে পারে --output=<file>বা -o <file>দেখুনmeld --help
levsa

57

জড়িত রয়েছে 4 টি ফাইল:

  1. $LOCALযে শাখায় আপনি মার্জ করছেন সেখানে ফাইল; আপনাকে দেখানো হলে মার্জ প্রক্রিয়া দ্বারা অচ্ছুত

  2. $REMOTEযে শাখায় আপনি মার্জ করছেন সেখানকার ফাইলটি; আপনাকে দেখানো হলে মার্জ প্রক্রিয়া দ্বারা অচ্ছুত

  3. $BASE$ স্থানীয় এবং EM রিমোটের সাধারণ পূর্বপুরুষ, যেমন। যেখানে দুটি শাখা বিবেচিত ফাইলটি ডাইভার্ট করা শুরু করেছিল; আপনাকে দেখানো হলে মার্জ প্রক্রিয়া দ্বারা অচ্ছুত

  4. $MERGEDআংশিকভাবে সংহত ফাইল, সংঘাতের সাথে; এটি একমাত্র ফাইল যা মার্জ প্রক্রিয়াটি স্পর্শ করে এবং বাস্তবে কখনও আপনাকে দেখায় নাmeld


$MERGEDফাইলটিতে একটি যে রয়েছে <<<<<<, >>>>>>, =====(এবং হয়তো, ||||||) চিহ্নিতকারী (যে সীমানা দ্বন্দ্ব)। এই ফাইল যা আপনি সম্পাদনা করা হয় ম্যানুয়ালি সঠিক দ্বন্দ্ব।

ম্যানুয়াল দ্বন্দ্ব সম্পাদনা এবং ভিজ্যুয়াল বিবাদগুলি সম্পাদনা বিভিন্ন ফাইলে করা হয় এবং বিভিন্ন তথ্য উপস্থাপন করে।

Mergetool (অনুমান ব্যবহার করার সময় meld), ফাইল তাতে দেখতে পান আছেন: $LOCAL, $BASE, $REMOTE। মনে রাখবেন যে $MERGEDফাইলটি আপনি দেখতে পাচ্ছেন না , যদিও meldএটি সম্পাদনার ফলাফল লিখতে এটি একটি গোপন পরামিতি হিসাবে পাস করা হয়েছে ।

অন্য কথায়, ইন meld, আপনি মাঝখানে, ফাইলটি সম্পাদনা করছেন $BASEএবং আপনি বাম থেকে বা ডান দিক থেকে সমস্ত পরিবর্তন নিজেই বেছে নিচ্ছেন । এটি একটি পরিষ্কার ফাইল, মার্জ প্রক্রিয়া দ্বারা স্পর্শ করা হয়নি। শুধুমাত্র সামান্য ত্রুটি যে, যখন আপনি সেভ, আপনি মধ্যে সংরক্ষণ করবেন না $BASEফাইল, কিন্তু চতুর্থ লুকানো প্যারামিটারে meldহলো, $MERGEDফাইল (যে আপনি এমনকি দেখতে না)। $BASEফাইল নেই না কোন দ্বন্দ্ব বা আংশিক সফল মার্জ ধারণ কারণ তা না হয় $MERGEDফাইল

ভিজ্যুয়াল সম্পাদনায়, যখন $BASEফাইলটি আপনার কাছে উপস্থাপন করা হয় (ফাইলের পরিবর্তে $MERGED) gitমূলত মার্জ করার জন্য তার সমস্ত প্রচেষ্টা বাতিল করে দেয় (সেই প্রচেষ্টাগুলি দৃশ্যমান হয়, যদি আপনি চান, $ মার্জড ফাইলে) এবং আপনাকে মার্জিং সম্পূর্ণরূপে করতে দেয় গোড়া থেকে

তল লাইনটি হ'ল ম্যানুয়াল এবং ভিজ্যুয়াল মার্জিং বিরোধগুলিতে আপনি একই ফাইলগুলির দিকে তাকাচ্ছেন না, তবে চূড়ান্ত ফলাফলটি একই ফাইলটিতে লিখিত হয়েছে (সেটিই $MERGEDফাইল)।

দ্বন্দ্বের ম্যানুয়াল সংশোধন সম্পন্ন হবে $MERGEDকারণ git গড় কোন হয়েছে আপনি তিনটি ফাইল উপস্থাপন, তাই এটি তিনটি ফাইল (থেকে তথ্য squashes $LOCAL, $BASE, $REMOTEযে ভাষায়) $MERGEDফাইল।

কিন্তু চাক্ষুষ সরঞ্জাম উপায় আছে আপনি তিনটি ফাইল দেখানোর জন্য তারা আপনাকে দেখাতে $LOCAL, $BASE, $REMOTEফাইল। আপনি $LOCALএবং $REMOTEফাইলগুলি থেকে পরিবর্তনগুলি বেছে নিচ্ছেন এবং আপনি সেগুলি $BASEফাইলে আনছেন , পুরোপুরি পুনর্নির্মাণ এবং এমনকি $MERGEDফাইলটি মার্জ করার ব্যর্থ প্রচেষ্টা ওভাররাইট করে ।


আমি কেবল চেয়েছিলাম যে এমন কোনও সরঞ্জাম রয়েছে (যেমন তুলনার বাইরে) যা সমস্ত 4 ফাইল দেখায়
yoniLavi

@ ইউনিওয়ালোভিটস্কি: হ্যাঁ, বা পি 4 নিম
ব্যবহারকারী 1284631

আমি ক্লিয়ার কেস প্যাকেজ থেকে মার্জ সরঞ্জামটি ব্যবহার করতাম
mishmashru

@ ইয়নিলাভি - ভাল এই সরঞ্জামগুলি 4 টি ফলক দেখায় , তবে এই উত্তরে বর্ণিত সমস্ত চারটি ফাইল অগত্যা নয়। বিশেষ করে, আপনি আপনাকে দেখাতে এই 4-পেন টুলস সেট আপ করতে পারেন $LOCAL, $REMOTE, $BASEএবং আউটপুট প্রাথমিকভাবে করার সমান $BASE, কিন্তু যা থেকে ভিন্ন $MERGEDযে এটা ফাইল এবং দ্বন্দ্ব চিহ্নিতকারী এবং তাই মার্জ করতে Git এর প্রচেষ্টা নেই। প্রকৃতপক্ষে, এই সরঞ্জামগুলি ব্যবহার করার উপায়টি হ'ল লোকাল / রিমোট / বেস + আউটপুট-এর 3-ফলকের পদ্ধতির সাথে সাদৃশ্যপূর্ণ, যা মার্জ করা দেখায় না। 4 র্থ ফলকটি আপনাকে আউটপুট থেকে বেস পৃথক করতে দেয়।
BeeOnRope

16

কসমিনের সমাধান কাজ করে তবে $ বেস ফাইলটি আপডেট হয়েছে - মার্জড নয় । এটি $ মার্জড ফাইলটি আপডেট করবে :

মেশানো: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

আমি এটি নিশ্চিত করতে পারি a সাদ এর সমাধান উবুন্টুতে আমার জন্য কাজ করে। মূল প্রশ্নটি যতটা যায় এটি হ'ল বর্তমান সঠিক উত্তর।
মহাজাগতিক

3
আমার cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
মেল্ড

কেন --diff $BASE $LOCAL --diff $BASE $REMOTEআপনার শেষে প্রয়োজন হবে ? আমার জন্য ১.৮.৪-তে, এটি সূক্ষ্মভাবে কাজ করে (যতদূর আমি দেখতে পাচ্ছি):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
ফার্মার

1
@ ফারমার: এটি প্রয়োজনীয় নয়। এটি মোল্ডে আরও দুটি ট্যাব খোলে যাতে আপনি পৃথকভাবে বেসের তুলনায় স্থানীয় এবং রিমোট দেখতে পারেন।
স্যাম কাউফম্যান 20

1
এই তর্কগুলি দিয়ে আমি কী অর্ডার দিয়ে চেষ্টা করব তা বিবেচনা না করেই, ত্রি-মুখী ট্যাবটি সর্বদা তৃতীয় ট্যাব হয়, যখন প্রথম ট্যাব সর্বদা ডিফল্টরূপে নির্বাচিত হয়। ত্রি-মুখী ট্যাবটি ডিফল্টরূপে নির্বাচিত করার কোনও উপায় আছে?
স্যাম কাউফম্যান 20

13

সঙ্গে মেশানো 1.7 Bury সমাধান Tomek দ্বারা আর কাজ করে না।

ডিফল্ট সেটিংস আমাকে সন্তুষ্ট নি:

ডিফল্ট সেটিংস

মাঠের পরিবর্তে > = 1.7 আমি অন্য দুটি সমাধানের মধ্যে একটির পরামর্শ দিই।

প্রথম সমাধান :

 meld $LOCAL $BASE $REMOTE --auto-merge

প্রথম সমাধান

দ্বিতীয় সমাধান :

 meld $LOCAL $MERGED $REMOTE

দ্বিতীয় সমাধান

.gitconfig

.gitconfigউপরে বর্ণিত সমাধানগুলি পেতে আপনার ফাইলটিতে এটি অনুলিপি করুন এবং আটকান :

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

.gitconfig.localআপনি যদি একাধিক মেশিনে আপনার .gitconfig ব্যবহার করেন তবে কেবল এই মেশিনের জন্য meld17 বা meld16 সেট করতে কোনও ফাইলে এটি অনুলিপি করুন এবং আটকে দিন:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

এটি মাইল্ড 1.8.4 এ কাজ করে না। আপনি যদি চালনা করেন cmd = meld $LOCAL $BASE $REMOTE --auto-mergeতবে মাঝের ফলকটি $ বেস হবে, এবং $ মার্জ নয় যা আসলে সংঘাতের সমাধানের আউটপুট হিসাবে ব্যবহৃত হয় as
ফরহির

1
@ ফারমার আপনি দ্বিতীয় ট্যাগ হিসাবে $ বেসকে বেছে নিয়েছেন।
অ্যালেক্স 78191

11

আমি দেখেছি যে দেখানো ডিফল্ট ফাইলগুলির কোনওই সংরক্ষণ করা হচ্ছে না। মেশানো ছিল দেখাচ্ছে $LOCAL, $REMOTEএবং $BASEডিফল্ট ভাবে। এটি কাজ করতে, আমার $MERGEDপরিবর্তে মেল্ড শো করা দরকার $BASE~/.gitconfigএটি আমার জন্য স্থির করে দেওয়া:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

আমি আর্চ ব্যবহার করছি, এর সাথে:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

মাফ করবেন, এই কনফিগারেশনটি কি বৈষম্য সামঞ্জস্যপূর্ণ?
ম্যাডম্যাড 666 20

2

কোনও কারণে মেল্ডের সর্বশেষতম সংস্করণগুলি বিবাদগুলির জন্য যোগ করা মার্কার লাইনগুলি প্রদর্শন করে না (<<<<<<<<, =======, >>>>>>)। আপনি যদি এই লাইনগুলি দেখতে চান তবে আপনার উচিত meld v 1.3.3 বা পূর্ববর্তীটি ইনস্টল করা।


আমি @lumbric উত্তর দরকারী পাওয়া stackoverflow.com/a/22911793/641892
wnasich

2

সঠিক উত্তরের জন্য সাদ এর উত্তর দেখুন।

উবুন্টুতে 1.8.1 মেল্ডটি পেয়েছিলাম

- ডিফকে সরবরাহ করা ভুল সংখ্যক যুক্তি

এবং - আউটপুট যুক্ত করার আগে ER মার্জড এটি আমার জন্য স্থির করে:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.