`গিট একীকরণ এবং` গিট একীভূত - কোন- ff-এর মধ্যে পার্থক্য কী?


975

ব্যবহার করে gitk log, আমি দুজনের মধ্যে কোনও পার্থক্য চিহ্নিত করতে পারি না। আমি কীভাবে পার্থক্যটি পর্যবেক্ষণ করতে পারি (গিট কমান্ড বা কোনও সরঞ্জাম দিয়ে)?




উত্তর:


1078

--no-ffপতাকা প্রতিরোধ git mergeএকটি "দ্রুত-ফরোয়ার্ড" নির্বাহ যদি এটা সনাক্ত করে যে আপনার বর্তমান থেকে HEADকমিট আপনি একত্রীকরণ করার চেষ্টা করছেন পূর্বপুরুষ। একটি দ্রুত অগ্রসর হয় যখন, মার্জ কমিট নির্মাণের পরিবর্তে, গিটটি কেবল আপনার শাখা পয়েন্টারকে আগত কমিটের দিকে নির্দেশ করে। git pullকোনও স্থানীয় পরিবর্তন ছাড়াই এটি করার সময় এটি সাধারণত ঘটে থাকে ।

যাইহোক, মাঝে মাঝে আপনি এই আচরণটি হতে আটকাতে চান, সাধারণত কারণ আপনি একটি নির্দিষ্ট শাখা টপোলজি বজায় রাখতে চান (উদাহরণস্বরূপ আপনি কোনও বিষয় শাখায় মার্জ করছেন এবং আপনি ইতিহাস পড়ার সময় সেভাবে দেখছেন তা নিশ্চিত করতে চান)। অর্ডার যে কি জন্য, আপনাকে প্রেরণ করতে পারেন --no-ffপতাকা এবং git mergeহবে সবসময় ফাস্ট-ফরোয়ার্ড পরিবর্তে একটি একত্রীকরণ গঠন করা।

একইভাবে, আপনি যদি স্পষ্টভাবে দ্রুত-ফরওয়ার্ডের জন্য কোনও কার্যকর করতে চান git pullবা ব্যবহার git mergeকরতে চান এবং আপনি যদি তা দ্রুত অগ্রসর করতে না পারেন তবে আপনি জামিন দিতে চান তবে আপনি --ff-onlyপতাকাটি ব্যবহার করতে পারেন । এইভাবে আপনি নিয়মিত কিছু git pull --ff-onlyনা ভাবার মতো কিছু করতে পারেন এবং তারপরে যদি এটির ত্রুটি থেকে যায় তবে আপনি ফিরে যেতে পারেন এবং সিদ্ধান্ত নিতে পারেন আপনি মার্জ বা পুনর্বাসিত করতে চান কিনা।


87
ওপি-র প্রশ্নের আরও সরাসরি উত্তর দেওয়ার জন্য: এগুলি সবসময় আলাদা হয় না, তবে যদি তা হয় তবে এটি স্পষ্ট হয় gitkবা git log --graphদ্রুত-ফরোয়ার্ড একীভূত হওয়ার ফলে মার্জ কমিট তৈরি হয় নি, যখন নন-ফাস্ট-ফরওয়ার্ড করেছে did
ক্যাসাবেল

11
এফএফকে এড়িয়ে যাওয়ার কারণটি প্রসারিত করা ভাল হবে: লেখক "নির্দিষ্ট শাখা টপোলজি" উল্লেখ করেছেন এর অর্থ - কোন- ff ক্ষেত্রে একটি অতিরিক্ত মার্জ কমিট মার্জটির চিহ্নিতকারী হিসাবে কাজ করে। পেশাদাররা হ'ল লেখকের নাম এবং সংযুক্তির সুস্পষ্ট মার্জ মার্কার। কনসটি হ'ল অ-রৈখিক ইতিহাস যা রূপান্তরকারী রেলপথ ট্র্যাকগুলির সেটগুলির মতো দেখায়। সংযুক্তির একটি সম্ভাব্য মনস্তাত্ত্বিক পার্শ্ব প্রতিক্রিয়া যদিও অবদানকারীরা দীর্ঘতর পর্যালোচনা প্রক্রিয়াটির কারণে আগ্রহ হারাচ্ছেন
ভ্লাদ

6
এটা কি বলা উচিত যে --no-ffকোনও বৈশিষ্ট্য থেকে মাস্টার বিকাশ বা বিকাশ করা কি একটি অনুরোধ মার্জ করার অনুরূপ?
মার্লিনপ্যাট

