主库相当于目录,因此git提交代码后还需要提交一遍子库,而下载时,现在的是主库,也就是目录,空文件夹,因为还需要下载子库.
在Git中,用HEAD表示当前版本,也就是最新的提交版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
工作区-暂存区-版本库 当前工作文件夹叫做工作区, 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库 Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。 把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。 你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
每次修改,如果不用git add到暂存区,那就不会加入到commit中。
像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。 用git log --graph命令可以看到分支合并图。
忽略某些文件时,需要编写.gitignore;
执行命令后,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
git pull=git fetch + git merge git fetch是拉取,git merge是合并
reserv和reset reset是移动head指针,且该版本之后的commit不会出现。 revert是重做某一个版本,且不改变此版本之后的提交。
Git 一共有3个配置文件:
仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:\Users<用户名>.gitconfig。系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的 gitconfig。--local:仓库级,--global:全局级,--system:系统级
子模块 经常有这样的事情,当你在一个项目上工作时,你需要在其中使用另外一个项目。也许它是一个第三方开发的库或者是你独立开发和并在多个父项目中使用的。这个场景下一个常见的问题产生了:你想将两个项目单独处理但是又需要在其中一个中使用另外一个。
这里有一个例子。假设你在开发一个网站,为之创建Atom源。你不想编写一个自己的Atom生成代码,而是决定使用一个库。你可能不得不像CPAN install或者Ruby gem一样包含来自共享库的代码,或者将代码拷贝到你的项目树中。如果采用包含库的办法,那么不管用什么办法都很难去定制这个库,部署它就更加困难了,因为你必须确保每个客户都拥有那个库。把代码包含到你自己的项目中带来的问题是,当上游被修改时,任何你进行的定制化的修改都很难归并。
Git 通过子模块处理这个问题。子模块允许你将一个 Git 仓库当作另外一个Git仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。
smartgit是一款全平台图形化git工具。 使用smartgit的代码提交流程如下:
1.备份
备份要提交的文件,防止弄错后无法挽回
2.设置分支
确认当前文件的包是不是master,如果不是master,
则在所在仓库check out变成master,
然后pull拉取代码为最新
3.提交 选择要提交的文件, commit, 填写log,
切换分支,提交其他代码 切换分支时多数要merge并处理冲突。
可以多次commit,然后一次push to,
但是每次commit只能提交同一个子库的文件。
4.推送
Push默认推送到master Push to可以选择推送分支, 例如:Push to: refs/for/master
此时如出现以下错误:
BUG: remote: ERROR: [2883a2e] missing Change-Id in commit message footer remote: remote: Hint: To automatically insert Change-Id, install the hook: remote: gitdir=$(git rev-parse --git-dir); scp -p -P 29418 chen_dq@10.10.88.49:hooks/commit-msg ${gitdir}/hooks/ remote: And then amend the commit: remote: git commit --amend remote: error: failed to push some refs to 'ssh:#chen_dq@10.10.88.49:29418/integration/EHP-Navi-dev'则按照Hint的提示来操作,首先将版本回退,在左侧master上右键Reset,或者在下方列表中的版本上右键Reset 然后在将要提交的文件的所在包内git bash here, 按照提示执行类似操作:
gitdir=$(git rev-parse --git-dir) scp -p -P 29418 chen_dq@10.10.88.49:hooks/commit-msg ${gitdir}/hooks/然后reset撤回上次提交,
然后重新commit,然后重新push to就成功了。
5.审阅
此处需要管理员操作, 打开gerrit, ALL-Open, 打开提交的代码, review, 如果正确, 提交。
6.提交子库
在子库上Pull更新代码, 当子库没有箭头时代表更新成功。 上箭头表示服务器比本地版本高,下箭头表示本地比服务器版本高 子库的节点可以同时commit,然后pushto,review。
参考链接: https://blog.sina.com.cn/s/blog_dc9540b00102x0z4.html https://www.liaoxuefeng.com/wiki/896043488029600 https://blog.csdn.net/yxlshk/article/details/79944535 https://git-scm.com/book/zh/v1/Git-工具-子模块