Git相关命令及用法

add commit push

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

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

添加子模块

子模块的操做必须很是当心, 由于其中有不少坑.github

第一次添加子模块

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

删除某个子模块

git rm --cached pathOfSubmodulemarkdown

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

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

进入子模块所在目录code

git add *
git commit -m ""
git push

主项目提交

咱们能够直接像正常git文件同样的流程进行提交, 可是若是咱们忘记提交子模块的变更, 而新的项目和子模块的变更又相关. 那么其余人从远程仓库中clone的文件可能并不能正确运行(缺乏必要的子模块变更).rem

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

子模块的更新

其余人若是对子模块进行了修改, 在git pull以后, 再调用如下git submodule update更新子模块.it

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

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

若是忘记了--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/...自动地初始化并更新仓库中的每个子模块.

相关文章
相关标签/搜索