9
নিবন্ধন করুন যদি আপনি গিটহাবে একটি টান অনুরোধটি মার্জ করেন তবে এটি এর সমতুল্য হয় --no-ff
লিলি ব্যালার্ড

1
এটি একটি ভাল ব্যাখ্যা। মানুষ,
গিটের

1036

এই প্রশ্নের গ্রাফিক উত্তর

এখানে একটি স্পষ্ট ব্যাখ্যা এবং ব্যবহারের গ্রাফিকাল চিত্র সহ একটি সাইট রয়েছে git merge --no-ff:

গিট মার্জ --no-ff এবং গিট একীকরণের মধ্যে পার্থক্য

আমি এটি না হওয়া পর্যন্ত আমি গিট দিয়ে পুরোপুরি হারিয়ে গেলাম। ব্যবহার করে --no-ffইতিহাসের পর্যালোচনা করা কাউকে আপনি যে শাখায় কাজ করেছেন সেটিকে পরিষ্কারভাবে দেখতে দেয় । (সেই লিঙ্কটি গিথুবের "নেটওয়ার্ক" ভিজ্যুয়ালাইজেশন সরঞ্জামের দিকে নির্দেশ করে) এবং এখানে চিত্রের সাথে আরও একটি দুর্দান্ত রেফারেন্স দেওয়া হয়েছে। এই রেফারেন্সটি গিটের সাথে কম পরিচিত যারা তাদের উপর আরও বেশি মনোযোগ দিয়ে প্রথমটিকে সুন্দরভাবে পরিপূরক করে।


আমার মতো নবীনদের জন্য প্রাথমিক তথ্য

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


ওয়ার্কফ্লো উদাহরণ

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

গিট কমান্ডগুলির আমার কর্মপ্রবাহ:

git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am  "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master

নীচে: ব্যাখ্যা সহ প্রকৃত ব্যবহার।
দ্রষ্টব্য: নীচের আউটপুটটি কেটে গেছে; গিট বেশ ভার্জোজ।

$ git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   ecc/Desktop.php
#       modified:   ecc/Mobile.php
#       deleted:    ecc/ecc-config.php
#       modified:   ecc/readme.txt
#       modified:   ecc/test.php
#       deleted:    passthru-adapter.igs
#       deleted:    shop/mickey/index.php
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       ecc/upgrade.php
#       ecc/webgility-config.php
#       ecc/webgility-config.php.bak
#       ecc/webgility-magento.php

উপরে থেকে 3 টি বিষয় লক্ষ্য করুন:
1) আউটপুটটিতে আপনি নতুন ফাইল সংযোজন সহ ইসিসি প্যাকেজের আপগ্রেড থেকে পরিবর্তনগুলি দেখতে পাবেন।
2) এছাড়াও লক্ষ্য করুন যে দুটি ফাইল রয়েছে ( /eccফোল্ডারে নেই) আমি এই পরিবর্তনটি থেকে আলাদা করে মুছে ফেলেছি। এই ফাইলগুলি মুছে ফেলার সাথে বিভ্রান্ত করার পরিবর্তে, এই ফাইলগুলির মোছা প্রতিবিম্বিত eccকরতে আমি cleanupপরে একটি আলাদা শাখা তৈরি করব ।
৩) আমি আমার ওয়ার্কফ্লো অনুসরণ করিনি! আমি ইসি আবার কাজ করার চেষ্টা করার সময় গিট সম্পর্কে ভুলে গিয়েছিলাম।

নীচে: git commit -am "updated ecc package"আমি সাধারণত সমস্ত অন্তর্ভুক্ত করার চেয়ে আমি কেবল /eccফোল্ডারে ফাইলগুলি যুক্ত করতে চেয়েছিলাম । মুছে ফেলা ফাইলগুলি বিশেষত আমার অংশ ছিল না git add, তবে সেগুলি ইতিমধ্যে গিটের উপর নজর রাখা হয়েছিল, তাই আমাকে এই শাখার প্রতিশ্রুতি থেকে অপসারণ করতে হবে:

$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M       passthru-adapter.igs
M       shop/mickey/index.php

$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"

$ git checkout master
D       passthru-adapter.igs
D       shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
   8a0d9ec..333eff5  master -> master



উপরেরটি স্বয়ংক্রিয় করার জন্য স্ক্রিপ্ট

