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

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

接触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 <name>
git branch -D <name>--强制删除

那么,对于远程仓库的分支,比如我的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 <name>

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

$ 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

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

如何添加、移除忽略文件

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

设置忽略规则
忽略插件

忽略文件配置示例:

# 用'#'开始注释一行. 

# 忽略掉所有文件名是 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 – <deleted_file>

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

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

总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容