git submodule临时分支;以及git reset使用

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 以后,能够把删除掉的节点恢复。

相关文章
相关标签/搜索