গিট-এ, কোনও ভাণ্ডার থেকে কোনও সম্পর্কযুক্ত শাখা প্রবর্তনের সহজ উপায় কি?


328

একজন বন্ধুকে আজ গিট সমস্যাতে সাহায্য করার সময় আমাকে একটি শাখা চালু করতে হয়েছিল যা শাখা থেকে সম্পূর্ণ পৃথক হওয়া দরকার master। এই শাখার বিষয়বস্তুগুলির শাখায় যে বিকাশ masterঘটেছিল তার থেকে সত্যই আলাদা উত্স ছিল তবে masterপরবর্তী সময়ে সেগুলি শাখায় একীভূত হতে চলেছিল ।

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

সুতরাং আমরা সূচীর সমস্ত ফাইল থেকে মুক্তি পেয়েছি ...

$ git rm -rf .

... একটি টারবাল থেকে ডিরেক্টরি এবং ফাইলগুলি বের করা হয়েছে, সেগুলি সূচকগুলিতে যুক্ত করা হয়েছে ...

$ git add .

... এবং একটি ট্রি অবজেক্ট তৈরি করেছে ...

$ git write-tree

( git-write-treeআমাদের তৈরি গাছের বস্তুর sha1sum বলেছিলেন।)

তারপরে, আমরা গাছের প্রতিশ্রুতি দিয়েছি, পিতামাতার অঙ্গীকারগুলি নির্দিষ্ট না করে ...

$ echo "Imported project foo" | git commit-tree $TREE

( git-commit-treeতৈরি কমিট অবজেক্টের sha1sum আমাদের জানিয়েছে))

... এবং একটি নতুন শাখা তৈরি করেছে যা আমাদের সদ্য নির্মিত প্রতিশ্রুতিতে নির্দেশ করে।

$ git update-ref refs/heads/other-branch $COMMIT

অবশেষে, আমরা masterসেখানে কাজ চালিয়ে যেতে শাখায় ফিরে এসেছি।

$ git checkout -f master

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

উত্তর:


510

এখানে একটি নতুন বৈশিষ্ট্য রয়েছে (ভি 1.7.2 থেকে) যা অন্য কোনও উত্তরের চেয়ে এই কাজটিকে কিছুটা উচ্চ-স্তরের করে তোলে।

git checkoutএখন --orphanবিকল্প সমর্থন করে । থেকে man পৃষ্ঠা :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

<স্টার্ট_পয়েন্ট> থেকে শুরু করে <নতুন> ব্র্যাঞ্চ> নামে একটি নতুন এতিম শাখা তৈরি করুন এবং এতে স্যুইচ করুন। এই নতুন শাখায় করা প্রথম প্রতিশ্রুতির কোনও পিতা-মাতা থাকবে না এবং এটি অন্যান্য ইতিহাস থেকে সম্পূর্ণ সংযোগ বিচ্ছিন্ন ও অঙ্গীকারবদ্ধ হয়ে যাওয়া নতুন ইতিহাসের মূল হবে।

এটি অনুরোধকারী ঠিক যা চায় তা করে না , কারণ এটি সূচক এবং কার্যকারী গাছটিকে পপুলেট করে <start_point>(যেহেতু এটি সর্বোপরি একটি চেকআউট কমান্ড)। প্রয়োজনীয় অন্য একমাত্র ক্রিয়া হ'ল কার্যকারী গাছ এবং সূচি থেকে কোনও অযাচিত আইটেম সরিয়ে নেওয়া। দুর্ভাগ্যক্রমে, git reset --hardকাজ করে না, তবে git rm -rf .পরিবর্তে এটি ব্যবহার করা যেতে পারে (আমি বিশ্বাস করি এটি rm .git/index; git clean -fdxঅন্যান্য উত্তর হিসাবে দেওয়া সমান )।


সংক্ষেপে:

git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'

আমি <start_point>অনির্ধারিত রেখেছি কারণ এটি হেডের ডিফল্ট, এবং আমরা যাইহোক সত্যিই যত্ন করি না। এই ক্রমটি কেবল ভীতিজনক নদীর গভীরতানির্ণয় আদেশগুলি অবলম্বন না করে আর্টেমের উত্তরে কমান্ড সিক্যুয়েন্সের মতো একই জিনিসটি করে।


আপনি কি জানেন যে অনাথ শাখা তৈরি করা সম্ভব হবে যা আপনি অন্য "গাছ" থেকে কোনও শাখা চেক আউট করার সময় দৃশ্যমান থাকে?
জেজেডি

1
@ জেজেডি: আমার মনে হয় আপনি যা চান তা গিট মার্জ করে। ( git checkout master && git merge --no-commit "orphan-branch" ) অনুরূপ কিছু কৌশল গিট-রিসেট ব্যবহার করে বা সূচকের সাথে খেলতে কাজ করবে। তবে এটি আপনার পছন্দসই কর্মপ্রবাহের উপর নির্ভর করে।
ফোর্ড


