GIT进阶用法

现在用GIT的地方越来越多了,只是简单的用一下好像已经不能满足日益增长的需求了,所以这里就总结一些后面可能用到的一些高级一点的用法。

分支合并

以前就一直都在master上裸奔,现在胆子越来越小了,所以一般会有一个dev的分支,在这个分支上搞搞再合并到master上,这个操作的流程是

# on master branch
git merge dev

对于中间出现的冲突可以通过git mergetool解决,合并的时候可以通过git merge -Xignore-space-change whitespace忽略空白。

如果我们只是单独的想留下本地的文件或者用远端的覆盖本地的文件,那么可以直接用如下的命令:

git checkout --ours file.name
git checkout --theirs file.name

子模块

如果要在一个项目中包含另外一个项目,那么单纯的用Git是很难维护的,实际上当你往一个git项目中添加另外一个git项目文件的时候,git也会给出一个警告。对于这种情况,比较推荐的做法是用git子模进行管理。

在一个项目中添加一个子模块可以通过如下的命令实现:

git submodule add URL

对于含有子模块的项目,在clone的时候默认子目录中的内容都是空的,也就是clone并不会clone所以的子模块,如果需要clone所有的子模块内容,需要通过如下的命令实现。

git submodule init
# or
git clone --recursive URL

子模块的遍历

GIT的子模块支持foreach命令,它能在第一个子模块中运行任意命令,如果项目中包含了大量的子模块,通过这个命令可以快速的实现对所有模块的更改,比如所有的子模块新建一个分支:

git submodule foreach 'git checkout -b fetureA'
Entering 'CryptoLibrary'
Switched to a new branch 'featureA'
Entering 'DbConnector'
Switched to a new branch 'featureA'

还有一个小问题,如果在一个新的分支中添加一个子模块,之后再切换到没有这个子模块的分支上面的时候就会出现一个没有跟踪的子模块目录:

$ git checkout -b add-crypto
Switched to a new branch 'add-crypto'

$ git submodule add https://github.com/chaconinc/CryptoLibrary
Cloning into 'CryptoLibrary'...
...

$ git commit -am 'adding crypto library'
[add-crypto 4445836] adding crypto library
 2 files changed, 4 insertions(+)
 create mode 160000 CryptoLibrary

$ git checkout master
warning: unable to rmdir CryptoLibrary: Directory not empty
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    CryptoLibrary/

nothing added to commit but untracked files present (use "git add" to track)

总之在用子模块之前最好可以保证所有分支中的子模块能够保持一致,否则你就抓狂吧

发表新评论