当前位置: 首页 > 新闻中心 > 一篇文章让你完全掌握使用git推送代码到新版gitcode

一篇文章让你完全掌握使用git推送代码到新版gitcode

发布时间:2024-03-27 10:16:22

  1. git tag的基本用法
  2. Git怎么推送本地分支到远程新分支上面去
  3. Git怎么推送本地分支到远程新分支?

一、git tag的基本用法

周末闲着没事,专门针对 git 的命令 git tag 琢磨着玩,下面是它的基本常用方法,每个命令都是我亲自尝试过的,有些命令其实只需要一个就能达到同样的效果,只是 git 的功能太强大了,以至于我们可以使用很多不同的命令样式去达到某一个效果。

请看下面

查看本地分支标签

查看远程所有标签

给当前分支打标签

给特定的某个commit版本打标签,比如现在某次提交的id为 039bf8b

删除本地某个标签

删除远程的某个标签

将本地标签一次性推送到远程

将本地某个特定标签推送到远程

查看某一个标签的提交信息

只要把以上几个命令弄熟练了,平时发布版本后想 打标签 基本可以说是手到擒来了。

根据某个commit创建本地分支

例如: 当前分支的某个 commit id = 12345678 ,我们可以基于这个 id 创建本地分支

二、Git怎么推送本地分支到远程新分支上面去

git是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linuxkernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro)

git的更多介绍,请参考我的上一篇博客:git版本管理工具

一、git命令初识

在正式介绍git命令之前,先介绍一下git的基本命令和操作,对git命令有一个总体的认识

示例:从git版本库的初始化,通常有两种方式:

1)gitclone:这是一种较为简单的初始化方式,当你已经有一个远程的git版本库,只需要在本地克隆一份

例如:gitclonegit://github.com/someone/some_project.gitsome_project

上面的命令就是将'git://github.com/someone/some_project.git'这个url地址的远程版本库,完全克隆到本地some_project目录下

2)gitinit和gitremote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进入这个目录,使用'gitinit'命令进行初始化;git以后就会对该目录下的文件进行版本控制,这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把可访问的url记录下来,此时你就可以利用'gitremoteadd'命令来增加一个远程服务器端,

例如:gitremoteaddorigingit://github.com/someone/another_project.git

上面的命令就会增加url地址为'git://github.com/someone/another_project.git',名称为origin的远程服务器,以后提交代码的时候只需要使用origin别名即可

二、git常用命令

1)远程仓库相关命令

检出仓库:$gitclonegit://github.com/jquery/jquery.git

查看远程仓库:$gitremote-v

添加远程仓库:$gitremoteadd[name][url]

删除远程仓库:$gitremoterm[name]

修改远程仓库:$gitremoteset-url--push[name][newurl]

拉取远程仓库:$gitpull[remotename][localbranchname]

推送远程仓库:$gitpush[remotename][localbranchname]

*如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:

$gitpushorigintest:master//提交本地test分支作为远程的master分支

$gitpushorigintest:test//提交本地test分支作为远程的test分支

2)分支(branch)操作相关命令

查看本地分支:$gitbranch

查看远程分支:$gitbranch-r

创建本地分支:$gitbranch[name]----注意新分支创建后不会自动切换为当前分支

切换分支:$gitcheckout[name]

创建新分支并立即切换到新分支:$gitcheckout-b[name]

删除分支:$gitbranch-d[name]-----d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-d选项

合并分支:$gitmerge[name]----将名称为[name]的分支与当前分支合并

创建远程分支(本地分支push到远程):$gitpushorigin[name]

删除远程分支:$gitpushorigin:heads/[name]或$gitpushorigin:[name]

*创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)

$gitsymbolic-refheadrefs/heads/[name]

$rm.git/index

$gitclean-fdx

3)版本(tag)操作相关命令

查看版本:$gittag

创建版本:$gittag[name]

删除版本:$gittag-d[name]

查看远程版本:$gittag-r

创建远程版本(本地版本push到远程):$gitpushorigin[name]

删除远程版本:$gitpushorigin:refs/tags/[name]

合并远程仓库的tag到本地:$gitpullorigin--tags

上传本地tag到远程仓库:$gitpushorigin--tags

创建带注释的tag:$gittag-a[name]-m'yourmessage'

4)子模块(submodule)相关操作命令

添加子模块:$gitsubmoduleadd[url][path]

