准备工作
1-参考资料
Git教程
1-基础
1-1 Git简介
1-2 安装Git
1-3 创建版本库:初始化init+添加add+提交commit
- 版本库
- 定义:版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
- 语法 => git仓库初始化【面试】
- 在合适文件下创建一个空目录:
mkdir learngit - 初始化git仓库:
git init,将目录转化为git可管理的仓库,此时目录下增加.git文件,是git来跟踪管理版本库的 - 在目录下存放文件
- 添加文件到git仓库:【先添加再提交】
- 告诉git把文件xxx.xxx添加到仓库:
git add xxx.xxx,没有报错则添加成功 - 告诉git把文件xxx.xxx提交到仓库:
git commit -m "本次提交的说明xxx",-m后的是本次提交的说明 - 注意:可多次添加add、一次提交commit
- 告诉git把文件xxx.xxx添加到仓库:
- 在合适文件下创建一个空目录:
- 查看状态:
- 查看git仓库当前状态:
git status,可以查看哪些文件被修改了 - 查看修改内容:
git diff,可以查看文件的哪些部分被修改了 - 针对修改的文件->add->commit->在查看一下状态,确定没有修改的文件了
- 查看git仓库当前状态:
2 远程仓库
2-1 远程仓库
- 仓库
- 定义:
- 类别:
- 远程仓库:github或gitee等
- 本次仓库:
- 工作目录:
- 上传远程仓库
- 定义:
- 语法:
- 创建git远程仓库:
- 本地仓库关联远程仓库:
git remote add origin git@github.com:michaelliao/learngit.git - 本地仓库内容推送到远程:
git push -u origin master,实际上是把当前分支master推送到远程
- 克隆远程仓库
- 语法:
- 克隆到本地仓库:
git clone git@github.com:michaelliao/gitskills.git
- 克隆到本地仓库:
- git pull和git fetch => git pull和fetch的区别【面试】
- git fetch:会首先检查本地仓库和远程仓库的差异,检查哪些不存在于本地仓库,然后将这些变动的提交拉取到本地
- 注意:它是把远程提交拉取到本地仓库,而不是本地工作目录,它不会自行将这些新数据合并到当前工作目录中,我们需要继续执行
git merge才会把这些变动合并到当前工作目录 - 优点:
git fetch是一个更安全的选择,因为它从你的远程仓库拉入所有的提交,但不会对你的本地文件做任何修改,可以在合并前检查哪些文件有变化、哪些文件可能导致冲突
- 注意:它是把远程提交拉取到本地仓库,而不是本地工作目录,它不会自行将这些新数据合并到当前工作目录中,我们需要继续执行
- git pull:直接获取远程的最新提交,直接拉取并合并到本地工作目录,而且在合并过程中不会经过我们的审查,如果不仔细检查,这样很容易遇到冲突!
- 理解:相当于运行
git fetch,然后立即将你的改动合并到本地仓库,即pull=fetch+merge。这样的确少了一个步骤,但是也会带来一些风险
- 理解:相当于运行
2-2 使用GitHub
2-2 使用Gitee
3-版本回退
3-1 时光机穿梭
- 查看提交commit历史
git log:查看提交的历史记录
//第一次提交
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) //commit id(版本号)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
//第二次提交
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
//第三次提交
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
git log --pretty=oneline:查看提交的历史记录,并且只显示版本号和备注
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL //第一次提交
e475afc93c209a690c39c13a46716e8fa000c366 add distributed //第二次提交
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file //第三次提交
- 版本回退 => git回滚【面试】
- 定义:将当前文件回退到上一个版本
- 原理:
- Git在内部有个指向当前版本的HEAD指针,回退版本的时候,Git仅仅是把HEAD从指向回退的版本,顺便把工作区的文件更新了。
- 用
HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
- 操作:
- 还原到上一个版本:
git reset --hard HEAD^,此时的文件内容为上一版本内容,注意此时无法通过head回到当前版本 - 还原到具体某一版本:
git reset --hard commit_id,版本号没必要写全,写到可区别于其他版本号的前几位就可以了,Git会自动去找
- 还原到上一个版本:
- 查看命令历史
git reflog:查看历史命令,有版本号
e475afc HEAD@{1}: reset: moving to HEAD^ //reset:回到add distributed
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL //commit
e475afc HEAD@{3}: commit: add distributed //commit
eaadf4e HEAD@{4}: commit (initial): wrote a readme file //commit
4 分支管理
4-1 分支管理
- 分支管理
- 定义:创建一个分支后不影响其他分支工作
- 分支:
- 主分支master:每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支,git只有一条时间线,就是主分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
- 分支dev:
- 合并分支:
- 原理:直接把master指向dev的当前提交,就完成了合并
- 语法:
- 创建dev分支并切换:
git checkout -b dev,git checkout命令加上-b参数表示创建并切换,相当于git branch dev+git checkout dev- 最好用
git switch -c dev
- 查看当前分支:
git branch,会列出所有分支,当前分支前面会标一个*号 - 在dev分支上提交:
git commit -m "branch test" - 切换回master分支:
git checkout master,最好用git switch master - dev分支合并到master分支:
git merge dev,返回Fast-forward快进模式信息 - 删除dev分支:
git branch -d dev
- 创建dev分支并切换:
-
git merge和git rebase的区别 => git merge和git rebase的区别【面试】
-
解决合并冲突 => 解决分支合并冲突问题【面试】
- 问题:在dev分支和master分支都提交了,但是提交的内容不同,git无法快速合并,只能视图把修改合并起来,但是可能会有冲突
- 方法:把Git合并失败的文件手动解决后再提交
- 语法:
-
找到冲突的地方:
git status,可以找到冲突的文件名 -
查看文件内容,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
-
再提交:
git add xxx.xxx和git commit -m "冲突解决" -
删除dev分支:
git branch -d dev
-