मैं एक नई स्थानीय शाखा को दूरस्थ Git रिपॉजिटरी में कैसे धकेलूं और इसे भी ट्रैक करूं?


4302

मैं निम्नलिखित कार्य करने में सक्षम होना चाहता हूं:

  1. किसी अन्य (दूरस्थ या स्थानीय) शाखा (के माध्यम से git branchया git checkout -b) के आधार पर एक स्थानीय शाखा बनाएँ

  2. स्थानीय शाखा को दूरस्थ रिपॉजिटरी (प्रकाशित) में पुश करें, लेकिन इसे ट्रैक करने योग्य बनाएं git pullऔर git pushतुरंत काम करेगा।

मैं उसको कैसे करू?

मुझे --set-upstreamGit 1.7 के बारे में पता है , लेकिन यह एक निर्माण के बाद की कार्रवाई है। मैं दूरस्थ रिपॉजिटरी की शाखा को आगे बढ़ाते हुए एक समान परिवर्तन करने का तरीका खोजना चाहता हूं।



71
सिर्फ इंगित करने के लिए
-सेट

@BaiyanHuang कि बाहर इशारा करने के लिए धन्यवाद। शुरू में मुझे लगा कि -u का मतलब अनट्रैक था जो मेरे लिए मायने नहीं रखता था
दिमित्री

जवाबों:


6608

Git 1.7.0 और बाद में, आप एक नई शाखा देख सकते हैं:

git checkout -b <branch>

फ़ाइलें संपादित करें, जोड़ें और प्रतिबद्ध करें। फिर (कम के लिए ) विकल्प के साथ धक्का-u--set-upstream :

git push -u origin <branch>

Git पुश के दौरान ट्रैकिंग जानकारी सेट करेगा।


81
यह भी ध्यान देने योग्य है कि यदि आपके पास एक मौजूदा ट्रैकिंग शाखा है जो पहले से ही आप को धक्का दे रही शाखा पर सेट है, और push.defaultकरने के लिए सेट है upstream, तो यह वह नहीं करेगा जो आप सोचते हैं कि यह करेगा। यह मौजूदा ट्रैकिंग शाखा पर जोर देने की कोशिश करेगा। उपयोग करें: git push -u origin mynewfeature:mynewfeatureया git branch --unset-upstreamपहले करें।
void.pointer

13
विजुअल स्टूडियो से Git का उपयोग करने वाले लोगों के लिए: वास्तव में यह है कि Visual Studio में "पब्लिश ब्रांच" करता है। -U पैरामीटर के साथ git पुश निष्पादित करने के बाद, मैं अंत में VS UI में प्रकाशित मेरी शाखा को देख सकता हूं।
पटरेडो बोरेटो

3
Git धक्का -u मूल <शाखा> Git धक्का -u मूल प्रमुख के रूप में एक ही (यह मानते हुए आप शाखा आप की जाँच की पुश करने के लिए करना चाहते हैं?) है
gymbrall

13
क्या हमें -uहर बार शाखा को उसके रिमोट पर धकेलने के विकल्प की आवश्यकता है या केवल पहली बार ही इसकी आवश्यकता है?
स्टीफन

17
@Stephane आपको केवल -uएक बार ट्रैकिंग आरंभ करने की आवश्यकता है । बाद में बस का उपयोग करेंgit push
टोड

490

यदि आप अपने रेपो को दूसरों के साथ साझा नहीं कर रहे हैं, तो यह आपकी सभी शाखाओं को रिमोट तक पहुंचाने के लिए उपयोगी है , और --set-upstreamआपके लिए सही तरीके से ट्रैकिंग कर रहा है:

git push --all -u

(ओपी के लिए पूछ रहा था बिल्कुल नहीं, लेकिन यह एक लाइनर बहुत लोकप्रिय है)

यदि आप अपने रेपो को दूसरों के साथ साझा कर रहे हैं तो यह वास्तव में अच्छा रूप नहीं है क्योंकि आप अपने सभी डॉगी प्रायोगिक शाखाओं के साथ रेपो को रोकेंगे।


14
और git pull --allयह सब वापस कहीं और खींचता है? kewl
21

1
यह कमांड कुछ भी पुश करने की आवश्यकता के बिना ट्रैकिंग को सही शाखा पर सेट करता है। धन्यवाद।
22