如:$gitsubmoduleaddgit://github.com/soberh/ui-libs.gitsrc/main/webapp/ui-libs

初始化子模块:$gitsubmoduleinit----只在首次检出仓库时运行一次就行

更新子模块:$gitsubmoduleupdate----每次更新或切换分支后都需要运行一下

删除子模块:(分4步走哦)

1)$gitrm--cached[path]

2)编辑“.gitmodules”文件,将子模块的相关配置节点删除掉

3)编辑“.git/config”文件,将子模块的相关配置节点删除掉

4)手动删除子模块残留的目录

5)忽略一些文件、文件夹不提交

在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如

target

bin

*.db

三、git命令详解

现在我们有了本地和远程的版本库,让我们来试着用用git的基本命令:

gitpull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'gitpulloriginmaster'就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于svn的update

gitadd:是将当前更改或者新增的文件加入到git的索引中,加入到git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如'gitaddapp/model/user.rb'就会增加app/model/user.rb文件到git的索引中,该功能类似于svn的add

gitrm:从当前的工作空间中和索引中删除文件,例如'gitrmapp/model/user.rb',该功能类似于svn的rm、del

gitcommit:提交当前工作空间的修改内容,类似于svn的commit命令,例如'gitcommit-mstory#3,addusermodel',提交的时候必须用-m来输入一条提交信息,该功能类似于svn的commit

gitpush:将本地commit的代码更新到远程版本库中,例如'gitpushorigin'就会将本地的代码更新到名为orgin的远程版本库中

gitlog:查看历史日志,该功能类似于svn的log

gitrevert:还原一个版本的修改,必须提供一个具体的git版本号,例如'gitrevertbbaf6fb5060b4875b18ff9ff637ce118256d6f20',git的版本号都是生成的一个哈希值

上面的命令几乎都是每个版本控制工具所公有的,下面就开始尝试一下git独有的一些命令:

gitbranch:对分支的增、删、查等操作,例如'gitbranchnew_branch'会从当前的工作版本创建一个叫做new_branch的新分支,'gitbranch-dnew_branch'就会强制删除叫做new_branch的分支,'gitbranch'就会列出本地所有的分支

gitcheckout:git的checkout有两个作用,其一是在不同的branch之间进行切换,例如'gitcheckoutnew_branch'就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如'gitcheckoutapp/model/user.rb'就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚

gitrebase:用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从c移到了g,这样分支也就具有了从c到g的功能

gitreset:将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有a-g五次提交的版本,其中c的版本号是bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我们执行了'gitresetbbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么结果就只剩下了a-c三个提交的版本

gitstash:将当前未提交的工作存入git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解

gitconfig:利用这个命令可以新增、更改git的各种设置,例如'gitconfigbranch.master.remoteorigin'就将master的远程版本库设置为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化设置你的git,为你打造独一无二的git

gittag:可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用'gittagrevert_versionbbaf6fb5060b4875b18ff9ff637ce118256d6f20'来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用revert_version标签名,而不是哈希值了

git之所以能够提供方便的本地分支等特性,是与它的文件存储机制有关的。git存储版本控制信息时使用它自己定义的一套文件系统存储机制,在代码根目录下有一个.git文件夹,会有如下这样的目录结构:

有几个比较重要的文件和目录需要解释一下:head文件存放根节点的信息,其实目录结构就表示一个树型结构,git采用这种树形结构来存储版本信息,那么head就表示根;refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、git栈和标签的四种引用,你可以通过命令'gitshow-ref'更清晰地查看引用信息;logs目录根据不同的引用存储了日志信息。因此,git只需要代码根目录下的这一个.git目录就可以记录完整的版本控制信息,而不是像svn那样根目录和子目录下都有.svn目录。那么下面就来看一下git与svn的区别吧

四、git与svn比较

svn(subversion)是当前使用最多的版本控制工具。与它相比较,git最大的优势在于两点:易于本地增加分支和分布式的特性。

下面两幅图可以形象的展示git与svn的不同之处:

------------

1)本地增加分支

图中git本地和服务器端结构都很灵活,所有版本都存储在一个目录中,你只需要进行分支的切换即可达到在某个分支工作的效果

而svn则完全不同,如果你需要在本地试验一些自己的代码,只能本地维护多个不同的拷贝,每个拷贝对应一个svn服务器地址

举一个实际的例子:

