submodulehtml
已经创建好了一个gitlab submodule形式的repo:git
在repo A下面有一个submodule B, A --> B。app
clone -b branch [repoA]
cd A
git submodule update --init
以后,在B的文件夹下运行gitlab
git branch
会发现当前分支处于一个临时分支上:spa
(HEAD detached at 3bf1f88)
可是在提交repoA的时候,更新的是B中的production分支:.net
git submodule foreach git co -b production
git submodule foreach git pull origin production
而pull下来以后倒是在临时分支上。指针
搜索一阵以后,结论是:code
1. repoA中只会保存repoB的某一个commit,而不知道(或者无论)这个commit是哪一个分支的。update以后submodule都会在一个临时分支上。htm
2. 在更新repoA中的submodule时,须要到每个submodule中进行操做,若是全部submodule分支名都相同,那么可使用git submodule foreach命令。blog
3. 若是想要repoA和repoB的分支名相同,好比repoA的production分支指向submodules的production分支,须要保证在更新时让repoA指向repoB的production分支的最新的commit,而不是在clone和pull代码时让repoB改成production分支。
4. 使用repoA时,能够不用管repoB正处在临时分支上,由于提交repoA代码的时候保证了repoB的commit是目标分支上的,此时repoB的代码就是想要的版本。
新建一个submodule repo过程参考https://blog.csdn.net/czhpxl007/article/details/50555853
reset
正好碰到了一个需求:在一个本地分支上提交了几个commit以后,如今想回到以前一个一个节点上,可是修改的内容也要保存下来。
之前一直使用 git reset --hard commitID,可是--hard参数不会保存修改的内容,会把全部的变化所有删除。
研究一番以后,发现 --soft 和 --mixed参数均可以解决这个问题。
先转载一段介绍https://www.cnblogs.com/kidsitcn/p/4513297.html
Index index也被称为staging area,是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commit Working Copy working copy表明你正在工做的那个文件集 Flow 当你第一次checkout一个分支,HEAD就指向当前分支的最近一个commit。在HEAD中的文件集(实际上他们从技术上不是文件,他们是blobs(一团),可是为了讨论的方便咱们就简化认为他们就是一些文件)和在index中的文件集是相同的,在working copy的文件集和HEAD,INDEX中的文件集是彻底相同的。全部三者(HEAD,INDEX(STAGING),WORKING COPY)都是相同的状态,GIT很happy。 当你对一个文件执行一次修改,Git感知到了这个修改,而且说:“嘿,文件已经变动了!你的working copy再也不和index,head相同!”,随后GIT标记这个文件是修改过的。 而后,当你执行一个git add,它就stages the file in the index,而且GIT说:“嘿,OK,如今你的working copy和index区是相同的,可是他们和HEAD区是不一样的!” 当你执行一个git commit,GIT就建立一个新的commit,随后HEAD就指向这个新的commit,而index,working copy的状态和HEAD就又彻底匹配相同了,GIT又一次HAPPY了。
其实也就是经过git add和git commit进行状态变动。
--soft参数:
soft参数会恢复到git add以后git commit以前,也就是把变动记录到了index区。此时HEAD指针指向了恢复到的commitID
--mixed参数:
mixed参数会直接恢复到git add以前,即全部更改都还在工做区,没有任何提交动做,HEAD指针同soft参数同样。mixed参数也是git reset的默认参数
因此为了知足需求,使用git reset --soft commitID就行。
PS. 使用--hard以后,虽然全部更改都删除了,可是commitID仍然还在,再使用git reset --hard latestCommitID 以后,能够把删除掉的节点恢复。