Git相关命令及用法

add commit push

git add *
git commit -m ""
git push -u origin branch

在删除某一些文件时, 应使用git add .. 否则, 会出现Changes not staged for commit: ...

添加子模块

子模块的操作必须非常小心, 因为其中有很多坑.

第一次添加子模块

git submodule add git://github.com/chneukirchen/rack.git rack

删除某个子模块

git rm --cached pathOfSubmodule

然后删除_config.yml以及.git/config文件中相关记录

更改子模块后提交对子模块的修改

进入子模块所在目录

git add *
git commit -m ""
git push

主项目提交

我们可以直接像正常git文件一样的流程进行提交, 但是如果我们忘记提交子模块的变动, 而新的项目和子模块的变动又相关. 那么其他人从远程仓库中clone的文件可能并不能正确运行(缺少必要的子模块变动).

所有推荐使用以下两种方法:
1. git push --recurse-submodules=check. 若有子模块的变动没有推送, 那么该push会失败.
2. git push --recurse-submodules=on-demand. 若有子模块的变动没有推送, 那么它会先推送子模块的变动, 然后再推送主项目.

子模块的更新

其他人如果对子模块进行了修改, 在git pull之后, 再调用以下git submodule update更新子模块.

调用git submodule update也更新子模块的相关内容, 但是会将子模块留在一个称作 detached HEAD的状态. 这意味着没有本地工作分支(例如 “master”)跟踪改动。 所以你做的任何改动都不会被跟踪。即使你使用了commit提交了一些变动, 在你下一次使用git submodule update时, 这些变动会全部丢失.

所以需要进入每一个你希望对其进行修改的子模块,git checkout branchName检出一个分支. 从远程仓库中更新本地文件时, 使用git submodule update --remote --merge, 也可以使用--rebase.

如果忘记了--rebase或者--merge, git会将子模块更新为远程仓库上的状态, 而且该项目将再一次进入 detached HEAD 的状态. 解决方法:

  1. 检出包含之前本地更改的分支
  2. 然后手动的merge或者rebase任何一个远程分支即可.

即使没有提交子模块的更改也某有问题, 此时git只会抓取更改, 而不会覆盖本地内容.

克隆一个带子模块的项目

克隆一个包含子模块的项目.git clone下来之后, 该子模块并不会被clone下来.需要调用以下两个命令:
1. git submodule init来下载本地所需的子模块配置文件文件
2. git submodule update来下载主项目中列出的合适的子模块提交

也可以使用git clone --recursivegit clone --recursive https://github.com/...自动地初始化并更新仓库中的每一个子模块.

posted @ 2016-11-26 17:30  ivyxjc  阅读(210)  评论(0编辑  收藏  举报