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
的状态. 解决方法:
- 检出包含之前本地更改的分支
- 然后手动的merge或者rebase任何一个远程分支即可.
即使没有提交子模块的更改也某有问题, 此时git只会抓取更改, 而不会覆盖本地内容.
克隆一个带子模块的项目
克隆一个包含子模块的项目.git clone
下来之后, 该子模块并不会被clone下来.需要调用以下两个命令:
1. git submodule init
来下载本地所需的子模块配置文件文件
2. git submodule update
来下载主项目中列出的合适的子模块提交
也可以使用git clone --recursivegit clone --recursive https://github.com/...
自动地初始化并更新仓库中的每一个子模块.