git的使用
git和github 的区别
- Git 是一种方法。而 GitHub 只是使用这种方法的一个代码仓库,就是git是操作的,GitHub是个网址
初始化git仓储
新建一个项目project,点进目录右击选择git bash
git init # 初始化仓库,这个git对我们项目的代码进行备份
配置用户名和邮箱
git config --global user.name "xiaoming" # 用户名
git config --global user.email "xx@sina.cozcm" # 邮箱
git config user.email "zc@qq.com"
git config user.name "zc"
不加global是局部的
把代码存储到 git 仓储中
-
分两步走:
-
把代码放到
.git
隐藏目录的大门(暂存区)git add ./readme.md # ./readme.md 文件路径要说明
-
把门口的代码放入房间里面
git commit -m "这是对这次添加东西的说明"
-
区域划分:
- 工作区:就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- 暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master。
查询当前所处的工作状态:git status
On branch master
nothing to commit, working tree clean
# 我们提交完了,当前的工作区是干净的
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
# 把文件放在了暂存区
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
# 我们的文件修改了,但是没有放到暂存区(大门口)
如果我们修改了两个文件是不是要add两次命令呢,不需要
git add ./ # 当前目录只要是修改过的文件都放到暂存区
一次性把我们修改的代码放到房子里面去
git commit --all -m "一些说明"
查看日志
git log # 查看历史提交的日志
git log --oneline # 简洁版的日志
git 版本回退
先用日志功能查看我们修改过的功能,在选择回退的版本
修改过后的版本日志
$ git log --oneline
489310a (HEAD -> master) 添加了js和一个功能
01ebf78 我们完成四个功能
20e8c3c 我们完成三个功能
bc9c3b5 这次加了一个功能
6dad8ac 这是我的开始
git reset --hard Head~1 # 1 表示退回到上上次代码提交的状态
# 0 表示上一次
退回后的版本
01ebf78 (HEAD -> master) 我们完成四个功能
20e8c3c 我们完成三个功能
bc9c3b5 这次加了一个功能
6dad8ac 这是我的开始
通过版本号回退
查看日志
$ git log --oneline
489310a (HEAD -> master) 添加了js和一个功能
01ebf78 我们完成四个功能 # 01ebf78版本号
20e8c3c 我们完成三个功能 # 20e8c3c版本号
bc9c3b5 这次加了一个功能
6dad8ac 这是我的开始
git -reset --hard 01ebf78 # 精确的回退到某一次的提交状态
01ebf78 (HEAD -> master) 我们完成四个功能
20e8c3c 我们完成三个功能
bc9c3b5 这次加了一个功能
6dad8ac 这是我的开始
假如说我们退回之后又后悔之前的操作咋办呢?
git -reset --hard 01ebf78 # 精确的回退到某一次的提交状态
但是如果我们把窗口关掉了,记不住版本号,又想回到以前的状态咋办呢
git reflog # 可以看到每一次切换的版本的记录,可以看到所有提交的版本号
01ebf78 (HEAD -> master) HEAD@{0}: reset: moving to Head~1
489310a HEAD@{1}: commit: 添加了js和一个功能
01ebf78 (HEAD -> master) HEAD@{2}: commit: 我们完成四个功能
20e8c3c HEAD@{3}: commit: 我们完成三个功能
bc9c3b5 HEAD@{4}: commit: 这次加了一个功能
6dad8ac HEAD@{5}: commit (initial): 这是我的开始
忽略文件
-空文件夹不被管理
-指定某些文件或者文件夹不被git管理
-在项目根路径,跟.git文件夹一个路径,新建.gitignore.,在里面配置
- 语法:
# 号是注释,没有用
文件夹名字,表示文件夹忽略,不被管理
/dist 表示根路径下的dist文件夹,不被管理
*.py 表示后缀名为py的文件,都被忽略
*.log*
分支管理
主分支:默认的是master
创建分支:
git branch dev # 创建了一个dev分支 创建dev分支里面的东西和master分支的东西是一样的
切换分支:
git checkout dev # 切换到指定分支
查看分支:
git branch
"""
$ git branch
dec
dev
* master # 当前所在分支
"""
合并分支:
git merge dev # 指定分支的名称
比如我们我们创建分支,在分支里面已经完成了我们的功能五,但是当我们去切换到master的时候我们忘记在分支里面添加了功能五,又在master里完成了功能五,当我们去合并的时候会出现
$ git merge dev
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.
合并的时候如果有冲突,需要手动去处理,如何去处理呢,那就是要到你完成的功能里面去选择,处理完后还需要再提交一次。
远程仓库
提交代码到GitHub(当作git的服务器)
git push [地址] master #
拿到远程的代码
首先要建立一个新的仓储
git push https://github.com/zc117809/test112.git master
克隆
要先建立一个文件,在文件里打开git bash输入
git clone https://github.com/zc117809/test112.git
多次执行会覆盖本地的内容
ssh 方式上传代码
有公钥和私钥,这两个是有关联的
-
生成公钥和私钥
ssh -kegen -t rsa -c "邮箱"
多人协作
小明和小红现在同时写作开发,小红在服务器上pull到小明的数据,pull完之后,小红在html文件上做了一个功能,备份到本地,这个时候小明又更新了版本,小红又去pull这个时候会出现冲突,小红新添加的功能会和小明更新的版本上出现错乱。
总结:
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。 - 解决完之后还要上传到服务器push
当我们push时,加上-u参数,在下一次push时我们只需要写上git push
就能上传我们的代码(加上-u之后,git拉取当前我们分支与远程指定的分支进行关联,git push origin master