অটো কমিট না করে গিট মার্জ করুন


402

এটি কি সম্ভব git merge, তবে কোনও অঙ্গীকার ছাড়াই?

"ম্যান গিট মার্জ" এটি বলে:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

তবে যখন আমি এটির git mergeসাথে ব্যবহার করার চেষ্টা --no-commitকরি তখনও এটি স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ। আমি যা করেছি তা এখানে:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

পরবর্তীকালে git logv1.0 শাখা থেকে মাস্টারে মার্জ হওয়া সমস্ত কমিট প্রকাশিত হয়।

উত্তর:


616

মার্জ করার সময় আউটপুট নোট করুন - এটি বলছে Fast Forward

এই ধরনের পরিস্থিতিতে, আপনি এটি করতে চান:

git merge v1.0 --no-commit --no-ff

7
যদি কোন সমস্যা হয়।
জর্জেন পল

20
@ আনারসউন্ডারসেসি দ্রুত অগ্রগতি কখনও দ্বন্দ্ব সৃষ্টি করে না। দ্রুত ফরোয়ার্ড ছাড়াই "বাস্তব" একত্রিত হওয়ার ক্ষেত্রে --no-commitযদি কোনও বিরোধ না ঘটে কেবল তখনই স্যুইচ কার্যকর হয়, সংঘাতের ক্ষেত্রে গিট কখনই স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ হয় না।
gronostaj

38
এফওয়াইআই: আপনি যদি পরিবর্তনগুলি মার্জ করতে চান এবং তারপরে প্রতিশ্রুতিবদ্ধ হন যে আপনি নিজেই মার্জ হওয়া সমস্ত পরিবর্তনগুলি ম্যানুয়ালি টাইপ করেছেন (traditionalতিহ্যবাহী একীকরণের বিপরীতে) আপনার rm .git/MERGE_HEADপরে চালানো দরকার , যা গিটকে ভুলে যেতে বাধ্য করবে যে মার্জটি ঘটেছে forget
জন

7
এফওয়াইআই: একটি সফল Automatic merge went well; stopped before committing as requested
সংযুক্তির

6
স্পষ্টতই git merge BRANCHENAME --no-commit --no-ffআমার কর্মক্ষেত্রটি একটি গিট "মার্জিং" অবস্থায় রেখে গেছে। এটি ঠিক কী করে তা পুরোপুরি নিশ্চিত নয় তবে একটি সাধারণ git stash saveএবং git stash popচক্র মনে হয়েছিল সবকিছু স্বাভাবিক অবস্থায় ফিরিয়ে দিয়েছে; টার্গেট শাখা থেকে পরিবর্তিত ফাইলগুলি কেবলমাত্র উদ্দেশ্যে হিসাবে, এবং আর কোনও মার্জিংয়ের স্থিতি নেই।
মুনলাইট

49

আপনি এখানে মার্জটির অর্থ ভুল বুঝছেন।

--no-commitপ্রতিরোধ একত্রীকরণ ঘটে কমিট, এবং যে শুধুমাত্র তখনই ঘটে যখন আপনি দুই বিপথগামী শাখা ইতিহাস একত্রীকরণ; আপনার উদাহরণে এটি ঘটেনি, কারণ গিট ইঙ্গিত করে যে এটি "ফাস্ট-ফরোয়ার্ড" সংহত ছিল এবং তারপরে গিট কেবলমাত্র শাখায় ইতিমধ্যে উপস্থিত কমিটগুলি ধারাবাহিকভাবে প্রয়োগ করে।


12
এটি (ইমো) অগত্যা বিভ্রান্তি দূর করবে না; আমি মনে করি এটি ডকসটি প্রকৃতভাবে পরিষ্কার হওয়ার সময় (তুলনামূলকভাবে বিরল): git help merge=> " --no-commitসংযুক্তি সম্পাদন করার সাথে সাথে মার্জটি ব্যর্থ হয়েছে এবং স্বাবলম্বীকরণ করবেন না, ব্যবহারকারীকে পরিদর্শন করার আগে আরও একটি পরীক্ষা করার সুযোগ দেওয়ার জন্য এবং আরও ভালভাবে ঝাঁকুনির ফলাফলটি ঝাপটায় twe " অবশ্যই কীটি এটি ব্যবহার করছে--no-ff
মিশেল

