注:使用git的过程中,验证过账号以后,win10 中的凭据管理器,会自动保存github账号密码,切换账号需要先删除原先的凭据。
基本概念:
工作区:
写代码的地方
暂存区:
.git/index 目录 / stage
本地代码先提交到暂存区(add),暂存区提交到本地库(commit),然后整个本地库提交到远程库(push)
本地库:
.git 目录
包含暂存区
指令:
linux 指令基础:
vim: 编辑
:wq 保存并退出编辑
ls: 列出当前目录文件
tail -n 3 index.txt: 只显示index.txt的最后三行
rm: 删除文件
rm -r: 删除文件夹
rm -fm:删除隐藏文件夹
ls -a :显示所有文件(包括隐藏文件)
ll: 罗列出当前文件或目录的详细信息 同 ls-l
touch: 创建新文件
mv: mv 目录名 新目录名 (改目录名字)
mv 文件名 目录名 (移动文件到目录)
初始化,生成本地库
git init
设置签名:区分不同开发人员的身份(签名与远程库账号的用户名密码没有任何关系)
指令:
git config user.name 名字
git config user.email 邮箱
用户级别优先级:
git config 项目级别 .git/config
git config --global 登陆当前操作系统的用户范围
必须有一个签名才能提交代码到远程库,否则不能提交
数据保存目录: .git/config
提交到暂存区:
git add good.txt
从暂存区撤回:
git rm --cached good.txt
提交到本地库:
git commit(新建文件,先add,添加追踪,以后,可以直接commit)
git commit -m “提交的版本信息” good.txt (不用进编辑器添加版本信息)
查看历史:
git log(详细)
git log --pretty=oneline(一行显示)
git log --oneline(一行显示)
git reflog (常用)
版本回退(本地):
基于索引值(推荐):
git reset --hard 索引哈希值 (直接到指定位置)
使用~符号:
只能往后不能往前 这里退三步
git reset --hard HEAD~3
使用^符号:
只能往后不能往前 ^ 往后一步,n个 ^ 退n步
git reset --hard HEAD^
版本回退(远程):
git checkout 版本索引
ex: git checkout 6bfc9134bf6faff5db5bbc3bd8c7ed3648b23ccf
reset命令的三个参数对比
soft:
仅仅在本地库移动HEAD指针:使得所有更改的文件都像git status所说的那样“要提交更改”。
ex: git reset --soft HEAD^
从版本库撤销一次提交,本地代码不变
mixed:
在本地库移动HEAD指针
重置暂存区:所有已提交的文件都要重新提交
--hard:(常用)
全部重置,三个区一致。删除当前版本所做的一切操作,回到当前版本的最初状态:
git reset --hard HEAD
作用:git add添加到暂存区的文件被删除后,通过重置的方式可以找回
删除的文件找回:
前提:本地库中的历史版本中有该文件
1、删除操作已提交到版本库:利用版本回退
2、删除操作未提交到版本库:利用HEAD重置找回
文件对比:
git diff [版本] 文件名
git diff index.txt: 直接跟暂存区中的文件比较
git diff HEAD~1 index.txt:比较上一个版本
不添加文件名: 比较多个文件的差异
分支概述:
版本库建立时自动创建主分支master
分支:在主分支的基础上独立开发新功能
不同的分支开发不同的功能
“多线程开发”
开发完成,则合并到主分支(大的版本升级)
如果合并到主分支出现bug,则新建一个分支hot_fix(修复),尽快修复bug然后合并
git branch -v: 查看所有分支
git branch hot_fix: 创建hot_fix分支
git checkout hot_fix: 切换到hot_fix分支
git push origin(地址) hot_fix(分支名)提交到新分支
合并分支:
1、将分支的修改提交到版本库
2、切换到接受合并的分支上(master)
3、执行merge命令: git merge hot_fix
解决冲突:
两个分支同样的地方,做了不同的修改
eg:两个分支的 index.txt 同一行 内容不同
1、 与成员商讨,删除其中一种修改后,把index.txt提交到版本库
2、 git add
3、 git commit -m “修改信息” (不需要文件名)
强制合并(放弃本地修改获取最新版本)
git fetch --all // 获取最新版本
git reset --hard origin/master 定位到最新版本
远程库操作:
1、小明创建一个本地库和一个远程库
2、小明将本地库文件push到远程库
3、小芳将小明的远程库clone下来变成本地库
4、小明邀请小芳加入团队,小芳有权限push代码
5、小芳push版本到小明的远程库
6、小明pull远程库的代码到本地
保存远程链接到本地
git remote add 链接简称 链接
删除已保存的远程地址
git remote rm 地址简称
查看本地保存的远程链接:
git remote -v (得到两个链接,fetch取回,push推送)
推送到远程库
git push 链接简称/链接 分支
推送冲突:远程库的a文件已经被小明推送,版本已经更新,则小丽不能再推送,
小丽必须先获取最新版本到本地,再推送。
跟本地解决冲突的原理一样。
不获取远程最新版本,强制推送本地代码覆盖远程库
git push -f ‘remote’ ‘branch’
克隆远程库
git clone 仓库地址
1、完整将远程文件复制到本地
2、在本地创建origin远程地址别名
3、初始化本地库 (.git)
分步合并远程库(适合谨慎修改):利用 fetch & merge
读远程库文件
git fetch origin 分支 (不会改变本地库文件,只把远程文件下载下来)
查看下载下来的远程文件:
git checkout ‘origin/master’ 进入下载下来的远程文件目录
在这里 cat 文件名 查看
合并远程库文件:
git merge origin/master
一步获取并合并(适合简单修改):
git pull origin master
获取远程指定分支
git clone -b <远程分支名> <远程仓库地址>
跨团队协作:
团队B向团队A fork 一份远程库(复制到B团队),
B团队修改,并推送到B的远程库,
B团队向A团队发起pull request 请求
A团队通过pull request 接收到B团队的推送
A团队合并推送
A团队把远程库修改拉取到本地。
git stash:
暂存本地修改,不会出现在commit记录中,用于紧急修改其它分支bug,由于修改过代码,切换分支会报错,要求先commit保存,因为不想commit当前代码修改进度留下黑历史,所以使用 stash 暂存代码
git stash save ‘备注’
git stash list: 列出所有stash记录
git stash clear: 清空所有 stash
git stash apply: 应用最近一次 stash
git stash apply stash@{1}: 应用第一条记录
git stash drop: 删除最近一次 stash
其它:
放弃本地修改,强制让远程库文件覆盖本地代码:
git fetch --all // 取回远程库文件
git reset --hard origin // 将版本号置到 origin 这个版本上
git pull origin master // 这时候拉取代码就不会报提示了
学习小记,不断记录中,,,。