使用svn作为版本控制工具,当正在试图增强一个模块,工作做到一半,由于会改变原模块的行为导致代码服务器上许多测试的失败,所以并没有提交代码。

这时候假如现在有一个很紧急的bug需要处理,必须在两个小时内完成。我只好将本地的所有修改diff,并输出成为一个patch文件,然后回滚有关当前任务的所有代码,再开始修改bug的任务,等到修改好后,在将patch应用回来。前前后后要完成多个繁琐的步骤,这还不计中间代码发生冲突所要进行的工作量。

可是如果使用git,我们只需要开一个分支或者转回到主分支上,就可以随时开始bug修改的任务,完成之后,只要切换到原来的分支就可以优雅的继续以前的任务。只要你愿意,每一个新的任务都可以开一个分支,完成后,再将它合并到主分支上,轻松而优雅。

2)分布式提交

git可以本地提交代码,所以在上面的图中,git有利于将一个大任务分解,进行本地的多次提交

而svn只能在本地进行大量的一次性更改,导致将来合并到主干上造成巨大的风险

3)日志查看

git的代码日志是在本地的,可以随时查看

svn的日志在服务器上的,每次查看日志需要先从服务器上下载下来

例如:代码服务器在美国,当每次查看几年前所做的工作时,日志下载可能需要十分钟,这不能不说是一个痛苦。但是如果迁移到git上,利用git日志在本地的特性,查看某个具体任务的所有代码历史,每次只需要几秒钟,大大方便了工作,提高了效率。

当然分布式并不是说用了git就不需要一个代码中心服务器,如果你工作在一个团队里,还是需要一个服务器来保存所有的代码的。

三、Git怎么推送本地分支到远程新分支?

git常用操作命令收集:

1) 远程仓库相关命令

检出仓库:$gitclonegit://github.com/jquery/jquery.git

查看远程仓库:$gitremote -v

添加远程仓库:$gitremote add [name] [url]

删除远程仓库:$gitremote rm [name]

修改远程仓库:$gitremote set-url --push[name][newurl]

拉取远程仓库:$gitpull [remotename] [localbranchname]

推送远程仓库:$git push[remotename] [localbranchname]

2)分支(branch)操作相关命令

查看本地分支:$gitbranch

查看远程分支:$gitbranch -r

创建本地分支:$gitbranch [name] ----注意新分支创建后不会自动切换为当前分支

切换分支:$gitcheckout [name]

创建新分支并立即切换到新分支:$gitcheckout -b [name]

删除分支:$gitbranch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-d选项

合并分支:$gitmerge [name] ----将名称为[name]的分支与当前分支合并

创建远程分支(本地分支push到远程):$git pushorigin [name]

删除远程分支:$git pushorigin :heads/[name]

我从master分支创建了一个issue5560分支,做了一些修改后,使用git pushorigin master提交,但是显示的结果却是'everything up-to-date',发生问题的原因是git pushorigin master 在没有track远程分支的本地分支中默认提交的master分支,因为master分支默认指向了origin master 分支,这里要使用git pushorigin issue5560:master 就可以把issue5560推送到远程的master分支了。

如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,那么可以这么做。

$git pushorigin test:master // 提交本地test分支作为远程的master分支//好像只写这一句,远程的github就会自动创建一个test分支

$git pushorigin test:test // 提交本地test分支作为远程的test分支

如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。

$git pushorigin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心

3)版本(tag)操作相关命令

查看版本:$gittag

创建版本:$gittag [name]

删除版本:$gittag -d [name]

查看远程版本:$gittag -r

创建远程版本(本地版本push到远程):$git pushorigin [name]

删除远程版本:$git pushorigin :refs/tags/[name]

4) 子模块(submodule)相关操作命令

添加子模块:$gitsubmodule add [url] [path]

如:$gitsubmodule addgit://github.com/soberh/ui-libs.gitsrc/main/webapp/ui-libs

初始化子模块:$gitsubmodule init ----只在首次检出仓库时运行一次就行

更新子模块:$gitsubmodule update ----每次更新或切换分支后都需要运行一下

删除子模块:(分4步走哦)

1)$gitrm --cached [path]

2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉

3) 编辑“.git/config”文件,将子模块的相关配置节点删除掉

4) 手动删除子模块残留的目录

5)忽略一些文件、文件夹不提交

在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如

target

bin

*.db