手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Git工具详解以及与GitHub的配合使用

[日期:2017-05-24] 来源:Linux社区  作者:chenj_freedom [字体: ]

远程仓库命令

关联远程仓库

  1. git remote add 远程仓库名 [url] 

举例:

  1. git remote add origin git@github.com:chenj-freedom/learngit.git 

如上,origin是远程仓库的名字(注意:是仓库的名字,仓库中含有分支等信息)。

查看远程仓库

  1. git remote //查看远程仓库 
  2. git remote -v //查看远程仓库,更详细信息 

如下图:

fetch说明本地有提取远程仓库的权限,push说明本地有推送代码到远程仓库的权限。

克隆远程仓库

  1. git clone [url] 

举例:

git clone操作会自动为你将远程仓库命名为origin,并抓取远程仓库中的所有数据,建立一个指向它的master指针,在本地命名为orgin/master,然后,git自动建立一个属于你自己的本地master分支,始于origin上master分支相同的位置(master分支的关联,这个也叫做跟踪远程分支),你可以就此开始工作。

原理如下图所示:

跟踪远程分支

从远程分支checkout出来的本地分支,称为:跟踪分支 (tracking branch)。跟踪分支的本质就是使得本地分支名指向远程分支名指向的内容(本质就是设置指针),如上一小节的图,使得本地分支名(master)指向远程分支名(origin/master)指向的节点。设置了跟踪分支之后,使用git push/git pull命令就会自动使得本地分支(local-branch-name)自动push/pull远程分支(remote-branch-name)的内容。

命令格式如下:

  1. git checkout -b [local-branch-name] [remote-name]/[remote-branch-name] //传统格式 
  2. git checkout --track [remote-name]/[remote-branch-name] //简化格式 

第一行的是传统格式,第二行的是简化格式,简化格式中,本地分支名默认和远程分支名相同。

举例:假设远程仓库中现在有一个分支dev11。

用传统格式跟踪分支后,设置本地分支名和远程分支名相同时,用命令git remote show origin命令查看。这时候,git push配置为把本地dev11分支推送到远程dev11分支,本地master分支推送到远程master分支;git pull命令配置为远程dev11分支合并到本地dev11分支,远程master分支合并到本地master分支。

但是假如用传统方式,设置本地分支名和远程分支名不相同时,用命令git remote show origin命令查看。git pull命令还是2个分支(master和dev11)都能拉取并合并到本地对应的分支,但是push命令就只有master分支能推送了。因此:最好是配置本地分支名和远程分支名一样。(所以直接用--track就默认本地分支名和远程分支名一样)

推送内容

  1. git push [remote-name] [local-branch-name]:[remote-branch-name] 

注意:

1、该命令其中local-branch-name或者remote-branch-name是可以二者省略其一。

2、只有在远程服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取(git pull)到本地,合并到自己的项目中,然后才可以再次推送。

举例:git push origin master

这里git自动把master扩展成了refs/heads/master:refs/heads/master,意为“取出我在本地的master分支,推送到远程仓库的master分支中去”。

若想把远程的master分支叫做other分支,可以使用git push origin master:other。

抓取内容

  1. git fetch [remote-name] //抓取远程仓库的全部内容,但是不会自动合并 
  2. git pull //抓取远程仓库跟踪分支的内容,并自动合并到本地相应的分支 

git pull是你在本地的哪个分支使用本命令,它会自动抓取本地这个分支所跟踪的远程分支的内容,然后合并到本地分支上,对其他分支不会抓取内容。

举例1:git fetch origin

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支。

git fetch会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次fetch以来别人提交的更新)。有一点很重要,需要记住,git fetch命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,需要你自己手工合并。如下图所示:

在本地新建一个git_repo文件夹,不通过git clone命令来克隆一个远程库,而是通过git remote add关联远程库,并用git fetch来抓取远程库的所有未抓取过的数据,当抓取下来之后,必须手动合并git merge远程库的内容,才会显示出分支内容,否则,没有手动合并,git fetch是不会自动合并的。

