热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Git+GitHub,构建自己的开源仓库之Git踩过的坑

俗话说:世上本没有坑,踩得人多了,也就有了坑……接触Git已经有一段时间了,也写了一些学习心得,这是第四篇关于Git的文章,记录一下在实践中踩过的坑。前三篇博文传送门:Git+Gi

俗话说:世上本没有坑,踩得人多了,也就有了坑……

接触Git已经有一段时间了,也写了一些学习心得,这是第四篇关于Git的文章,记录一下在实践中踩过的坑。

前三篇博文传送门:
Git+GitHub,构建自己的开源仓库之Git分支
Git+GitHub,构建自己的开源仓库之Git命令
Git+GitHub,构建自己的开源仓库之初识Git

希望我在学习中遇到的一些问题,同样能够帮助正在学习Git的你。
下面是本文要介绍的Git操作(基于Git Bash命令行的操作):

  • 如何创建远程分支
  • 如何删除远程分支
  • 如何克隆远程分支
  • 如何添加、移除忽略文件
  • 添加、移除忽略文件不生效怎么回事
  • 删除的文件怎么恢复

如何创建远程分支

创建远程分支其实很简单,首先要在本地创建分支,然后把这个分支push到远程仓库。

git branch -b develop_test
git push origin develop_test

这样,远程仓库就可以看见develop_test这个分支了。

如何删除远程分支

通过前面三篇文章的学习,相信都知道怎么删除本地分支了,这里回顾一下:

git branch -d
git branch -D --强制删除

那么,对于远程仓库的分支,比如我的GitHub上的一个仓库,不小心push了一个没有什么意义的分支上去,怎么删除呢?

git push origin :branch-name

注意冒号前面的空格,意思是push一个空的分支到你要删除的那个分支上,相当于删除这个分支:

$ git push origin :develop2
To git@github.com:chengshengyang/Login-MVP-Architecture.git
- [deleted] develop2

这对于删除tag同样有效,把要删除的分支名字换成对应的tag名字即可,在Git v1.7.0 之后,还可以使用这种语法删除远程分支:

git push origin --delete

我们看看输出和上面的指令一个效果:

$ git push origin --delete develop3
To git@github.com:chengshengyang/Login-MVP-Architecture.git
- [deleted] develop3

然后我GitHub上的develop2和develop3都被删掉了。

如何克隆远程分支

场景是我在A电脑上创建了一个分支develop,现在我回到家里,在自己的B电脑上要把这个develop分支clone下来,在本地做开发,这样,我上班有空了可以在公司电脑上倒腾自己的代码,下班前提交到develop,回家把在公司提交的代码pull下来,就不用电脑整天背来背去了。so easy!!!

git clone默认会把远程仓库整个clone下来,但只会在本地默认创建一个master分支。想要clone其他分支,可以使用checkout命令来把远程分支取到本地,并自动建立tracking:

git checkout -b develop origin/develop

尝试输入上面命令,把develop克隆到本地,但是失败了:

$ git checkout -t origin/develop
fatal: Cannot update paths and switch to branch 'develop' at the same time.
Did you intend to checkout 'origin/develop' which can not be resolved as commit?

git remote show origin命令查看一下远程仓库的状态:

$ git remote show origin
* remote origin
Fetch URL: git@github.com:chengshengyang/Login-MVP-Architecture.git
Push URL: git@github.com:chengshengyang/Login-MVP-Architecture.git
HEAD branch: master
Remote branches:
develop new (next fetch will store in remotes/origin)
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (local out of date)

可以看到develop分支的状态是new,而不是跟master分支一样:tracked。这就是导致问题的原因。也就是说develop分支还没有被追踪。执行git remote update命令:

$ git remote update
Fetching origin
remote: Counting objects: 81, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 81 (delta 21), reused 12 (delta 12), pack-reused 37
Unpacking objects: 100% (81/81), done.
From github.com:chengshengyang/Login-MVP-Architecture
db7e7b3..82618ec master -> origin/master
* [new branch] develop -> origin/develop

再调用git remote show origin命令查看

$ git remote show origin
* remote origin
Fetch URL: git@github.com:chengshengyang/Login-MVP-Architecture.git
Push URL: git@github.com:chengshengyang/Login-MVP-Architecture.git
HEAD branch: master
Remote branches:
develop tracked
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (local out of date)

