配置及生成SSH
Git配置
Git安装完之后,需做最后一步配置。打开git bash,分别执行以下两句命令
git config --global user.name “用户名”
git config --global user.email “邮箱”
SSH配置
- 打开 git bash
- 执行生成公钥和私钥的命令:ssh-keygen -t rsa 并按回车3下(为什么按三下,是因为有提示你是否需要设置密码,如果设置了每次使用Git都会用到密码,一般都是直接不写为空,直接回车就好了)。会在一个文件夹里面生成一个私钥 id_rsa 和一个公钥id_rsa.pub。(生成的公私钥在 .ssh的文件夹里面)
- 在.ssh文件夹里打开 id_rsa.pub 文件,复制内容,在 github 上进行添加,即完成公钥配置。
创建版本库
- 新建一个要放代码的文件夹
- 路径切换到文件夹所在目录,通过
git init
命令把这个目录变成Git可以管理的仓库:
输完会出现如下信息$ Initialized empty Git repository in 文件目录/.git/
(.git就是我们常说的版本库) - 将代码放到创建的文件夹下,然后
$ git add 文件名+后缀
,执行完此句命令,不会有什么显示就说明添加成功。如果有很多文件,可以继续重复这步。 - 添加完成后,执行
$ git commit -m "此次提交的描述"
。
查看版本记录
命令:$ git log
。
需要注意最上面的是最新一版。
本地分支版本回退
命令:$ git reset --hard HEAD^
(以回退到上一个版本为例。)
补充:在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD ^ ,上上一个版本就是HEAD ^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
要是后悔回退了怎么办??
在你回退版本后再用$ git log
查询时,回退前最新版本已经不见了,那怎么办呢?别急。
-
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找,找到回退之前最新版本的版本号, 1094adb…,于是就可以指定回到未来的某个版本:
命令:$ git reset --hard 1094a
(假设版本号前几位是1094a,在这里只需要前几位就可以,推荐5-6位) -
命令行窗口关了怎么办呢?
这时候我们另一个命令就派上用场,命令:$ git reflog
,这个命令会记录你每一次的命令,从而你就可以找到对应的版本号,然后就可以让Git内部指向当前版本的HEAD指针定位到指定位置。
简单说一下工作区和暂存区
工作区:编写代码的文件夹。
缓存区:暂存代码的修改,等待提交到分支。
分支:保存每一次提交的版本。
- 上文提到版本库(.git):Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
- 前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
-
第一步是添加到暂存区:
git add 文件名
; -
第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前本地分支。
-
由此,我们一定要记住,提交修改一定要先将其add到暂存区。
撤销修改
- 工作区修改,但未提交到暂存区
git checkout --文件名
// 将工作区撤销到与暂存区相同的状态。
// 若之前提交过暂存区后,又修改了文件,会撤销到提交暂存区的状态。
// 若暂存区为空,会撤销到版本库的状态。
- 提交到暂存区,但未添加到本地分支
git reset HEAD 文件名
// 这个命令执行完后,就会撤销到提交暂存取前的状态,即上一步的状态。
- 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库。
删除文件
- 当你删除了一个文件,工作区和版本库就不一致了。此时可以用
git status
查看删除了哪些文件。 - 当你确认要删除,则使用
git rm 文件名加后缀
,并且git commit -m "描述"
,此时版本库的文件就被删除了。还有一种情况是你误删了,这时版本库还有这个文件,因此你可以使用$ git checkout -- 文件名加后缀
进行还原。 - 当文件提交到版本库永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
添加远程仓库
- 关联 命令
git remote add origin git@server-name:path/repo-name.git;
这里的最后一部分为ssh克隆地址 git push -u origin master
第一次推送master分支的所有内容- 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master
推送最新修改;
从远程仓库克隆
- 前提:在github有一个仓库。若是新建,记得勾选
Initialize this repository with a README
,这样GitHub会自动为我们创建一个README.md文件 - 克隆命令:
$ git clone github仓库克隆地址
.
在这里 github 克隆地址分为两类,一类是ssh,一类是https。但通过ssh支持的原生git协议速度最快。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
分支管理
-
当只有一个分支时,master指向最新提交的版本,HEAD 指向 master。如图
-
当我们创建新的分支,例如dev时,Git新建了一个指针叫 dev,指向 master 相同的提交,再把HEAD指向 dev。从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针往前移动一步,而 master 指针不变;假如我们在 dev 上的工作完成了,就可以把 dev 合并到 master 上。
-
使用到的命令:
- 创建+切换到新创建的分支
$ git checkout -b dev
- 创建分支
$ git branch dev
- 切换分支
$ git checkout dev
- 删除分支
$ git branch -d dev
or$ git branch -D dev
(强制删除未合并的分支) - 重命名分支
nginx git branch –m oldname newname
- 查看当前分支
$ git branch
.该命令会列出所有分支,当前分支前面会标一个*号。 - 推送本地分支
git push origin branch-name
,若推送失败,则先用git pull
拉取最新的远程提交。 - 建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
; - 克隆远程非master分支
git checkout -b dev origin/dev
需要克隆其他分支需要将这样新建分支。即指定远程的新建分支。 - 分支合并
git merge dev //不保留合并历史 git merge --no-ff dev //保留合并历史记录
- 创建+切换到新创建的分支
解决冲突
什么是冲突?
假设现在有master分支和Dev分支。我们在本地对Dev分支中一个文件的一行进行了修改,并提交到Dev分支上;接着我们切换到master分支上,对同一文件、同一行进行不同的修改,并且提交到master分支。master分支和Dev分支各自都分别有新的提交。而这两者的提交内容修改不同, git无法判别到底要进行怎样的合并。
这时就需要手动去修改成我们希望的内容,然后再提交。
忽略特殊文件
- 在Git工作区的根目录下创建一个特殊的.gitignore 文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
忽略原则
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库;
3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。