এই প্রক্রিয়াটি দিনে 10+ বার ব্যবহার করে, আমি কমান্ডগুলি কার্যকর করতে ব্যাচ স্ক্রিপ্টগুলি লেখার চেষ্টা করেছি, সুতরাং git_update.sh <branch> <"commit message">উপরের পদক্ষেপগুলি করার জন্য আমি একটি প্রায় যথাযথ স্ক্রিপ্ট তৈরি করেছি । এখানে সেই লিপির জন্য গিস্ট উত্স source

পরিবর্তে git commit -amআমি উত্পাদিত "পরিবর্তিত" তালিকা থেকে ফাইলগুলি নির্বাচন করছি git statusএবং তারপরে এই স্ক্রিপ্টের মধ্যে আটকানো past এটি প্রায়শই ঘটেছিল কারণ আমি কয়েক ডজন সম্পাদনা করেছি তবে পরিবর্তিত গোষ্ঠীগুলির জন্য বিভিন্ন শাখার নাম চেয়েছি।


11
--no-ffবিকল্পের সাথে একত্রীকরণের পরেও আপনি কী নিরাপদে কোনও শাখা মুছে ফেলতে পারবেন ?
অ্যান্ডি ফ্লেমিং

17
@ ডিজাইনারগুই হ্যাঁ আপনি পুরাতন শাখাটি নিরাপদে মুছতে পারেন। একটি নির্দিষ্ট অঙ্গীকারকে কেবল পয়েন্টার হিসাবে শাখা এএস সম্পর্কে ভাবেন।
জাইফ্র্যাক্স

2
আমি লিঙ্কযুক্ত পৃষ্ঠাগুলি থেকে এই পাঠ্যটি সহায়ক বলে খুঁজে পেয়েছি: --no-ff ছাড়া "গিট ইতিহাস থেকে এটি দেখা অসম্ভব যে প্রতিশ্রুতিবদ্ধ বস্তুর মধ্যে কোনটি একটি বৈশিষ্ট্য প্রয়োগ করেছে - আপনাকে সমস্ত লগ বার্তা ম্যানুয়ালি পড়তে হবে।"
লর্ড লালিবার্তে

এক হাজার হাজার শব্দের চেয়ে একটি চিত্র সর্বদা সেরা!
রুপস

1
দ্বিতীয় চিত্রটিতে গ্রাফিক বৈশিষ্ট্যগুলি শাখাটি দেখায় না কেন? এটি এখনও আছে কি তাই না?
এডিজেঙ্কস

269

কৌশলগুলি মার্জ করুন

সুস্পষ্ট মার্জ : একটি নতুন মার্জ কমিট তৈরি করে। (আপনি যদি ব্যবহার করেন তবে এটিই পাবেন --no-ff))

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

দ্রুত ফরোয়ার্ড মার্জ: নতুন প্রতিশ্রুতি না তৈরি করে দ্রুত ফরওয়ার্ড করুন:

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

রিবেস : একটি নতুন বেস স্তর স্থাপন করুন:

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

স্কোয়াশ: জোর দিয়ে এমন কিছু পিষে বা কষান (এমন কিছু) যাতে এটি সমতল হয়:

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


11
আকর্ষণীয় গ্রাফিক কিন্তু এটি সত্যই - না-এফএফ কেসটি দেখায় না এবং তাই এখানে প্রশ্নের বেশিরভাগ উত্তর দেয় না
Vib

22
প্রথমটি, এখানে "মার্জ" হিসাবে শিরোনামযুক্ত "সুস্পষ্ট মার্জ", একটি নন-এফএফ মার্জ।
বেকারিবস

3
গ্রাফিক্স আমাকে সত্যই অনেক সাহায্য করেছিল
এক্সেক্সিয়ান

2
প্রতি কথার প্রশ্নের উত্তর দেয় না, তবে এই গ্রাফিকটি আশ্চর্যজনক, UPVOTE!
সোভিয়েতফ্রন্টিয়ার

3
তাহলে রেবেস এবং দ্রুত-ফরোয়ার্ড একীভূত করার পরে তফাত কী?
থ্যানোস ফিশারম্যান

217

