avatar

目录
git

(0)tag

对某一时间点上的版本打上标签。在发布某个branch 可以选择版本发布

Code
1
$ git tag
Code
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 子项目是一个临时状态。

Code
1
2
3
4
5
6
7
[master*]$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: rack

因为更新的时指针,而不是代码,所以状态不匹配,需要git submodule update 更新。每次更新都是

(4)子项目问题

在子项目中只修改代码commit,但是没有push到远程,然后推送到上层, 这样其他人 在项目中pull的时候会显示需要更新子模块,git submodule update,但是执行之后,因为没有push 远程服务器,所以会找不到,报错

Code
1
2
3
$ git submodule update
fatal: reference isn’t a tree: 6c5e70b984a60b3cecd395edd5b48a7575bf58e0
Unable to checkout '6c5e70b984a60b3cecd395edd5ba7575bf58e0' in submodule path 'rack'

此时,通过查看谁提交的,然后找他。

(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的改动,这个是明式的去掉,如果你又后悔了,还可以再次恢复。

文章作者: 美式不加糖
文章链接: http://yoursite.com/2020/02/04/git/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 湖畔小屋
打赏
  • 微信
    微信
  • 支付寶
    支付寶