@ ফোর্ড আমি প্রকল্পের উত্স কোড থেকে পৃথক ইউনিট পরীক্ষা বা নথিপত্রের মতো বিষয়গুলি ধারণ করার জন্য এতিমকে কমবেশি ভাবি thought
জেজেডি

2
@ জেজেডি: আমি যে স্ক্রিপ্টটি দিয়েছি তা আপনাকে যা দেওয়া উচিত তা দেওয়া উচিত, যদি না আমি আপনাকে ভুল বোঝে না। আপনি যখন "দৃশ্যমান থাকে" বলেছিলেন, আপনি কি বোঝাতে চেয়েছেন যে ফাইলগুলি অন্য কোনও শাখাটি পরীক্ষা করে দেখা সত্ত্বেও ওয়ার্কিং ডিরেক্টরিতে থাকবে? ব্যবহার --no-commitকরে git mergeএটি অর্জন করবে। আপনি একটি ফলো আপ করার প্রয়োজন হতে পারে git reset origin/master, যাতে আপনার পরবর্তী কমিট যায় যেখানে আপনি চাই, কিন্তু তারপর আপনার অনাথ-শাখা থেকে ফাইল "untracked ফাইল" হিসাবে প্রদর্শিত হবে না যদি না আপনি তাদের আপনার .gitignore ফাইলে অন্তর্ভুক্ত।
ফোর্ড 18

32

থেকে গীত কমিউনিটি বুক :

git symbolic-ref HEAD refs/heads/newbranch 
rm .git/index 
git clean -fdx 
<do work> 
git add your files 
git commit -m 'Initial commit'

1
পরবর্তী উত্তরটি গিটের আধুনিক সংস্করণগুলির জন্য ভাল।
কিকিতো

14
@ কিকিতো: পুনরায়: "পরবর্তী উত্তর আরও ভাল" ... এসও-তে এখানে আদেশ ক্রম স্থিতিশীল নয়। আপনি কী ভাবেন এটি একটি উত্তরের উত্তর হিসাবে নির্দেশ করে একটি লিঙ্ক যুক্ত করতে পারেন?
ডেভিড জে

2
আমি স্ট্যাকওভারফ্লো . com/a/4288660/312586 উল্লেখ করছি । আপনি ঠিক বলেছেন, আমার "পরবর্তী" বলা উচিত হয়নি। আমি যখন মন্তব্য করেছি তখন এই উত্তরটির চেয়ে কম স্কোর ছিল।
কিকিতো


এইটি
কেসটির

22

git symbolic-refসূচকের সমাধান এবং অপসারণের সমাধানটি কাজ করলেও , নতুন সংগ্রহস্থল তৈরি করা ধারণাগতভাবে পরিষ্কার হতে পারে

$ cd /path/to/unrelated
$ git init
[edit and add files]
$ git add .
$ git commit -m "Initial commit of unrelated"
[master (root-commit) 2a665f6] Initial commit of unrelated
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo

তারপর এটি থেকে আনুন

$ cd /path/to/repo
$ git fetch /path/to/unrelated master:unrelated-branch
warning: no common commits
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From /path/to/unrelated
 * [new branch]      master     -> unrelated-branch

এখন আপনি / পথ / থেকে / সম্পর্কহীন মুছতে পারেন


আমার মতে, একটি পরিষ্কার ধারণা একটি বিকল্প git branchবা এর সাথে জড়িত git checkout। আমি আনন্দিত যে গিট এই ধরণের জিনিসকে সম্ভব করে তোলে তবে এটি কেন সহজ হবে না?
পাহাড়ী

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

1
+1 টি। সহকর্মী গিট newbies জন্য, আপনি স্পষ্টতই তারপর মাধ্যমে শাখা তালিকাভুক্ত এবং মাধ্যমে git branchতাদের মধ্যে স্যুইচ করতে পারেন git checkout BRANCH_NAME
উকভেল

এর জন্য ধন্যবাদ, আমি নিজে থেকে এটি সম্পর্কে চিন্তা করতাম না। এটি অতিরিক্ত সহায়ক কারণ এটি অন্যান্য রেপোর জন্য ইতিহাস বজায় রাখে (যদি থাকে তবে)।
বিএম

13

গিথুবের প্রজেক্ট পেজ নামে একটি বৈশিষ্ট্য রয়েছে যেখানে আপনি গিথুব দ্বারা পরিবেশন করা হবে এমন ফাইল সরবরাহ করতে আপনার প্রকল্পে একটি নির্দিষ্ট নামক শাখা তৈরি করতে পারেন। তাদের নির্দেশাবলী নিম্নরূপ:

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

সেখান থেকে আপনার একটি খালি সংগ্রহস্থল রয়েছে যা আপনি এতে আপনার নতুন সামগ্রী যুক্ত করতে পারেন।


10

বর্তমানে নির্বাচিত উত্তর সঠিক, আমি কেবল এটি কাকতালীয়ভাবে যুক্ত করব ...