--no-ffবিকল্প নিশ্চিত একটি দ্রুত অগ্রসর একত্রীকরণ ঘটতে করবে না, এবং যে একটি নতুন কমিট বস্তুর সবসময় তৈরি করা হবে । বৈশিষ্ট্যযুক্ত শাখার ইতিহাস বজায় রাখতে গিটটি চাইলে এটি আকাঙ্ক্ষিত হতে পারে।             গিট মার্জ - নো-এফএফ বনাম গিট মার্জ উপরের চিত্রটিতে, বাম দিকটি ব্যবহারের পরে গিট ইতিহাসের একটি উদাহরণ git merge --no-ffএবং ডান দিকটি git mergeযেখানে ff মার্জ সম্ভব হয়েছিল তা ব্যবহারের একটি উদাহরণ ।

সম্পাদনা : এই চিত্রের পূর্ববর্তী সংস্করণটি মার্জ কমিটের জন্য কেবলমাত্র একক পিতামাতাকে নির্দেশ করেছে। মার্জ কমিটের একাধিক পিতামাতার কমিট রয়েছে যা গিটটি "বৈশিষ্ট্য শাখা" এবং মূল শাখার ইতিহাস বজায় রাখতে ব্যবহার করে । একাধিক প্যারেন্ট লিঙ্কগুলি সবুজতে হাইলাইট করা হয়েছে।


3
কালো তীর বনাম সবুজ তীর কী নির্দেশ করে?
rtconner

11
সবুজ তীর প্রতিশ্রুতিবদ্ধ এবং পিতামাতার মধ্যে একটি লিঙ্ক নির্দেশ করে যেখানে কমিটের একাধিক পিতামাত থাকে। সাধারণ কমিট (কালো) কেবলমাত্র একটি পিতা বা মাতা থাকে।
ড্যানিয়েল স্মিথ

9
@ ড্যানিয়েলস্মিথ আপনি এই মার্জিত গ্রাফটি কীভাবে আঁকবেন?
চানসিউউ

4
@ অ্যাডোব ইলাস্ট্রেটারের সাথে চ্যান্সইউউ
ড্যানিয়েল স্মিথ

আমার সংস্থায় মনে হচ্ছে সমস্ত পুল অনুরোধগুলি --no-ff বিকল্পের সাথে একত্রীকরণ করা হয়েছে। এই পরিস্থিতিতে, আমি কী টানার অনুরোধ তৈরি করার আগে তা পুনরায় চালু করা কি বোধগম্য?
নিকপিক

37

এটি একটি পুরানো প্রশ্ন, এবং এটি অন্যান্য পোস্টে কিছুটা সূক্ষ্মভাবে উল্লেখ করা হয়েছে, তবে আমার জন্য এই ক্লিকটি যে ব্যাখ্যাটি করেছে তা হ'ল দ্রুত ফরোয়ার্ড মার্জগুলির জন্য পৃথক প্রতিশ্রুতি প্রয়োজন


আপনি কি দয়া করে উপরের আমার উত্তরে কর্মপ্রবাহটি পর্যালোচনা করবেন: এর অর্থ কি আমি এখন যা পেয়েছি তার বাইরে অতিরিক্ত কমিটের প্রয়োজন? ধন্যবাদ।
ক্রিস কে

3
@ ক্রিসকে git merge --no-ff eccআপনার git logশাখা মাস্টারের জন্য একটি অতিরিক্ত মার্জ কমিট থাকবে । এটি মাসিক কমিটের সরাসরি পূর্বপুরুষের দিকে ইঙ্গিত করার ক্ষেত্রে প্রযুক্তিগতভাবে প্রয়োজন হয় না - তবে --no-ff বিকল্পটি উল্লেখ করে আপনি সেই সংহত প্রতিশ্রুতি তৈরি করতে বাধ্য করছেন। এটির শিরোনাম থাকবে:Merge branch 'ecc'
অঙ্কুর আগরওয়াল

দুর্দান্ত সারসংক্ষেপ! :)
এডওয়ার্ড

4

--No-ff পতাকাটির ফলে মার্জটি সর্বদা একটি নতুন কমিট অবজেক্ট তৈরি করে, এমনকি যদি দ্রুত-ফরওয়ার্ডের সাথে মার্জটি সম্পাদন করা যায়। এটি কোনও বৈশিষ্ট্য শাখার historicalতিহাসিক অস্তিত্ব সম্পর্কে তথ্য হারাতে বাধা দেয় এবং একসাথে সমস্ত বৈশিষ্ট্য যুক্ত করে এমন সমস্ত অঙ্গীকারকে দলবদ্ধ করে

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