这时候develop分支也变成了tracked了,接着执行git fetch命令,无任何输出(成功)。问题解决。再次执行克隆远程分支命令

$ git checkout -b develop origin/develop
error: Your local changes to the following files would be overwritten by checkout:
.idea/misc.xml
Please commit your changes or stash them before you can switch branches.
Aborting

提示本地分支有未提交的内容,先提交,保持工作空间的clean。

chengshengyang@csy-pc MINGW64 ~/AndroidStudioProjects/Login-MVP-Architecture (master)
$ git checkout -b develop origin/develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
chengshengyang@csy-pc MINGW64 ~/AndroidStudioProjects/Login-MVP-Architecture (develop)

ok,终于成功啦,现在我在本地克隆了远程仓库的develop分支,并且切换到develop分支了。

$ git branch
* develop
master

上述问题的解决方案参考:

  • 1.http://stackoverflow.com/questions/22984262/cannot-update-paths-and-switch-to-branch-at-the-same-time

  • 2.http://blog.csdn.net/qianggezhishen/article/details/49337169

如何添加、移除忽略文件

添加删除忽略文件都是对.gitignore进行编辑,对于ignore的语法,可以通过Android Studio的“.ignore”插件来学习,这个插件还挺好用的,会教你怎么来写忽略文件,而且会把忽略文件灰色标记,一目了然。

《Git+GitHub,构建自己的开源仓库之Git踩过的坑》 设置忽略规则
《Git+GitHub,构建自己的开源仓库之Git踩过的坑》 忽略插件

忽略文件配置示例:

# 用'#'开始注释一行.
# 忽略掉所有文件名是 foo.txt 的文件.
foo.txt
# 忽略所有生成的 html 文件,
*.html
# foo.html是个特例,不添加忽略.
!foo.html
# 忽略所有.o和 .a文件,出了special.o文件.
*.[oa]
!special.o
# 只忽略当前目录下的folder文件和目录,子目录的folder不在忽略范围内
/folder
# 只忽略test文件,不忽略test目录(比如当前目录下有test文件夹、test.jpg、test.png等)
test
!test/
# 只忽略test目录,不忽略test文件
test/
# 忽略test文件和test目录
test

添加、移除忽略文件不生效怎么回事

辛辛苦苦编辑完忽略规则,却发现设置的规则完全没起作用,或者有的起作用了,有的没起作用,怎么回事?原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。解决方法就是先把要忽略文件的本地缓存删除(改成未track状态),然后再修改提交.gitignore文件:

git rm -r --cached .idea/modules.xml
git add .gitignore
git commit -m 'update .gitignore'

关于忽略可以参考:https://github.com/github/gitignore 来设置忽略规则。

删除的文件怎么恢复

最怕的就是文件误删,吓尿了,怎么办?不要怕,在Git里,永远有后悔药可以吃。

  • 1.远程仓库没删除,本地执行了add 和 commit,这种情况下,恢复删除文件很简单:

    git checkout -- test.txt

文件就恢复到仓库的最新版本了,可能会丢失上次push后的一些修改。

  • 2.远程仓库都没啦,本地删除后push到远程了。这种情况,可以从本地的版本恢复,先用git log 查看提交的记录,找到被删除之前的一个commit-id,拷贝,

    git checkout commit_id -- path_to_file

把文件恢复到版本commit-id。

  • 3.如果要查看删除的文件:

    git ls-files --deleted

要恢复则需要执行checkout:

git checkout –

多个文件同时操作可以使用xargs:

git ls-fies -d | xargs git checkout --

总结

Git的内容还是很多的,用法也多种多样,很多操作可能不止一种写法,各个版本也有所不同,学习起来很容易入坑,遇到问题的解决方法也不是唯一的,关键是每个命令的实现原理,学习Git不能只关注各种命令,更重要的其实是原理,基友们学习的时候要抓住重点,注重基础原理的理解。


推荐阅读
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • 本文介绍了GregorianCalendar类的基本信息,包括它是Calendar的子类,提供了世界上大多数国家使用的标准日历系统。默认情况下,它对应格里高利日历创立时的日期,但可以通过调用setGregorianChange()方法来更改起始日期。同时,文中还提到了GregorianCalendar类为每个日历字段使用的默认值。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 安装oracle软件1创建用户组、用户和目录bjdb节点下:[rootnode1]#groupadd-g200oinstall[rootnode1]#groupad ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
author-avatar
changless
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有