git
自报家门
- 使用git之前,要先自报家门
git config --global user.name "用户名"
git config --global user.email "邮箱地址"
本地仓库
-
新建或选择一个目录然后,使用
git init
命令把这个目录变成Git可以管理的仓库 -
图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道,因此,如果要真正使用版本控制系统,就要以纯文本方式编写文件
-
因为文本是有编码的,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
提交文件
- 使用
git add 文件名
将一个新文件添加到仓库 - 使用
git commit -m "更新信息"
将修改提交到仓库 - -m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
- 为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files."
查看信息
git status
命令可以让我们时刻掌握仓库当前的状态git diff
可以查看修改的内容git log
可以查看版本变更的历史记录,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数git log --pretty=oneline
版本回退
- 在Git中,
HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,往上100个版本就是HEAD~100
- 使用
git reset --hard 版本标识
命令进行版本跳转 - 如:
git reset --hard HEAD^
- 也可以重新跳转回最新的版本,
git reset --hard 3628164
- 版本号没必要写全,前几位就可以了,Git会自动去找
- 回退版本后,却忘了最新版本的版本号怎么办?
Git记录了版本变更的记录,可以使用
git reflog
查看版本变更记录
工作区和暂存区
- 工作区:就是你在你的电脑里能看到的目录
- 版本库:工作区内部有一个.git目录,这个不算工作区,而是git的版本库
- Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
- 前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
- 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区
- 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支
- git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支
管理修改
- 为Git跟踪并管理的是修改,而非文件。
- 新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
- git commit只负责把暂存区的修改进行提交
- 提交修改还是使用
git add
和git commit
命令完成的 git checkout -- file
中的--
很重要,如果没有,就变成了切换到另一个分支的指令
撤销修改
git checkout -- file
可以丢弃工作区的修改- 注意还未执行
git add
时上述操作才有效 - 已经执行
git add
,但还没有commit,可以使用git reset HEAD
回退到最后commit的版本
删除文件
- 删除也是一个修改操作
- Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了
- 现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令
git rm
删掉,并提交git commit
- 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
配置远程仓库
ssh-keygen -t rsa -C "Lyinghao@126.com"
- 把id_rsa.pub配置到github的SSHKey中
添加远程仓库
- 在本地的learngit仓库下运行命令:
git remote add origin git@github.com:TommyChok/learngit.git
- 把本地内容添加到远程仓库:
git push -u origin master
- 把本地库的内容推送到远程,用
git push
命令,实际上是把当前分支master
推送到远程。 - 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
- 推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
- 以后提交,只需执行
git push origin master
从远程库克隆
- 假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
- 首先,登陆GitHub,创建一个新的仓库,名字叫gitskills:
- 进入本地目录,执行
git clone git@github.com:TommyChok/gitskills.git
- 要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆
- Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
创建合并分支
- 使用命令:
git checkout -b dev
创建并切换到dev分支 git checkout
命令加上-b参数表示创建并切换,相当于以下两条命令:git branch dev
git checkout dev
git branch
命令可以查看当前分支git branch
命令会列出所有分支,当前分支前面会标一个*号git merge
命令用于合并指定分支到当前分支
解决冲突
- 执行merge后可能发生冲突
git merge feature1
- 发生冲突后,可使用
git status
查看冲突的文件 - 重新编辑冲突文件,解决冲突
- 重新
git add
和git commit
新文件,冲突解决 - 可使用
git log --graph --pretty=oneline --abbrev-commit
查看分支合并的情况 - 合并分支后,可删除无用分支
git branch -d feature1
分支管理策略
- 通常,合并分支时,如果可能,Git会使用
Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息