45
गिट एक शाखा करने की अनुमति देता है और बहुत अच्छे कारणों से इसे धक्का नहीं देता है। केवल गिट पुश --all का उपयोग गिट आर्किटेक्चर के एक टुकड़े को छोड़ने जैसा है। यदि यह आपके लिए काम करता है, तो यह पूरी तरह से ठीक है, महान है, इसे हमेशा के लिए करें। लेकिन कृपया दूसरों को यह सलाह न दें कि सीखने से बचें, क्योंकि यह चीजों को करने का एक त्वरित तरीका है।
फेडेरिको रज़ोली

4
यह वास्तव में सही उत्तर नहीं है और यह क्या करता है और इसका क्या प्रभाव है, इसकी वास्तविक व्याख्या के बिना अनुशंसा करने के लिए एक अच्छा उपकरण नहीं है। कृपया इस उत्तर को नीचे लेने पर विचार करें।
akronymn

3
@Federico @akronymn किसी को करने के खतरे कहां मिल सकते हैं git push --all -u?
user1823664

155

की शुरुआत से पहले git push -u, git pushआप क्या चाहते हैं प्राप्त करने के लिए कोई विकल्प नहीं था । आपको नए कॉन्फ़िगरेशन स्टेटमेंट जोड़ने होंगे।

यदि आप एक नई शाखा का उपयोग करते हैं:

$ git checkout -b branchB
$ git push origin branchB:branchB

आप git configसीधे .git/configफ़ाइल को संपादित करने से बचने के लिए कमांड का उपयोग कर सकते हैं ।

$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB

या आप मैन्युअल रूप से .git/configफ़ाइल को संपादित कर सकते हैं इस शाखा के लिए ट्रैकिंग जानकारी थी।

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB

4
कभी-कभी आपकी यह ज़रूरत होती हैgit push origin -u local_branch:remote_branch
ब्रूस ली

127

सीधे शब्दों में कहें, एक नई स्थानीय शाखा बनाने के लिए , करें:

git branch <branch-name>

इसे दूरस्थ रिपॉजिटरी में धकेलने के लिए , करें:

git push -u origin <branch-name>

17
git branch <branch-name>और git checkout -b <branch-name>दोनों नई शाखा में एक शाखा लेकिन चेकआउट स्विच बनाते हैं
रॉबर्ट

1
यार ब्रैकेट सिर्फ उल्लेख करना है कि आपको जो भी शाखा नाम बनाना है और धक्का देना है, उसे बदलना होगा।
पियूषमंदोवरा

यह रिमोट पर nonexisting शाखा है, और साथ अस्वीकारsrc branch-name does not match any
आदि Prasetyo

96

पहले से ही यहाँ दिए गए समाधानों की थोड़ी भिन्नता:

  1. किसी अन्य (दूरस्थ या स्थानीय) शाखा के आधार पर एक स्थानीय शाखा बनाएँ:

    git checkout -b branchname
    
  2. स्थानीय शाखा को दूरस्थ रिपॉजिटरी (प्रकाशित) में पुश करें, लेकिन इसे ट्रैक करने योग्य बनाएं git pullऔर git pushतुरंत काम करेगा

    git push -u origin HEAD
    

    HEAD"रिमोट पर वर्तमान शाखा को समान नाम पर पुश करने का आसान तरीका" का उपयोग करना है। स्रोत: https://git-scm.com/docs/git-push Git शब्दों में, HEAD (अपरकेस में) वर्तमान शाखा (पेड़) के शीर्ष का संदर्भ है।

    -uविकल्प सिर्फ के लिए कम है --set-upstream। यह वर्तमान शाखा के लिए एक अपस्ट्रीम ट्रैकिंग संदर्भ जोड़ देगा। आप इसे अपने .it / config फाइल में देख कर सत्यापित कर सकते हैं:

    यहां छवि विवरण दर्ज करें


2
धन्यवाद :) git push -u origin <branch-name>मेरे लिए काम नहीं कर रहा था, लेकिन पूरी तरह HEADसे <branch-name>काम करने के बजाय :)
डैनियल टोनन

56

मैं बस करता हूं

git push -u origin localBranch:remoteBranchToBeCreated

पहले से क्लोन प्रोजेक्ट पर।

Git remoteBranchToBeCreatedमेरे द्वारा किए गए मेरे कमिट के नाम से एक नई शाखा बनाता है localBranch

संपादित करें : इससे आपकी वर्तमान स्थानीय शाखा (संभवतः नाम localBranch) अपस्ट्रीम में बदल जाती है origin/remoteBranchToBeCreated। इसे ठीक करने के लिए, बस टाइप करें:

git branch --set-upstream-to=origin/localBranch

तो आपकी वर्तमान स्थानीय शाखा अब origin/localBranchवापस ट्रैक करती है।


