গিট একীকরণের বিরোধ নিষ্পত্তি করতে আমি কীভাবে ভিমডিফ ব্যবহার করব?


159

আমি কেবল গিটে আমার মাস্টারের সাথে একটি শাখা একীভূত করেছি এবং আমি Automatic merge failed; fix conflicts and then commit the result.এখন দৌড়ে এসেছি git mergetoolএবং নীচের চিত্রটি দিয়ে ভিমডিফ খুললাম। আমি কীভাবে ভিমডিফ ব্যবহার করব জানি না। এখানকার প্রতিটি প্যানেলের অর্থ কী এবং আমি কীভাবে মার্জ সংঘাত ঠিক করতে এগিয়ে চলব?

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


3
এই পৃষ্ঠাটি দেখুন । যদি আপনি "সঠিক" বলতে চাইছেন তবে আপনার কোডের বর্তমান অবস্থা বাম দিকে রয়েছে।
রোমেনেল

@romainl আমি এটি পড়ার পরেও বিভ্রান্ত হয়ে পড়েছি, শর্টকাটগুলি কী এবং আমি কী ফাইলটি প্রধান শাখা হিসাবে ব্যবহার করতে পারি?
দুর্দান্ত গাই ইয়ো

2
@ ড্যানি http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/ একটি ভাল।
20'15

আরও দেখুন: এটি
স্কেলিয়াম

উত্তর:


142

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

আমি নিম্নলিখিত বিষয়টি ভুল হতে পারে। আমি মনে করি মার্জ সংঘাতের উত্স হ'ল উভয় ফাইলই বেসের থেকে ফাইলের একই অংশ পরিবর্তন করেছে; LOCAL উদ্ধৃতিগুলি ডাবল থেকে একক করে পরিবর্তিত করেছে এবং REMOTE একই পরিবর্তন করেছে তবে ব্যাকগ্রাউন্ড মানটি একটি রঙ থেকে URL এ পরিবর্তিত করেছে। (আমি মনে করি যে একত্রীকরণটি যথেষ্ট স্মার্ট নয় যে লক্ষ্য করে যে LOCAL এ সমস্ত পরিবর্তনগুলি রিমোটেও উপস্থিত রয়েছে; এটি কেবল এটি জানে যে রিমোটের যে জায়গাগুলি বেসল একই স্থানে বেসল থেকে পরিবর্তন করেছে)।

যাইহোক, নীচের বাফারে আপনি আসলে সম্পাদনা করতে পারবেন এমন ফাইল রয়েছে your আপনার কার্য ডিরেক্টরিতে বসে। আপনি নিজের পছন্দ মতো কোনও পরিবর্তন করতে পারেন; vimএটি আপনাকে দেখাচ্ছে যে এটি শীর্ষস্থানীয় প্রতিটি দর্শন থেকে কীভাবে আলাদা হয়, এটি এমন ক্ষেত্র যা স্বয়ংক্রিয়ভাবে মার্জ হ্যান্ডেল করতে পারেনি। আপনি যদি REMOTE পরিবর্তনগুলি না চান তবে LOCAL থেকে পরিবর্তনগুলি টানুন। আপনি যদি স্থানীয় পরিবর্তনগুলিতে সেগুলি পছন্দ করেন তবে REMOTE থেকে পরিবর্তনগুলি টানুন। আপনি যদি মনে করেন যে REMOTE এবং LOCAL উভয়ই ভুল B আপনার আরও ভাল ধারণা থাকলে সম্পূর্ণ আলাদা কিছু করুন! শেষ অবধি, আপনি এখানে পরিবর্তনগুলি হ'ল প্রকৃতপক্ষে প্রতিশ্রুতিবদ্ধ হবে।


4
দ্রুত প্রশ্ন আমি কীভাবে ভিমে সংরক্ষণ করব?
দুর্দান্ত গাই ইয়ো

6
:xঅথবা :w( :xখুব প্রস্থান করে) প্লাস 'রিটার্ন'।
জোনাথন লেফলার

4
অ্যান্ডারস: এমন অন্যান্য মার্জ সরঞ্জাম রয়েছে যা আপনি কীভাবে ব্যবহার করবেন তা জানা না থাকলে আপনি ব্যবহার করতে পারেন vim
চ্যাপনার

3
@ অ্যান্ডারকিটসন, যেহেতু আপনি ম্যাক ওএস এক্সে আছেন, ফাইলমর্জি নিখুঁত, নিখরচায় এবং এক্সকোডের সাথে আসে।
রোমেনেল

