আমি একটি প্রত্যন্ত শাখায় মার্জ করছি যাতে প্রচুর দ্বন্দ্ব হতে পারে। এটির দ্বন্দ্ব থাকবে কিনা তা আমি কীভাবে বলতে পারি?
আমি --dry-run
অন মত কিছু দেখতে পাচ্ছি না git-merge
।
আমি একটি প্রত্যন্ত শাখায় মার্জ করছি যাতে প্রচুর দ্বন্দ্ব হতে পারে। এটির দ্বন্দ্ব থাকবে কিনা তা আমি কীভাবে বলতে পারি?
আমি --dry-run
অন মত কিছু দেখতে পাচ্ছি না git-merge
।
উত্তর:
পূর্বে উল্লিখিত হিসাবে, --no-commit
পতাকাটিতে পাস করুন , তবে দ্রুত এগিয়ে যাওয়ার প্রতিশ্রুতি এড়াতে --no-ff
, এ জাতীয় পাসও করুন:
$ git merge --no-commit --no-ff $BRANCH
মঞ্চস্থ পরিবর্তনগুলি পরীক্ষা করতে:
$ git diff --cached
এবং আপনি মার্জটিকে পূর্বাবস্থায় ফিরিয়ে আনতে পারেন, তা যদি তা দ্রুত-ফরওয়ার্ড একীভূত হয়:
$ git merge --abort
git merge --only-if-there-wont-be-any-conflicts
বা git diff --show-conflicts <commit>
সত্যই কার্যকর be লজ্জা এটি এখনও সম্ভব নয়, বা আমি কিছু মিস করছি?
git pull --ff-only
!
আমাকে কেবল একটি পদ্ধতি প্রয়োগ করতে হয়েছিল যা কোনও সংগ্রহস্থল এবং এর প্রত্যন্তের মধ্যে স্বয়ংক্রিয়ভাবে দ্বন্দ্ব খুঁজে পায়। এই সমাধানটি মেমোরিতে একীভূত করে যাতে এটি সূচকে বা স্পর্শকারী গাছকে স্পর্শ করবে না। আমি মনে করি এটি এই নিরাপদতম উপায় আপনি এই সমস্যার সমাধান করতে পারেন। এখানে কিভাবে এটা কাজ করে:
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
( মার্জব্যাস হেক্সাডেসিমাল আইডি যা আগের ধাপে মুদ্রিত বেসটি মুদ্রিত হয়)এখন ধরা যাক আপনি আপনার স্থানীয় মাস্টারের সাথে রিমোট মাস্টারটি মার্জ করতে চান তবে আপনি যে কোনও শাখা ব্যবহার করতে পারেন। git merge-tree
মেমরিতে একীকরণ কার্যকর করবে এবং ফলাফলটিকে স্ট্যান্ডার্ড আউটপুটে মুদ্রণ করবে। প্যাটার্ন জন্য গ্রেপ <<
বা >>
। অথবা আপনি কোনও ফাইলের আউটপুট মুদ্রণ করতে পারেন এবং এটি পরীক্ষা করতে পারেন। যদি আপনি 'উভয় পরিবর্তিত' দিয়ে শুরু করে কোনও লাইন পান তবে সম্ভবত সম্ভবত কোনও দ্বন্দ্ব হবে।
git merge-tree `git merge-base FETCH_HEAD master` FETCH_HEAD master
git merge-tree `git merge-base clieop master` clieop master | grep -A3 "changed in both"
কেবল দুর্দান্ত! +100
+<<<<<<< .our
সুতরাং আমি গ্রেপ এক্সপ্রেশনটি ব্যবহার করিgrep -q '^+<* \.our$'
এটির জন্য আমার সাধারণ উদ্দীপনা সমাধানটি হ'ল:
একটি "প্রাক-মাস্টার" শাখা তৈরি করুন (অবশ্যই মাস্টার থেকে)
আপনি যা চান তা এই প্রাক-মাস্টারের মধ্যে মার্জ করুন।
তারপরে আপনি দেখতে পেলেন যে কীভাবে সংযোজনটি মাস্টারকে স্পর্শ না করেই ঘটেছে।
যাইহোক, আমি @ কমলা 80 এর পরামর্শ অনুসরণ করব।
git merge --abort
বিবাদ সৃষ্টি করতে পারেন, git reset --hard HEAD~1
যদি সেখানে মার্জ বা মেশানো থাকে তবে আপনি সর্বদা করতে পারেন git reset --hard origin/master
। অন্য একটি শাখা তৈরি করা আপনাকে সুরক্ষার একটি অনুভূতি দেয় তবে আপনি কীভাবে গিটটি কাজ করেন তা শিখলে এটি বুঝতে হবে এটি ভুলভ্রান্ত ভয়। যখন উদ্বেগটি ওয়ার্কিং কপিটি পরিবর্তন না করার বিষয়ে হয় তখন এটি কোনও সমাধান দেয় না।
git merge --no-commit
যদি দ্রুত অগ্রসর করা যায় তবে কোনও সংযুক্তি বাতিল করবেন না। git merge --abort
এটি একীভূত হয়ে গেলে কাজ করে না। আপনি যদি এটি কোনও স্ক্রিপ্ট হিসাবে লিখতে চান তবে এটি বিশ্রীgit merge
বিভিন্ন ধরণের দ্বন্দ্বগুলি ব্যাখ্যা করার জন্য যথেষ্ট যথেষ্ট ত্রুটি কোডের সাথে জবাব দেয় না। একটি নতুন শাখার সাথে কাজ করা কোনও ভাঙা স্ক্রিপ্টকে এমন একটি রাজ্যে আপনার রেপো ছেড়ে যাওয়া থেকে বাধা দেয় যাতে ম্যানুয়াল হস্তক্ষেপের প্রয়োজন হয়। অবশ্যই আপনি কিছু হারাতে পারবেন না। তবে অন্যথায় এটি নির্মাণ করা সহজ।
গিটের সাথে একীভূত হওয়াটিকে পূর্বাবস্থায় ফেলা খুব সহজ আপনার শুকনো রান সম্পর্কে চিন্তা করাও উচিত নয়:
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
সম্পাদনা করুন: নীচের মন্তব্যে যেমন উল্লেখ করা হয়েছে, আপনার যদি আপনার কার্যকারী ডিরেক্টরি বা মঞ্চের ক্ষেত্রের পরিবর্তন হয় তবে আপনি সম্ভবত উপরের কাজটি করার আগে সেগুলি স্ট্যাশ করতে চান (অন্যথায় তারা git reset
উপরের অনুসরণ করে অদৃশ্য হয়ে যাবে )
git branch --contains HEAD
সরাসরি বা আরও সরাসরি তালিকা পরীক্ষা করার বিষয় , কেবল ব্যবহার করুনgit merge --ff-only
--dry-run
"মার্জটি দ্রুত-এগিয়ে হবে কিনা তা কেবল খতিয়ে দেখেনি"। এটি একত্রীকরণের সঠিক আউটপুটটি ফিরিয়ে আনবে: ফাইল, দ্বন্দ্ব ইত্যাদি এফএফ হবে কিনা তা সত্যিই আকর্ষণীয় নয়, তাই না?
git stash; git reset --hard
? @ ব্রায়ানফিলিপস
আমি এটি করার জন্য একটি উপনাম তৈরি করেছি এবং মনোমুগ্ধকর মতো কাজ করি, আমি এটি করি:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
এখন আমি শুধু কল
git mergetest <branchname>
কোনও দ্বন্দ্ব আছে কিনা তা খুঁজে বের করতে।
রিমোট শাখার তুলনায় আপনার বর্তমান শাখার থেকে কেবল আলাদা করুন, এটি আপনাকে বলবে যে আপনি যখন টান / সংহত করবেন তখন কী পরিবর্তন হতে চলেছে।
#see diff between current master and remote branch
git diff master origin/master
আমি এটি করার জন্য অনুরোধ-টান গিট কমান্ডটি ব্যবহার করি। এটি আপনাকে মার্জ করার সময় ঘটে যাওয়া প্রতিটি পরিবর্তন দেখার অনুমতি দেয় তবে আপনার স্থানীয় বা দূরবর্তী সংগ্রহস্থলগুলিতে কিছুই না করে ।
উদাহরণস্বরূপ, কল্পনা করুন আপনি "মাস্টার-এক্স" নামের একটি শাখাটিকে আপনার মাস্টার শাখায় মার্জ করতে চান
git request-pull master origin feature-x
কী ঘটবে তার সংক্ষিপ্তসার (কিছু না করে) দেখাবে:
The following changes since commit fc01dde318:
Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
Adding some layout
Refactoring
ioserver.js | 8 +++---
package.json | 7 +++++-
server.js | 4 +--
layout/ldkdsd.js | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js
আপনি যদি -p
প্যারামিটারটি যুক্ত করেন , আপনি পুরো প্যাচ পাঠ্যও পাবেন, ঠিক যেমন আপনি প্রতিটি পরিবর্তিত ফাইলটিতে গিট ডিফ করছেন।
master
এবং কী যুক্ত করে আপনি এটিকে কিছুটা পরিষ্কার করতে পারেন origin
, এবং আমি যদি স্থানীয় হিসাবে উদাহরণস্বরূপ থাকি branch1
এবং request-pull
স্থানীয় বৈশিষ্ট্য শাখায় একটি করতে চাই তবে কী হবে branch2
? আমার কি এখনও দরকার origin
? অবশ্যই, একটি সর্বদা ডকুমেন্টেশন পড়তে পারেন।
আমি অবাক হয়েছি এখনও কেউ প্যাচগুলি ব্যবহার করার পরামর্শ দেয়নি।
আপনার কাছ থেকে একটি একত্রীকরণ পরীক্ষা করতে চাই বলুন your_branch
মধ্যে master
(আমি তোমাকে অভিমানী করছি master
চেক আউট):
$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch
কৌতুক করা উচিত।
আপনি যদি ত্রুটি পেতে
error: patch failed: test.txt:1
error: test.txt: patch does not apply
এর অর্থ এই যে প্যাচটি সফল হয়নি এবং একীভূত হওয়ার ফলে বিরোধ সৃষ্টি হবে। কোনও আউটপুট মানে প্যাচ পরিষ্কার নেই এবং আপনি সহজেই শাখাটি মার্জ করতে সক্ষম হবেন
নোট করুন যে এটি আসলে আপনার কার্যকরী গাছকে পরিবর্তন করবে না (অবশ্যই প্যাচ ফাইল তৈরি করা বাদ দিয়ে আপনি পরে নিরাপদে মুছতে পারেন)। গিট-প্রয়োগ নথি থেকে:
--check
Instead of applying the patch, see if the patch is applicable to the
current working tree and/or the index file and detects errors. Turns
off "apply".
আমার চেয়ে গিটের সাথে আরও স্মার্ট / আরও অভিজ্ঞ যে কোনও ব্যক্তিকে নোট করুন: দয়া করে এখানে আমাকে ভুল করে থাকলে আমাকে জানান এবং এই পদ্ধতিটি নিয়মিত সংযোজনের চেয়ে আলাদা আচরণ দেখায় behavior এটি আশ্চর্যজনক বলে মনে হয় যে 8+ বছরে এই প্রশ্নটির অস্তিত্ব নেই, এটি আপাতদৃষ্টিতে সুস্পষ্ট সমাধানের পরামর্শ দিতে পারে।
git diff master your_branch | git apply --check
।
এটি আকর্ষণীয় হতে পারে: ডকুমেন্টেশন থেকে:
যদি আপনি এমন একীকরণের চেষ্টা করেন যা জটিল দ্বন্দ্বের সৃষ্টি করে এবং আবার শুরু করতে চায়, আপনি গিট মার্জ --abort দিয়ে পুনরুদ্ধার করতে পারেন ।
তবে আপনি এটি নিষ্পাপ (তবে ধীর) উপায়টিও করতে পারেন:
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(দ্রষ্টব্য: এটি কেবল / টিএমপি-তে ক্লোনিংয়ের কাজ করবে না, যাতে আপনার অনুলিপি পরিবর্তনগুলি দ্বন্দ্ব করবে না তা নিশ্চিত করার জন্য আপনার একটি অনুলিপি প্রয়োজন))
cp -r repository/.git /tmp/repository/.git
, cd /tmp/repository
, git reset --hard
, git add --all
, git reset --hard
(ভাল পরিমাপ জন্য), git status
(চেক করার জন্য যে এটা পরিষ্কার এর)।
আমি সচেতন যে এটি একটি পুরানো প্রশ্ন, তবে গুগল অনুসন্ধানে এটিই প্রথম উপস্থিত।
মার্জ করার সময় গিট একটি --ff-only বিকল্পটি প্রবর্তন করে।
থেকে: http://git-scm.com/docs/git- विसর
কেবল---ff
একত্রে-শূন্য স্থিতির সাথে একত্রীকরণ এবং প্রস্থান করতে অস্বীকার করুন যদি না বর্তমানের হেড ইতিমধ্যে আপ টু ডেট থাকে বা একীভূতিকে দ্রুত-অগ্রবর্তী হিসাবে সমাধান করা না যায়।
এটি করার ফলে মার্জ এবং দ্রুত-ফরওয়ার্ডের চেষ্টা করা হবে এবং এটি যদি এটি বন্ধ না করে এবং আপনাকে দ্রুত-ফরোয়ার্ড সম্পাদন করা যায় না এমন অনুরোধ জানায় তবে আপনার কার্যকারী শাখাটি অদৃশ্য রাখে। যদি এটি দ্রুত-এগিয়ে যেতে পারে তবে তা আপনার কার্যকারী শাখায় মার্জটি সম্পাদন করবে। এই বিকল্পটি উপলব্ধ git pull
। সুতরাং, আপনি নিম্নলিখিত করতে পারে:
git pull --ff-only origin branchA #See if you can pull down and merge branchA
git merge --ff-only branchA branchB #See if you can merge branchA into branchB
মাস্টার শাখা থেকে কোনও বৈশিষ্ট্য শাখায় কী পরিবর্তন হয়েছে তা দেখতে আমি গিট লগ ব্যবহার করি
git log does_this_branch..contain_this_branch_changes
উদাহরণস্বরূপ - কোনও বৈশিষ্ট্য শাখায় কমিটগুলি কী রয়েছে তা দেখার জন্য যা মাস্টারের সাথে একীভূত / না হয়েছে:
git log master..feature_branch
আপনি যদি বি থেকে ক তে দ্রুত এগিয়ে যেতে চান, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে গিট লগ বি..এ আপনাকে কিছুই দেখায় না, অর্থাত্ এ-তে এমন কিছুই নেই যা বি নেই। তবে বি..এর কিছু থাকলেও আপনি এখনও কোনও দ্বন্দ্ব ছাড়াই মার্জ করতে সক্ষম হবেন, সুতরাং উপরের দুটি জিনিস দেখায়: একটি দ্রুতগামী হবে এবং এইভাবে আপনি কোনও বিরোধ পাবেন না।
আমার সমাধানটি পিছনে মার্জ করা।
আপনার শাখাটি দূরবর্তী "টার্গেট" শাখায় মার্জ করার পরিবর্তে branch শাখাটি আপনার মধ্যে মার্জ করুন।
git checkout my-branch
git merge origin/target-branch
আপনি দেখতে পাবেন যে কোনও বিবাদ রয়েছে কিনা এবং কীভাবে সেগুলি সমাধান করবেন সে বিষয়ে পরিকল্পনা করতে পারেন।
এর পরে আপনি গিটের মাধ্যমে মার্জটি বাতিল করতে পারেন merge --abort
, বা (যদি কোনও বিবাদ না ঘটে এবং মার্জটি ঘটে থাকে) এর মাধ্যমে পূর্বের প্রতিশ্রুতিতে ফিরে যেতে পারেনgit reset --hard HEAD~1