1
यह वही है जो मैं सक्रिय रूप से देख रहा था
एली

error: src refspec <new branch> does not match any.जब मैं यह कोशिश करता हूं तो थ्रोट फेंकता है ।
कोडफॉस्टर

1
यह शीर्ष उत्तर होना चाहिए।
आदित्य अभा

30

मुझे लगता है कि आप पहले से ही एक परियोजना की तरह क्लोन कर चुके हैं:

git clone http://github.com/myproject.git
  1. फिर अपनी स्थानीय प्रति में, एक नई शाखा बनाएं और इसे देखें:

    git checkout -b <newbranch>
    
  2. यह मानते हुए कि आपने अपने सर्वर पर "git bare --init" बनाया और myapp.git बनाया, आपको चाहिए:

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
  3. उसके बाद, उपयोगकर्ताओं को सक्षम होना चाहिए

    git clone http://example.com/var/git/myapp.git
    

नोट: मैं मान रहा हूं कि आपके पास अपना सर्वर है और चल रहा है। यदि ऐसा नहीं है, तो यह काम नहीं करेगा। एक अच्छा कैसे यहाँ है

जोड़ा

एक दूरस्थ शाखा जोड़ें:

git push origin master:new_feature_name

जांचें कि क्या सब कुछ अच्छा है (मूल प्राप्त करें और दूरस्थ शाखाओं को सूचीबद्ध करें):

git fetch origin
git branch -r

एक स्थानीय शाखा बनाएँ और दूरस्थ शाखा को ट्रैक करें:

git checkout -tb new_feature_name origin/new_feature_name

सब कुछ अपडेट करें:

git pull

1
विलियम की लिपि मैं इससे जुड़ी थी, जो दूरस्थ शाखाओं और कुछ सुरक्षा उपायों को हटाने के अतिरिक्त विकल्प के बारे में थी, वह भी
टोबीस किंजलर ने

1
> स्थानीय शाखा को दूरस्थ रेपो (प्रकाशित) में धकेलने के लिए, लेकिन इसे> ट्रैक करने योग्य बनाएं ताकि गिट पुल और गिट पुश तुरंत काम करें। जब आप अपने कोड को उनके रिपॉजिटरी :-)
VP पर

1
यह सवाल का जवाब नहीं देता है, मूल रेपो का <newbranch> ट्रैक करने योग्य नहीं है (और इसका नाम बदलकर <मास्टर> नया रेपो है जिसे आपने चरण 3 में क्लोन किया है)।
लोहरून

1
तरह तरह का ओवरकिल लगता है। क्या git remote add originस्थानीय शाखा को ट्रैक करने योग्य बनाता है? क्या यहाँ प्रमुख आदेश है?
रोनी यानि

3
@ रोनी यानिव: न git remote add originकेवल एक नया रिमोट रिपॉजिटरी पंजीकृत करें। अपनी शाखा को उस दूरस्थ रिपॉजिटरी (यदि आप हर बार पूरे पते को टाइप नहीं करना चाहते हैं) को धकेलने से पहले बस एक कदम की जरूरत है
Lohrun

23

संपादित संपादित करें , बस उपयोग करेंgit push -u origin $BRANCHNAME


का प्रयोग करें git publish-branchसे विलियम की विविध Git उपकरण ( gitorious रेपो और क्लोन )।

ठीक है, नहीं रूबी, इसलिए - सुरक्षा उपायों की अनदेखी! - स्क्रिप्ट की अंतिम तीन पंक्तियों को लें और एक बैश स्क्रिप्ट बनाएं git-publish-branch:

#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}

फिर चलाएं git-publish-branch REMOTENAME BRANCHNAME, जहां REMOTENAME आमतौर पर मूल है (आप मूल रूप में डिफ़ॉल्ट को लेने के लिए स्क्रिप्ट को संशोधित कर सकते हैं, आदि ...)


1
यह मानता है कि मैंने माणिक स्थापित किया है। ऐसा भाग्य नहीं। कोई अन्य विचार?
रोनी यानि

2
रूबी स्क्रिप्ट कॉल git pushऔर git configआदेश। मैंने अपने उत्तर को संपादित करने के लिए स्क्रिप्ट के कोड का उपयोग किया। आप इस जानकारी का उपयोग एक छोटी शेल स्क्रिप्ट बनाने के लिए कर सकते हैं जो आपके लिए मवाद करती है।
लोह्रुन