8
ডাউনটা কেন? যদি সত্যিকার অর্থে কিছু ভুল থাকে তবে দয়া করে এটিকে ঠিক করুন, বা কমপক্ষে এটি উল্লেখ করুন।
চিপনার

91

@ চিপনারের উত্তর দুর্দান্ত, আমি প্রশ্নের একাংশ "সংযুক্তি সংঘাত সংশোধন করার জন্য আমি কীভাবে এগিয়ে যেতে হবে" এ সম্পর্কে কিছু বিশদ যুক্ত করতে চাই। আপনি যদি এই ক্ষেত্রে সত্যিকার অর্থে ভিডমিফ ব্যবহার করবেন তবে এটি নীচে চলে যায়।


প্রথমে "সবকিছু বাতিল করে দিন" বিকল্পটি সম্বোধন করার জন্য - আপনি যদি "ভিমডিফ" ব্যবহার করতে না চান এবং মার্জটি বাতিল করতে চান: টিপুন Esc, তারপরে টাইপ করুন :qa!এবং হিট করুন Enter। (আরও দেখুন কীভাবে আমি ভিম সম্পাদক থেকে প্রস্থান করব? )। গিট আপনাকে জিজ্ঞাসা করবে যে মার্জটি সম্পূর্ণ হয়েছিল কিনা, এর সাথে উত্তর দিন n


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

  • নীচে বাফারে নেভিগেট করুন (ফলাফলটি মার্জ করুন): Ctrl-W j
  • j/ k; এর সাথে পরবর্তী ডিফাইভেটে নেভিগেট করুন বা, আরও ভাল, ব্যবহার করুন ] cএবং [ cযথাক্রমে পরবর্তী এবং পূর্ববর্তী ডিফ নেভিগেট করতে
  • z oযদি আপনি আরও প্রসঙ্গটি দেখতে চান তবে এটি খুলতে ভাঁজ করার সময় ব্যবহার করুন
  • @ চিপনারের উত্তর অনুসারে প্রতিটি ভিন্নতার জন্য, আপনি হয় স্থানীয়, দূরবর্তী বা বেস সংস্করণ থেকে কোড পেতে পারেন, বা এটি সম্পাদনা করতে পারেন এবং ফিট হিসাবে আপনি আবার দেখতে পারেন
    • স্থানীয় সংস্করণ থেকে এটি পেতে, ব্যবহার করুন :diffget LO
    • দূরবর্তী থেকে: :diffget RE
    • বেস থেকে: :diffget BA
    • অথবা, আপনি যদি নিজের কোড সম্পাদনা করতে চান তবে প্রথমে স্থানীয় / রিমোট / বেস থেকে একটি সংস্করণ পান এবং তারপরে সন্নিবেশ মোডে যান এবং বাকীটি সম্পাদনা করুন
  • একবার হয়ে গেলে, মার্জ ফলাফলটি সংরক্ষণ করুন এবং সমস্ত উইন্ডোটি প্রস্থান করুন :wqa
  • সাধারণত, গিট সনাক্ত করে যে মার্জটি তৈরি হয়েছিল এবং মার্জ কমিট তৈরি করে

অনুলিপি পাস্টিং বা কাস্টম শর্টকাট ছাড়াই স্থানীয় এবং দূরবর্তী উভয় বিরোধের শিকারকে যুক্ত করা সম্ভব বলে মনে হয় না: /vi/10534/is-there-a-way-to-take-both- অ্যাড অ্যাডের পর থেকে যখন-ভি-ভি-অ্যাস-মার্জ-টুলটি লজ্জাজনক তবে এটি একটি সাধারণ দ্বন্দ্বের ধরণ।

ভিমডিফকে প্রতিবার এটি শুরু হওয়ার সাথে সাথে টিপতে বলা থেকে বিরত রাখতে আপনার এটিকে যুক্ত করুন .vimrc:

set shortmess=Ot

যেমন উল্লেখ করা হয়েছে: /vi/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode

আপনি অন্যান্য ভিমডিফ শর্টকাটগুলির জন্য ইন্টারনেট অনুসন্ধান করতে পারেন। আমি এটির একটি দরকারী পেয়েছি: https://gist.github.com/yasmamoto/7783966


10
এটি x1000 বার upvote করা উচিত এবং একটি ভাল উত্তর হিসাবে গ্রহণ করা উচিত।
আন্দ্রে পোর্টনই

পরবর্তী বিরোধে দ্রুত যেতে, কেবল === অনুসন্ধান করুন। "/ ===" করুন এবং প্রবেশ করুন
এপিট জন ইসমাইল

যদি একাধিক ম্যাচ ব্যবহার করে পাওয়া যায় তবে এই পোস্টটি দেখুন ( স্ট্যাকওভারফ্লো / প্রশ্ন / 551520705/… ) :diffget
জেসন

7

ভিমডিফ প্রতিস্থাপনের চূড়ান্ত মার্জারুল

এটি জিভ-ইন-গাল ধরনের, তবে এটিই আমি ভিমডিফ চেষ্টা করার পরে ভিমার হিসাবে রূপান্তরিত হয়েছি ended

মার্জ সংঘাতের সমাধানের জন্য, আমার প্রায়শই যা প্রয়োজন তা হ'ল:

  • দূরবর্তী
  • স্থানীয়
  • দুটি ভিন্নতা:
    • বেস রিমোট পার্থক্য
    • বেস বেস

তারপর উভয় একসাথে রাখার চেষ্টা করুন।

যখন ভিমডিফ স্ক্রিনে বেস, স্থানীয় এবং রিমোট দেখায়:

    +--------------------------------+
    | LOCAL  |     BASE     | REMOTE |
    +--------------------------------+
    |             MERGED             |
    +--------------------------------+

আমি জানি না কীভাবে এটি দু'টি আলাদাভাবে আমার ডান বামে ডান বাম দিকে তাকিয়ে থাকা দরকার clearly

তদ্ব্যতীত, স্থানীয় এবং রিমোট ইতিমধ্যে গিট সংশ্লেষ সংঘাতের চিহ্নিতকারীগুলিতে দৃশ্যমান, সুতরাং আমি আবার কোনও সরঞ্জামের সাহায্যে এগুলি অর্জন করি না।

অতএব, আমি পরিবর্তে আমার নিজের ক্ষুদ্র "ডিফ্টল" তৈরি করেছি যা আসলে আমি যে অনুভূতিগুলি হারিয়েছিলাম তা প্রদর্শন করে:

~ / বিন / cirosantilli-mergetool

#!/usr/bin/env bash
BASE="$1"
LOCAL="$2"
REMOTE="$3"
diff --color -u "$BASE" "$LOCAL"
diff --color -u "$BASE" "$REMOTE"
exit 1

গিটহাব উজানের দিকে

এবং এটি দিয়ে এটি ইনস্টল করুন:

git config --global mergetool.cirosantilli-mergetool.cmd 'cirosantilli-mergetool $BASE $LOCAL $REMOTE'
git config --global mergetool.cirosantilli-mergetool.trustExitCode true
# If you want this to become your default mergetool.
#git config --global merge.tool 'cirosantilli-mergetool'

এখন, আপনি যখন করবেন:

git mergetool -t cirosantilli-mergetool

এটি টার্মিনালে যে দুটি ভিন্নতা চাই তা দেখায়, উদাহরণস্বরূপ কিছু বরাবর:

--- ./src/dev/arm/RealView_BASE_15560.py        2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_LOCAL_15560.py       2019-12-27 13:46:41.979021479 +0000
@@ -994,7 +994,7 @@                                                              

     def setupBootLoader(self, cur_sys, loc):
         if not cur_sys.boot_loader:                           
-            cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ]
+            cur_sys.boot_loader = [ loc('boot.arm64'), loc('boot.arm') ]
         cur_sys.atags_addr = 0x8000000                  
         cur_sys.load_offset = 0x80000000                    

