git远程操作

zocus 8年前
   <h2><strong>git clone</strong></h2>    <ul>     <li> <p>基本命令</p> <pre>  git clone <远程版本库> <本地目录名></pre> </li>     <li> <p>git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等</p> <pre>  $ git clone http[s]://example.com/path/to/repo.git/  $ git clone ssh://example.com/path/to/repo.git/  $ git clone git://example.com/path/to/repo.git/  $ git clone /opt/git/project.git  $ git clone file:///opt/git/project.git  $ git clone ftp[s]://example.com/path/to/repo.git/  $ git clone rsync://example.com/path/to/repo.git/</pre> </li>    </ul>    <h2><strong>git remote</strong></h2>    <ul>     <li> <p>为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名</p> <pre>  git remote  origin</pre> </li>     <li> <p>git remote -v | --verbose 列出详细信息,可以查看远程主机的网址</p> <pre>  git remote --verbose  origin  https://github.com/ytongshang/Notes.git (fetch)  origin  https://github.com/ytongshang/Notes.git (push)</pre> </li>     <li> <p>克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要 用git clone命令的-o选项指定</p> <pre>  git clone -o jQuery https://github.com/jquery/jquery.git  git remote  jQuery</pre> </li>     <li> <p>git remote show命令加上主机名,可以查看该主机的详细信息</p> <pre>  git remote show origin  remote origin  Fetch URL: https://git.coding.net/Rancune/learnGit.git  Push  URL: https://git.coding.net/Rancune/learnGit.git  HEAD branch: master  Remote branch:  master tracked  Local branch configured for 'git pull':  master merges with remote master  Local ref configured for 'git push':  master pushes to master (up to date)</pre> </li>     <li> <p>git remote add命令用于添加远程主机</p> <pre>  git remote add origin https://git.coding.net/Rancune/learnGit.git</pre> </li>     <li> <p>git remote rm命令用于删除远程主机。</p> <pre>  git remote rm origin</pre> </li>     <li> <p>git remote rename命令用于远程主机的改名。</p> <pre>  git remote rename origin hapi</pre> </li>    </ul>    <h2><strong>git fetch</strong></h2>    <ul>     <li> <p>一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要 用到git fetch命令,下面命令将某个远程主机的更新,全部取回本地</p> <pre>  git fetch <远程主机名></pre> </li>     <li> <p>默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指 定分支名</p> <pre>  git fetch <远程主机名> <分支名>  git fetch origin master</pre> </li>     <li> <p>所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取, 此时本地的分支与远程主机的分支 是没有合并的,两者还是独立的 ,比如origin主机的master,就要用origin/master读取。 git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支</p> <pre>  git branch -r  origin/master  git branch -a  master  remotes/origin/master</pre> </li>     <li> <p>本地主机的当前分支是master,远程分支是origin/master。取回远程主机的更新以后,可以在 它的基础上,可以用checkout命令切换到另外的一个分支</p> <pre>  git checkout master 切换本地的主分支  git checkout origin/master 切换到origin的主分支</pre> </li>     <li> <p>也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支</p> <pre>  git merge origin/master  # 或者  git rebase origin/master</pre> </li>    </ul>    <h2><strong>git pull</strong></h2>    <ul>     <li> <p>git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并, 实际上是git fetch与git merge两个命令的合并</p> <pre>  git pull <远程主机名> <远程分支名>:<本地分支名></pre> </li>     <li> <p>取回origin主机的next分支,与本地的master分支合并,需要写成下面这样</p> <pre>  git pull origin next:master</pre> </li>     <li> <p>如果远程分支是与当前分支合并,则冒号后面的部分可以省略</p> <pre>  git pull origin next</pre> </li>     <li> <p>3中的命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge</p> <pre>  git fetch origin  或git fetch origin next  git merge origin/next</pre> </li>     <li> <p>Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候, 所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动 "追踪"origin/master分支,上面命令指定master分支追踪origin/next分支</p> <pre>  git branch --set-upstream master origin/next</pre> </li>     <li> <p>如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名,下面命令表示,本地的当前 分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并</p> <pre>  git pull origin</pre> </li>     <li> <p>如果当前分支只有一个追踪分支,连远程主机名都可以省略。当前分支自动与唯一一个追踪分支进行合并</p> <pre>  git pull</pre> </li>     <li> <p>如果合并需要采用rebase模式,可以使用–rebase选项</p> <pre>  git pull --rebase <远程主机名> <远程分支名>:<本地分支名></pre> </li>    </ul>    <h2><strong>git push</strong></h2>    <ul>     <li> <p>把本地库的所有内容推送到远程库上,分支推送顺序的写法是<来源地>:<目的地>,所以 git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。</p> <pre>  git push <远程主机名> <本地分支名>:<远程分支名></pre> </li>     <li> <p>将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建</p> <pre>  git push origin master</pre> </li>     <li> <p>如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程 分支。下面命令表示删除origin主机的master分支</p> <pre>  git push origin :master  git push origin --delete master</pre> </li>     <li> <p>如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略,下面命令表示, 将当前分支推送到origin主机的对应分支</p> <pre>  git push origin</pre> </li>     <li> <p>如果当前分支只有一个追踪分支,那么主机名都可以省略</p> <pre>  git push</pre> </li>     <li> <p>下面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以 不加任何参数使用git push了</p> <pre>  git push -u origin master</pre> </li>     <li> <p>就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项</p> <pre>  git push --all origin</pre> </li>     <li> <p>如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异, 然后再推送到远程主机。这时,如果你一定要推送,可以使用–force选项,下面命令使用–force选项, 结果导致在远程主机产生一个"非直进式"的合并(non-fast-forward merge)。除非你很确定要这样做, 否则应该尽量避免使用–force选项</p> <pre>  git push --force origin</pre> </li>     <li> <p>git push不会推送标签(tag),除非使用–tags选项。</p> <pre>  git push origin -tags</pre> </li>    </ul>    <h2><strong>git 标签</strong></h2>    <ul>     <li> <p>创建标签,首先切换到对应的分支,默认会为当前的分支 <strong>HEAD</strong> 打上标签</p> <pre>  git checkout dev  git tag "v0.1"</pre> </li>     <li> <p>默认标签是打在最新提交的commit上的,还可以为历史提交打上标签</p> </li>    </ul>    <pre>  git log --pretty=oneline --abbrev-commit  6a5819e merged bug fix 101  cc17032 fix bug 101  7825a50 merge with no-ff  6224937 add merge  59bc1cb conflict fixed  400b400 & simple  75a857c AND simple  fec145a branch test  d17efd8 remove test.txt    git tag v0.9 6224937</pre>    <ul>     <li> <p>标签不是按时间顺序列出,而是按字母排序的。可以用git show</p> <p><tagname>查看标签信息</tagname></p> <pre>  git show v0.9</pre> </li>     <li> <p>还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字</p> <pre>  git tag -a v0.1 -m "version 0.1 released" 3628164</pre> </li>     <li> <p>可以通过-s用私钥签名一个标签,签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如 果没有找到gpg,或者没有gpg密钥对,就会报错</p> <pre>  git tag -s v0.2 -m "signed version 0.2 released" fec145a</pre> </li>     <li> <p>如果标签打错了,也可以删除,因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错 的标签可以在本地安全删除</p> <pre>  git tag -d v0.1</pre> </li>     <li> <p>如果要推送某个标签到远程,使用命令git push <远程主机名></p> <p><tagname></p> <p></tagname></p> <pre>  git push origin v1.0</pre> </li>     <li> <p>一次性推送全部尚未推送到远程的本地标签</p> <pre>  git push origin --tags</pre> </li>     <li> <p>如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除,然后,从远程删除。 删除命令也是push,第一种方式相当于push一个空的tag到原来的v0.9的tag,这里origin 与:之前有一个 空格,下面则是一种删除方法,与git 删除远程分支的原理差不多。</p> <pre>  git tag -d v0.9  git push origin :refs/tags/v0.9  或  git push origin --delete tag <tagname>  或  git push origin : <tagname></pre> </li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/71e48ed3e506</p>    <p> </p>