এটি আসলে ঠিক কীভাবে গিথুব ডটকম ব্যবহারকারীদের অনাথ শাখার মাধ্যমে গিথুব পৃষ্ঠাগুলি তাদের ভান্ডারের জন্য তৈরি করতে দেয় gh-pages। সুন্দর পদক্ষেপ এখানে দেওয়া হয়েছে এবং ব্যাখ্যা করা হয়েছে:

https://help.github.com/articles/creating-project-pages-manually

মূলত এটি সেট আপ করার গিট কমান্ডগুলি নিম্নরূপ:

  1. git checkout --orphan gh-pages (আপনার রেপোতে জি-পেজ নামে অভিহিত শাখা তৈরি করুন)
  2. git rm -rf . (শাখা কার্যকারী গাছ থেকে যে কোনও ফাইল সরিয়ে দেয়)
  3. rm '.gitignore' (এমনকি গিটিগনোর)
  4. এখন ওয়েবসাইটের সামগ্রী যুক্ত করুন (index.html, ইত্যাদি যুক্ত করুন) এবং প্রতিশ্রুতিবদ্ধ এবং পুশ করুন।
  5. লাভ।

দ্রষ্টব্য, আপনি ওয়েবসাইট তৈরি করতে গিথুব যে "প্রকল্প সাইট" ব্যবহার করেন তার উত্স হতে আপনার রেপোতে একটি / ডকস ফোল্ডারও নির্ধারণ করতে পারেন ।

আশাকরি এটা সাহায্য করবে!


3

কখনও কখনও আমি কেবল তাত্ক্ষণিকভাবে প্রকল্পে খালি শাখা তৈরি করতে চাই তারপর কাজ করা শুরু করি, আমি নিম্নলিখিত কমান্ডটি উত্সাহিত করব:

git checkout --orphan unrelated.branch.name
git rm --cached -r .
echo "init unrelated branch" > README.md
git add README.md
git commit -m "init unrelated branch"

1

যদি আপনার বিদ্যমান সামগ্রীটি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ ছিল তবে আপনি এখন (গিট 2.18 কিউ 2 2018) এটিকে নিজস্ব নতুন এতিম শাখায় উত্তোলন করতে পারেন, যেহেতু git rebase -i --rootসিকোয়েন্সার যন্ত্রপাতি আরও " " ব্যবহারের জন্য " " বাস্তবায়ন আপডেট করা হয়েছে।

সেই সিকোয়েন্সারই এখন কমিট গ্রাফের পুরো টপোলজিকে অন্য কোথাও প্রতিস্থাপনের অনুমতি দিচ্ছে

দেখুন 8fa6eea কমিট , 9c85a1c কমিট , ebddf39 কমিট , 21d0764 কমিট , d87d48b কমিট , ba97aea কমিট দ্বারা (03 মে 2018) জোহানেস Schindelin ( dscho)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে c5aa4bc কমিট , 30 মে 2018)

সিকোয়েন্সার: নতুন রুট কমিট প্রবর্তন করার অনুমতি দিন

নতুন --rebase-mergesমোডের প্রসঙ্গে , যা বিদ্যমান শাখা টোপোলজিকে উদারভাবে পরিবর্তনের জন্য বিশেষভাবে নকশাকৃত করা হয়েছিল, কোনও ব্যবহারকারী সদ্য তৈরি হওয়া মূল প্রতিশ্রুতি দিয়ে শুরু হওয়া একটি সম্পূর্ণ তাজা শাখায় কমিটগুলি বের করতে চাইতে পারে

মূল প্রতিশ্রুতিতে পরিণত হতে চায় এমন প্রতিশ্রুতি reset [new root]দেওয়ার আগে কমান্ডটি সন্নিবেশ করে এটি এখন সম্ভব pick। উদাহরণ:

reset [new root]
pick 012345 a commit that is about to become a root commit
pick 234567 this commit will have the previous one as parent

এটি resetকমান্ডের অন্যান্য ব্যবহারের সাথে বিরোধী নয় কারণ [new root]একটি বৈধ রেফ নাম (অংশ) নয়: উদ্বোধনী বন্ধনী পাশাপাশি স্থান উভয়ই রেফ নামে অবৈধ।


0

এই স্ক্রিপ্টটি http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git- ব্রাঞ্চে পেয়েছে এবং এটি খুব সূক্ষ্মভাবে কাজ করে!

#!/bin/bash

set -e

if test -z "$2" -o -n "$3"; then
    echo "usage: $0 REPO BRANCHNAME" >&2
    exit 1
fi

repo=$1
branch=$2

git fetch "$repo" "$branch"

head=$(git rev-parse HEAD)
fetched=$(git rev-parse FETCH_HEAD)
headref=$(git rev-parse --symbolic-full-name HEAD)

git checkout $fetched .

tree=$(git write-tree)

newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched)
git update-ref $headref $newhead $head
git reset --hard $headref

1
আমি বিশ্বাস করি যে একই প্রভাব ব্যবহার করে অর্জন করা যেতে পারে git fetch $REMOTE $REMOTE_BRANCH:$LOCAL_BRANCH। আমি কিছু অনুপস্থিত করছি?
পাহাড়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.