@@ -1054,7 +1054,7 @@                                           
             ]                                                     

     def setupBootLoader(self, cur_sys, loc):
-        cur_sys.boot_loader = [ loc('boot_emm_v2.arm64') ]
+        cur_sys.boot_loader = [ loc('boot_v2.arm64') ]
         super(VExpress_GEM5_V2_Base,self).setupBootLoader(
                 cur_sys, loc)                             

--- ./src/dev/arm/RealView_BASE_15560.py        2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_REMOTE_15560.py      2019-12-27 13:46:41.991021366 +0000
@@ -610,10 +610,10 @@           
     def attachIO(self, *args, **kwargs):              
         self._attach_io(self._off_chip_devices(), *args, **kwargs)

-    def setupBootLoader(self, cur_sys, loc):
-        cur_sys.boot_loader = loc('boot.arm') 
-        cur_sys.atags_addr = 0x100                           
-        cur_sys.load_offset = 0       
+    def setupBootLoader(self, cur_sys, boot_loader, atags_addr, load_offset):
+        cur_sys.boot_loader = boot_loader      
+        cur_sys.atags_addr = atags_addr     
+        cur_sys.load_offset = load_offset

সুতরাং আপনি দেখতে পাচ্ছেন এখানে দুটি ডিফারেন্স টার্মিনালে ফেলে দেওয়া হয়েছে:

  • RealView_BASE_15560.py বনাম RealView_LOCAL_15560.py
  • RealView_BASE_15560.py বনাম RealView_REMOTE_15560.py