6
... সম্ভবত কঠোর পরিভাষা থেকে বিরতি এবং এভাবে বর্ণনা করা কম বিভ্রান্তিকর হবে: একটি "গিট মার্জ" যা একটি ফরোয়ার্ড করে এমন একটি মার্জ কমিট নেই কারণ বাস্তবে কোনও মার্জ নেই। এটি প্রকৃতপক্ষে আদর্শ পরিস্থিতি: দ্রুত-অগ্রসর হওয়া একটি ভাল জিনিস, এবং এই অতিরিক্ত "মার্জ কমিট" না করে সংবেদন তৈরি করে। এটি ভাল ডিফল্ট আচরণ এবং অক্ষম করা উচিত নয়। (যথাযথ আলোচনায়, ফাস্ট-ফরোয়ার্ড হ'ল এক ধরণের মার্জ, তবে এটি "সত্যিকারের মার্জ" নয়))
মাইকেল 25

4
এটি প্রকল্পের নীতিগুলির সাথে সম্পর্কিত, কিছু ক্ষেত্রে এটি অতিরিক্ত "সংশ্লেষের প্রতিশ্রুতিবদ্ধ" করার জন্য / এফএফ থাকা সত্ত্বেও এটি কার্যকর হয় কারণ আপনাকে বৈশিষ্ট্যটির মূল শাখায় অন্তর্ভুক্তি চিহ্নিত করতে হবে।
সামুস_২২

7
...কি. ঠিক আছে, আমি মনে করি গিটটি বেশ পরিমাণে অচল করে দেওয়া যায়। বিশেষ করে এই উত্তরটি আমাকে মার্কুরিয়াল চেষ্টা করতে রাজি করেছে।
ব্রায়ান গর্ডন

24

যদি আপনি কেবল একটি প্রতিশ্রুতিতে সমস্ত পরিবর্তন করতে চান যেন আপনি নিজেকে টাইপ করেন, - স্কোয়াশও তা করবে

$ git merge --squash v1.0
$ git commit

1
এটি কি একই প্রভাবgit merge v1.0 --no-commit --no-ff
জেপায়ারসন

2
না, ভিন্ন প্রভাব। স্কোয়াশ একটি নতুন হ্যাশ দিয়ে একটি নতুন প্রতিশ্রুতি তৈরি করে। এটি একটি শাখায় সমস্ত কমিটকে একত্রিত করার জন্য একটি কমিটের সাথে একত্রিত করে।
কবি সিগেল

23

আমি এইভাবে পছন্দ করি তাই আমার কোনও বিরল প্যারামিটার মনে রাখার দরকার নেই।

git merge branch_name

এরপরে এটি বলবে যে আপনার শাখা #কমিট করে " " এগিয়ে রয়েছে , আপনি এখন এই কমিটগুলি পপ করে নিচের সাথে কার্যকরী পরিবর্তনগুলিতে রাখতে পারেন:

git reset @~#

উদাহরণস্বরূপ, যদি মার্জ হওয়ার পরে এটি 1 টি প্রতিশ্রুতিবদ্ধ হয় তবে ব্যবহার করুন:

git reset @~1

দ্রষ্টব্য: উইন্ডোজে, উদ্ধৃতিগুলি দরকার। ( জোশ মন্তব্য হিসাবে উল্লেখ করেছেন) যেমন:

git reset "@~1"

4
উইন্ডোগুলিতে, উদ্ধৃতিগুলি প্রয়োজনীয়:git reset "@~1"
জোশ

1

যখন কেবল শাখায় কোনও প্রতিশ্রুতি থাকে তখন আমি সাধারণত করি

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