举例2:git pull

实验前提:在github页面上,dev11分支创建一个新文件remote_file.txt,在master分支创建新文件master_remote_file.txt。并且用git checkout -b跟踪远程分支dev11和master了。接下来用git pull命令(注意:是在本地dev11分支上使用git pull命令,所以会抓取dev11分支跟踪的远程分支的内容,并合并到本地dev11分支上。

但是这时候master分支的内容还是没有改变。如下:

删除远程分支

即删除远程仓库中的分支。

  1. git push [remote-name] :[remote-branch-name] 


还记得git push命令吗?git push [remote-name] [local-branch-name]:[remote-branch-name],把本地分支设置为空(冒号之前的内容),就相对于把一个空分支推送到远程仓库中的remote-branch-name分支去了,就相当于删除了远程仓库中的该分支。

举例:

删除远程仓库本地关联

  1. git remote rm [remote-name] 

举例:git remote rm origin

删除远程分支本地关联

删除远程分支关联也即删除本地跟踪分支。

  1. git branch -d [local-branch-name] 

和删除本地分支一样的命令。

分支管理命令

创建、切换、查看分支

假设dev是要创建分支名字。

  1. git branch //查看分支 
  2. git branch dev //创建分支 
  3. git checkout dev //切换分支 
  4. git checkout -b dev //创建并切换分支 

合并分支

假设dev是要创建分支名字。

  1. git merge --no-ff -m "commit comment" dev //禁用Fast forward模式合并分支 
  2. git merge dev //Fast forward模式合并分支 

在Fast forward模式下,当删除分支后,会丢掉分支信息。

删除分支

假设dev是要创建分支名字。

  1. git branch -d dev 
  2. git branch -D dev //强行删除掉还未合并的分支 

bug分支

由于git的分支功能强大,所以修改bug一般也是新建一个bug分支,修改后,合并到你的工作分支(master分支或者dev分支或者其他),再删除bug分支。

假设场景,当你正在dev分支上编码工作,突然接到一个需要紧急修复的bug,你应该会想建立一个bug分支,但是你dev的工作还没有提交(无论是add或者commit),这时候可以使用“存储工作现场”命令,如下:

  1. git stash //存储工作现场,对working directory来说 

然后首先确定要在哪个分支上去解决bug,比如我想要在master分支上解决bug,就先切换到master分支,然后从master分支上创建一个bug分支。(当然你也可以从别的分支上解决bug,比如dev分支上解决bug)。解决bug后合并到工作分支(就是你从哪个分支创建bug分支的那个分支)。

注意:git stash是针对工作区(working directory)来说的,对缓存区无效。所以再切换到bug分支的时候,缓存区的内容要先commit一下,要不然bug解决后,切换回工作分支,缓存区的内容就丢失了,git stash只存储工作区���场的内容。

  1. git checkout master //先切换到master分支 
  2. git checkout -b bug //创建bug分支,并切换到bug分支上 
  3. ... //解决bug 
  4. git add . //在bug分支上add 
  5. git commit -m "fix bug" //在bug分支上commit 
  6. git checkout master //切换回master分支 
  7. git merge --no-ff bug //在master分支上合并bug分支 
  8. git branch -d bug //删除bug分支 

现在bug解决了,要回到原来dev上的工作,可是时间太久了,忘记了。那么可以用一下命令查看工作现场列表。

  1. git stash list //查看工作现场列表 

可以看出来工作现场保存的是dev分支上的现场。所以要先切换回dev分支,在恢复工作现场。如果没有先切换到dev分支,比如在master分支就去恢复工作现场,那么会执行合并dev分支的操作

恢复工作现场的命令,如下:

  1. git stash apply //恢复工作现场 
  2. git stash drop //删除工作现场列表中的对应项 

或者直接

  1. git stash pop //恢复工作现场并删除工作现场列表中的对应项 
linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款