যদি ভিন্নতাগুলি বড় হয় তবে আমি কেবল আমার টিএমউক্স পরাশক্তিগুলির সাথে অনুসন্ধান করব ।

হ্যাঁ, আপনি কিছুটা শর্টকাট হারিয়ে ফেলেছেন যা ভিডমিফ সরবরাহ করে, তবে সাধারণ সমাধানের বিরোধের জন্য উভয় সংস্করণ থেকে যত্ন সহকারে অনুলিপি পেস্টের প্রয়োজন হয়, যা আমি গিট সংঘাতের চিহ্নিতকারীদের সাথে একটি সাধারণ ভিম সেশনের মধ্যে ভাল করতে পারি।

vimdiffচলমান অবস্থায় ফাইলগুলি পর্যবেক্ষণ করা এবং পৃথক করা

আমি বসার আগে এবং আমার নিখুঁত সেটআপটি স্বয়ংক্রিয় করার আগে, আমি cirosantilli-mergetoolআমার প্রয়োজন দুটি ভিন্নতা পেতে এটি করছিলাম।

যদিও git mergetoolচলমান vimdiff, যদি সেখানে নামে একটি ফাইল-এ একটি বিবাদে আছে, বলো, main.py, Git সংস্করণ নামকরণ প্রত্যেকের জন্য ফাইল উত্পন্ন:

main_BASE_1367.py
main_LOCAL_1367.py
main_REMOTE_1367.py

একই ডিরেক্টরিতে main.pyযেখানে 1367গিট মার্জেটুলের পিআইডি, এবং সেইজন্য একটি "এলোমেলো" পূর্ণসংখ্যার যেমন উল্লেখ করা হয়েছে: গিট একীভূত সংঘর্ষে, ব্যাকআপ, বেস, স্থানীয় এবং রিমোট ফাইলগুলি কী উত্পন্ন হয়?

সুতরাং, আমি যে পার্থক্যগুলি দেখতে চাই তা দেখতে, আমি প্রথমে উত্পন্ন ফাইলগুলি সন্ধান করি git statusএবং তারপরে নতুন টার্মিনালগুলি খুলি এবং আমার যে ফাইলগুলির যত্ন নেওয়া সেগুলির মধ্যে একটি ভিডমিফ করি:

vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py

এক্সাথে git mergetool এই তথ্যগুলি দ্রুত কী চলছে তা নির্ধারণ করতে প্রচুর সহায়তা করে!

এছাড়াও, মার্জারুল চলমান অবস্থায় আপনি কেবল ফাইলটি খুলতে পারেন:

vim main.py

সরাসরি এবং সেখানে সম্পাদনা করুন যদি আপনি মনে করেন যে এটি বৃহত্তর সম্পাদক উইন্ডো দিয়ে আরও সহজ হতে চলেছে।

সংঘাতগুলি মার্জ করার জন্য সরাসরি ঝাঁপুন

যদিও ]cvimdiff ভিতরে পরবর্তী পরিবর্তন বিন্দু থেকে জাম্প, সেখানে সবসময় মার্জ দ্বন্দ্ব নেই।

এটির সাহায্যে আমার এইটি রয়েছে ~/.vimrc:

# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>

যা সরাসরি দ্বন্দ্বগুলি আবিষ্কার করে।

গিট আইমেজ

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


1
সম্মত। আমি মনে করি আমি 9 বছর আগে স্ট্যাকওভারফ্লো . com/a/3052118/6309 এ উল্লেখ করেছি । (উত্তরের শেষ অংশটি দেখুন)
ভনসি

@ ভনসি হ্যাঁ, আমি মনে করি আপনি এটি জিতেছেন! এক্সডি
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.