Git工作流程
一般工作流程如下:
- 在本地创建一个Git仓库。
- 克隆 Git 资源作为工作目录。在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。在提交前查看修改。 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
关于三个区域的概念:
- 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
- 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
- 你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
git工作模式
基本概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
多分支工作
分支:就是你在工作区的一个目录,这个目录里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时候都可以追踪历史,或者在将来某个时刻还原文件。
每个分支都相当于一套独立的工作区,可以在不同分支上进行不同的工作,最后再将各个分支的工作成果合并在一起。
- master分支:主分支,用于发布稳定版本。
- dev分支:开发分支,用于日常开发。
- 一般都是在dev分支上进行开发,开发完成后,再将dev分支合并到master分支上,发布新版本。
分支切换原理
- Git 用一个指针叫 HEAD 指向当前分支。
- git的每个分支都会串成一个链表,每次提交,就会在链表上增加一个节点。
- 假如不同分支的进度相同,那么每个分支的链表都是一样的,只是 HEAD 指向不同的分支而已。
- 假如不同分支的进度不同,那么每个分支的链表就不一样了,HEAD 指向不同的分支,就会有不同的节点。
分支合并原理
- 合并分支时,Git 会比较两个分支的最新提交,然后生成一个新的提交。
- 合并分支时,如果存在冲突,需要手动解决冲突,解决后,再提交。(否则可能会有文件丢失或重复)
- 合并分支时,如果不存在冲突,Git 会进行“快进”,也就是直接将指针指向最新的提交,所以合并分支就是将指针指向最新的提交。
- 合并分支时,如果存在冲突,Git 会生成一个新的提交(这个新的提交如何处理冲突?),这种情况下,合并就不是“快进模式”,而是”非快进模式”。
远程仓库概念
- Git是分布式版本控制系统。所以本地仓库可以和远程仓库进行联系。
- 远程仓库就是存放在服务器上的仓库,可以是本地网络的服务器,也可以是互联网上的服务器。
- 本地的仓库和远程仓库可以通过ssh或者https协议进行连接。 3. 我们可以通过git clone命令将远程仓库克隆到本地。也可以通过git push命令将本地仓库的内容推送到远程仓库。实现本地仓库和远程仓库的同步。
Git常用命令
创建添加和提交
- 初始化Git仓库,将当前目录作为git仓库,仓库名字不能有中文和空格。
git init <repoName>
- 把文件添加到仓库
git add <filename> 或是 git add --all
- 把文件提交到仓库
git commit -m "提交说明"
- 查看仓库当前状态
git status
- 查看修改内容
git diff <filename>
查看提交历史
- 查看提交历史,以便确定要回退到哪个版本
git log
把日志信息美化为一行git log --pretty=oneline
在提交信息查看时,可以使用q键退出。其中前面一大串的是版本号,后面的是提交说明。eaad...f0 (HEAD -> master) wrote a readme file
版本回退
- 回退到上一个版本
HEAD^
,HEAD^^
表示上上一个版本,HEAD~100
表示上100个版本。git reset --hard HEAD^
hard参数的意义是,让这个版本成为当前版本,即工作区也会变成这个版本。
- 回退到指定版本
git reset --hard <commit id>
,commit id是版本号的前几位。管理修改
- 文件在工作区的修改全部撤销,
- 如果已经添加到暂存区,那么撤销回到添加到暂存区的状态,
- 如果没有添加到暂存区,那么撤销回到工作区的状态。
- 回到最近一次commit或者add的状态
git checkout -- <filename>
,这里的–很重要,没有–,就变成了创建一个新分支。git checkout -- <filename>
,这里的–很重要,没有–,就变成了创建一个新分支。 - 撤销暂存区的修改,回到工作区
git reset HEAD <filename>
其中reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。删除文件
- 用文件管理器把工作区文件删除了, 并且确实要删除该文件,
git rm filename
再提交git commit -m "remove filename"
先手动删除文件,然后使用git rm
和git add 效果是一样的。 - 误删了文件。用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
git checkout -- <filename>
远程仓库
- 用文件管理器把工作区文件删除了, 并且确实要删除该文件,
- 关联远程仓库
git remote add origin git@github.com:xxx/learngit.git
- 把本地库的所有内容推送到远程库上
git push -u origin master
第一次推送时需要加上u参数,git会把本地的master分支和远程的master分支关联起来,以后就可以使用git push origin master
推送最新修改了。 - 获取远程库的更新
git pull origin master
- 从远程库克隆master分支
git clone origin master
- 解除和远程仓库的绑定
git remote rm origin
- 查看远程库信息
git remote -v
- 从远程仓库克隆
git clone git@github.com:xxx/gitskills.git