(0)tag
对某一时间点上的版本打上标签。在发布某个branch 可以选择版本发布
1 | $ git tag |
1 | git tag -a v1.4 -m 'my version 1.4' |
1.Git子模块
在一个项目里,引用另一个项目,还不想copy代码到项目里,可以创建子模块,把一个git仓库当作另外一个git仓库的子目录。 ****
使用情况:例如Android系统代码和app之间可以使用这种submodule的方法来管理。在一个项目里面引用一个共有的common 方法库。
新建:
$ git submodule add url path/to/name
示例$ git submodule add git://github.com/chneukirchen/rack.git rack
会在项目离得rack子目录下有一个rack项目,进入目录在里面加入远程 仓库就可以正常使用了。
在外层git status 的时候, 会发现多了一个rack 目录,和.gitsubmodule 文件(被控制,其他人可以通过这个知道子项目来源和对应信息)
在子模块中,修改并提交后,外层的指针会记录 子模块指向的新的提交,这样其他人clone 这个项目时,可以获得一样的环境。
(外层 看子项目 其实就是记录子项目里面 提交的指针)
(2)使用 : 克隆一个带子模块的项目
克隆之后在外层会有rack 文件夹,但是里面没有文件,需要执行以下命令
$ git submodule init
$ git submodule update
初始化本地配置文件,从那个项目中拉取数据
(3)更新 : 如果其他人提交了子项目rack中的代码,我们这边 pull 下来的是子项目的引用,而不是他在子项目中提交的代码
这里,我们会显示rack 子项目是一个临时状态。
1 | [master*]$ git status |
因为更新的时指针,而不是代码,所以状态不匹配,需要git submodule update
更新。每次更新都是
(4)子项目问题
在子项目中只修改代码commit,但是没有push到远程,然后推送到上层, 这样其他人 在项目中pull的时候会显示需要更新子模块,git submodule update,但是执行之后,因为没有push 远程服务器,所以会找不到,报错
1 | $ git submodule update |
此时,通过查看谁提交的,然后找他。
(5)使用注意事项
修改子模块中的代码:进到submodule 目录,修改提交, 但是,默认git submodule update 不会切到任何branch,head时游离状态,在修改前一定要切换好分支,才能做修改和提交。
否则,不切换分支直接在外层git submodule update ,子项目中的代码会被覆盖,修改会丢失。
补救措施:未切换分支,且提交,用cherry-pick 解救。
1.用 git checkout master *将HEAD从游离状态切换到 master 分支, 这时候,git会报Warning说有一个提交没有在branch上,记住这个提交的change-id(假如change-id为 aaaa)
2.用 *git cherry-pick aaaa 来将刚刚的提交作用在master分支上
3.用 *git push *将更新提交到远程版本库中
子项目的pull 和 git submodule 的区别
2.提交:push,cd libs/tts pull到最新,cd ../.. ,git add/commit 指针,
git checkout master , git pul 更新master,git checkout br ,git merge master 把master的更新到分支,
在tts中pull:外部引用的是指针,指着内部的版本,有时候 master pull 需要git submodule update 是因为外部指针变了 指向内部的c版,于是update后内部切换为c版,现在cd tts,checkout 到master 在内部pull,然后更新外部指针提交,让代码的外部指针指向最新的内部版本。
2.同步一个COMMIT
$ git cherry-pick xxx
可以同步一个commit到本分支
3.Git打TAG
打TAG也就是发布版本
$ git tag -a v1.2 -m “version 1.4”
$ git push –tags
4.查看status详情
$ git add xxx
$ git diff –cached
这样可以在commit之前先看一下修改详情。
5.不产生无用的merge的同步
有这么一种情况,用一个分支专门同步代码提供商的代码的时候,如果一般的pull会不断的产生一个merge看起来会很烦,用下边的使用添加一个–rebase就不会产生无用的merge了
$ git pull –rebase origin master
6.关于stash
适用情况:做了修改后,还没有add commit等等后续工作,现在突然要切换分支做其它事情,默认情况下你在这个分支修改的代码会被带到切换过去的分支中。可以先把你修改的保存起来。这些修改可以再还原过来。
$ git stash -u
$ xxxx 随便你的操作
$ git stash pop
注意:-u是代表是也把添加的新文件(术语是未跟踪)也藏起来,一般是要有这个u的。
7.恢复一个COMMIT
如果一个COMMIT你不想要了,想要去除,可以考虑使用以下的方法;
$ git revert xxxx
这个就可以去掉这个COMMIT的改动,这个是明式的去掉,如果你又后悔了,还可以再次恢复。