1
विलियम के विविध प्रकार के उपकरण चले गए हैं (यह लिंक अब मृत हो गया है)। एक काम की कड़ी है: gitorious.org/willgit
माइक डी

1
"विलियम" लिंक फिर से टूट गया; नया लिंक git-wt-commit.rubyforge.org
ScottJ

22

किसी मौजूदा शाखा से शाखा द्वारा एक नई शाखा बनाने के लिए

git checkout -b <new_branch>

और फिर इस नई शाखा को रिपॉजिटरी का उपयोग करके धक्का दें

git push -u origin <new_branch>

यह एक नई बनाई गई दूरस्थ शाखा में सभी स्थानीय कमिटों को बनाता और धकेलता है origin/<new_branch>


12

1.7 से पहले GitLab संस्करण के लिए, उपयोग करें:

git checkout -b name_branch

(name_branch, उदाहरण के लिए: master)

इसे दूरस्थ रिपॉजिटरी में धकेलने के लिए, करें:

git push -u origin name_new_branch

(name_new_branch, उदाहरण: feature)


9

मैंने एक उपनाम बनाया ताकि जब भी मैं एक नई शाखा बनाऊं, वह दूरस्थ शाखा को तदनुसार धक्का दे और ट्रैक कर सके। मैंने .bash_profileफ़ाइल में निम्नलिखित हिस्सा डाला :

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
}
alias gcb=publishBranch

उपयोग : बस के gcb thuy/do-sth-koolसाथ टाइप thuy/do-sth-koolमेरा नया शाखा नाम है।


4

यहाँ जवाबों पर थोड़ा सा निर्माण करते हुए, मैंने इस प्रक्रिया को एक सरल बैश स्क्रिप्ट के रूप में लपेटा है, जो निश्चित रूप से एक गिट एलईटी के रूप में भी इस्तेमाल किया जा सकता है।

मेरे लिए महत्वपूर्ण अतिरिक्त यह है कि यह मुझे प्रतिबद्ध करने से पहले इकाई परीक्षण चलाने के लिए संकेत देता है और डिफ़ॉल्ट रूप से वर्तमान शाखा के नाम से गुजरता है।

$ git_push_new_branch.sh

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch           -> Displays prompt reminding you to run unit tests
  git_push_new_branch OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

git_push_new_branch.sh

function show_help()
{
  IT=$(cat <<EOF

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch.sh           -> Displays prompt reminding you to run unit tests
  git_push_new_branch.sh OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch.sh MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

  )
  echo "$IT"
  exit
}

if [ -z "$1" ]
then
  show_help
fi

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
  BRANCH=$CURR_BRANCH
else
  BRANCH=${1:-$CURR_BRANCH}
fi

git push -u origin $BRANCH

2

आप इसे 2 स्टेप्स में कर सकते हैं:

1.checkout स्थानीय शाखा बनाने के लिए उपयोग करें :

git checkout -b yourBranchName

अपनी ब्रांच के साथ काम करें जैसा आप चाहते हैं।

2.push शाखा का उपयोग करने के लिए कमांड का उपयोग करें और कोड को दूरस्थ रिपॉजिटरी में भेजें:

git push -u origin yourBanchName

ऐसा करने के लिए म्यूटेंट तरीके हैं लेकिन मुझे लगता है कि यह तरीका वास्तव में सरल है।


0

सबसे बड़ी लचीलेपन के लिए, आप एक कस्टम Git कमांड का उपयोग कर सकते हैं । उदाहरण के लिए, अपने $PATHनाम के नीचे कहीं पायथन लिपि बनाएं git-publishऔर इसे निष्पादन योग्य बनाएं:

#!/usr/bin/env python3

import argparse
import subprocess
import sys


def publish(args):
    return subprocess.run(['git', 'push', '--set-upstream', args.remote, args.branch]).returncode


def parse_args():
    parser = argparse.ArgumentParser(description='Push and set upstream for a branch')
    parser.add_argument('-r', '--remote', default='origin',
                        help="The remote name (default is 'origin')")
    parser.add_argument('-b', '--branch', help='The branch name (default is whatever HEAD is pointing to)',
                        default='HEAD')
    return parser.parse_args()


def main():
    args = parse_args()
    return publish(args)


if __name__ == '__main__':
    sys.exit(main())

फिर git publish -hआपको उपयोग जानकारी दिखाएगा:

usage: git-publish [-h] [-r REMOTE] [-b BRANCH]

Push and set upstream for a branch

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (default is 'origin')
  -b BRANCH, --branch BRANCH
                        The branch name (default is whatever HEAD is pointing to)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.