git简介
Git是目前世界上最先进的分布式版本控制系统
1.版本控制系统
问题1:写文件时保留多个修改版本:担心删错内容,怕将来想恢复找不回来,
问题2:如果别人对文件修改,需要将自己的修改部分和别人修改的部分手动合并
因此如果有一个软件,不但能自动记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,即以下图示
这样就相当于结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪
2.分布式和集中式的区别
除了git还有svn、cvs这样的版本控制系统,它们的区别在于一个是分布式一个是集中式
集中式就是svn和csv这样的版本控制系统,分布式是git
区别在于集中式的版本控制系统每次在写代码时都需要从服务器中拉取一份下来,并且如果服务器丢失了,那么所有的就都丢失了,你本机客户端仅保存当前的版本信息,换句话说,集中式就是把代码放在一个服务器上集中管理,你的所有回滚等操作都需要服务器的支持。
分布式的区别在于,每个人的电脑都是服务器,当你从主仓库拉取一份代码下来后,你的电脑就是服务器,无需担心主仓库被删或者找不到的情况,你可以自由在本地回滚,提交,当你想把自己的代码提交到主仓库时,只需要合并推送到主仓库就可以了,同时你可以把自己的代码新建一份仓库分享给其它人。
3.git的工作原理
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
Workspace:工作区,就是你平时存放项目代码的地方
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
git命令
创建本地仓库
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
1、创建全新的仓库,需要用GIT管理的项目的根目录执行:
# 在当前目录新建一个Git代码库
$ git init
执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
2.克隆远程仓库
另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url] # https://gitee.com/kuangstudy/openclass.git
基础命令
主要参考关于Git这一篇就够了
1.配置git环境:git config --global
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
//config:参数是用来配置git环境的
--global:长命令表示配置整个git环境
2.创建本地空仓库:git init
$ mkdir learngit //创建一个名叫learngit的空目录
$ cd learngit //把learngit设置为当前目录
$ pwd //查看当前目录
/c/Users/86156/Desktop/learngit
$ git init
Initialized empty Git repository in /Users/86156/Desktop/learngit/.git/
//把这个目录变成Git可以管理的仓库
3.新建文件添加到本地仓库:git add、git commit -m
$ git add 1.txt//把文件添加到仓库
$ git commit -m "wrote a file"
[master (root-commit) 757b589] wrote a file
1 file changed, 2 insertions(+)
create mode 100644 1.txt
//把文件提交到仓库
//-m后面输入的是本次提交的说明,可以输入任意内容。
4.查看提交之后文件是否做了改动:git status
$ git status
On branch master
Untracked files://未提交,没有放入暂存区
(use "git add <file>..." to include in what will be committed)
4.txt
nothing added to commit but untracked files present (use "git add" to track)
//modified:新文件,但未提交
//如果提交了的文件,且没有改动的,不会显示到这个里面
On branch master
nothing to commit, working tree clean
5.查看历史提交日志:git log
$ git log //查看历史记录
commit 8475ad1b33c337562ac0d4d3741783f7ed7c6cb2 (HEAD -> master)
Author: Anna <2237332028@qq.com>
Date: Sun Aug 29 19:18:41 2021 +0800
third change
commit 3729159fe0933644b137e1a4da8d4028e82b1d47
Author: Anna <2237332028@qq.com>
Date: Sun Aug 29 18:25:46 2021 +0800
second change
commit 757b589c005c0213b88be696a6408710e6b2b12c
Author: Anna <2237332028@qq.com>
Date: Sun Aug 29 17:54:35 2021 +0800
wrote a file
$ git log 加上 --pretty=oneline 参数
//简化信息
6.回滚代码仓库:git reset --hard
$ git log //查看历史记录
$ git reset --hard HEAD^ //把文件退回到上一个版本
$ git reset --hard HEAD~2//代表回滚master前两个版本
$ git reset --hard (commit id)//回滚到上一个版本后,最新的版本就会消失不见
7.修改缓存区内容:git add、git commit -m
$ git add 5.txt
然后我修改了5.txt中的内容
$ git add 5.txt
$ git commit -m "..."
当我们使用git add添加到缓存区的内容后,我们在修改这个文件时,它跟缓存区内容是没有任何关系的!我们使用git commit提交的时,它只会提交缓存区内容
如果想提交第二次修改,我们只需要在git add一次,然后在使用git commit提交就可以了,git会自动帮我们合并提交
8.将所有改动文件添加到缓存区:git add --all、git add .
git add --all这个命令会将当前目录下包括子目录下所有改动的文件提交到暂存区,注意只包括改动的文件,不改动的不会放到缓存区。这个命令还会把删除的文件也提交进去
git add .这个命令跟git add --all一样,但是不会记录删除操作
9.将文件撤销回到最近一次修改的状态:git checkout – file
撤销文件
(1) 没有 git add 之前
手动把文件恢复到上一个版本的状态。然后再用 git checkout – file 命令丢弃工作区的修改
$ git checkout -- 2.txt
(2) git add了,但没有git commit
$ git reset HEAD 2.txt
//reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,HEAD表示最新版本
$ git checkout -- 2.txt
10.删除文件:git rm
1.在版本库里删除文件:
$ git rm 2.txt
$ git commit -m "..."
2.在工作区删除文件
$ git checkout -- test.txt
//用版本库里的版本替换工作区的版本。
11.查看提交历史:git reflog
以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
分支命令
13.git创建分支:git branch、git checkout
git branch 如果后面跟着名字则会创建分支,但不会切换
git checkout 后面如果是分支名称则切换过去
连用:git checkout -b
然后把分支推送到github上 git push origin HEAD -u
14.git切换分支:git checkout 分支名
15.git合并分支:git merge
https://www.cnblogs.com/darrenji/p/5546904.html
git强制删除分支:git branch -d filename
16.在开发中git分支的重要性
当我们在开发中,无论做什么操作都建议使用分支,因为在团队开发中,master只有一个,合作开发里任何人都可以从master里拉取代码,拉取时master后创建分支,分支名改为你要做的操作,比如修改某某文件,修改什么什么bug,然后在提交一个版本
github的使用
与远程仓库相关的命令
1.将本地仓库关联到远程仓库
$ git remote add origin git@github.com:chuaaqi优快云/mygit.git
//gihub中的SSH
2. 远程提交 git push origin master
(注意第一次的时候在push后加上-u就可以了,因为我们本地其它可能有很多分支也提交上去,以后只提交最新代码就可以了git push origin master,不需要在提交其它分支)
*git push --rebase origin master
3.git将远程仓库关联到本地和拉取指定分支、切换远程分支:git clone +ssh
当我们远程有仓库时,想要关联到本地只需要使用git clone就可以了
新建一个空目录,不要git init
mkdir 文件名
使用git clone会自动帮我们初始化
我们可以使用git clone -b分支名 仓库地址来指定分支
4.github提交本地仓库到远程仓库:git add、git commit、git push
5.git查看仓库信息:git remote
git remote -v
6.git查看不同分支的文件差异:git diff
git diff master diff 5.txt
如果遇到无法删除的分支可以使用git branch -D 大写的D即可。
分支冲突处理
在本地仓库中git冲突与解决办法
在远程仓库中git冲突与解决办法
多人协作
在实际开发中的工作原则是这样的:
master是主分支(也可以理解为主线),为了让这条分支足够稳定,只在这个分支上进行新版本的发布或者项目的更新。
对于一个项目的所有操作,都创建一个develop分支,在这个分支上进行各个开发者代码的合并。
由于一个项目有可能是多个人协作实现的,因此会每个人创建一个自己的分支,然后每个人将自己的代码,从个人分支提交到develop分支做合并。
1.建立master以外的分支
$ git branch
$ git checkout -b dev
$ git push origin dev
2.在本地仓库新建分支,写好后合并到dev分支上
$ git checkout dev
$ git merge aBranch
如果git merge合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上--allow-unrelated-histories进行允许合并,即可解决问题
$ git push origin dev
如果两个人改了相同文件
开发A的操作
git add -u
git commit -m"开发A对mytest2文件进行了修改"
git push -u gitee_mygit1 master
开发B的操作
git add -u
git commit -m"开发B对mytest2文件进行了修改"
git push -u gitee_mygit2 master
解决:
1.git pull origin master
#拉取远端仓库master分支的文件
2.git branch -av
#查看本地分支情况
开发B将远程分支和本地master进行合并操作
3.git merge remotes/origin/master
//发现merge失败,因为远端仓库和开发B本地仓库的mytest2文件修改的位置相同,所以git无法进行判断,需要人为修改
4.git status
5.查看差异文件cat mytest2.txt
6.这时开发B和开发A商量后,修改了文件
7.开发B放置暂存区后commit提交
8.开发B将最新的提交历史push到远端仓库