对于初学git工具的人来说,git纷繁的命令摸不着头脑,对于久经程序的人来说,git真香。
这里给大家从入门阶段开始介绍下git的原理以及应用。
原理
git
主要有几个存储代码的地方:
工作区:新建,修改我们的代码;
暂存区:—暂存已经修改的文件,最后统一提交到仓库中;
仓库 :最终存入代码的地方,同时与远程的github代码联通的地方;
对于代码如何从工作区到仓库,一般有以下步骤:
#工作区域提交到暂存区---:
git add 文件;
#git status可以查看当前的文件夹中的文件是在暂存区还是在仓库;
# 将工作区的文件转存至暂存区
git add hello.py
git add test.py
#将文件从暂存区提交到仓库中
git status #通过git status 查看状态
git commit -m "提交描述"
git status
对于整个自己的本地项目代码,从0开始存入仓库的步骤:
#初始化用户名和邮箱
#用户名
git config --global user.name "iterast"
#邮箱
git config --global user.email '1471080296@qq.com' # 该设置在github仓库主页显示谁提交了该文件;
##初始化一个新的git仓库
#1.创建文件夹
#2. 在文件内初始化git (创建git仓库 ) cd test --进入test 文件中
git init # .git用于存储仓库所有本地信息的
# 3. 创建文件 并将文件从本地提交到仓库中
touch hello.py #向仓库中添加文件;
git statue
git add #全部提交使用 git add .
git commit -m #修改文件:
#1. 修改文件;
git status #查看是否修改
#2. 将工作区域传到暂存区再到仓库
git add fiel.py git commit -m "tijiao"
#删除仓库文件
# 1. 从仓库中删除该文件
git rm h.py
#2. 再提交
git commit -m "第一次删除"
以上为git管理本地项目仓库的基本流程,而将本地仓库与github上仓库怎么进行同步呢,主要有以下几步:
# 将代码git上更新;-备份;实现代码的共享,完成多人操作
#将本地代码,传到远程仓库中 这是第三步
git push
# 将远程仓库,git对应的项目复制到本地;
git clone XXXX.git
#git init 只需要在新建文件夹时,第一次初始化就可以了;
git config --list #查看自己config的list
#对本地文件做修改;修改完后,add; commit提交;
git push #将本地仓库中的文件,push到远程仓库 中间要输入用户名和密码
以下为附件,是在其中操作的一些报错,没有可以跳过,看下一条。
"报错:fatal: unable to access 'https://github.com/qinweizhang-1/yolo-.git/': OpenSSL SSL_read: Connection was reset, errno 10054"
--→原因:找不到网址,
需要将.git/config的文件中的https://改成 http://
操作:vim .git/config a改下-- esc退出:wq!
"报错:没有权限时"
---→原因: 1.通过.git/config文件,remote 后面是“origin” url = https://github.com/用户名/仓库名.git
改成:url = https://用户名:密码@github.com/用户名/仓库名.git
远程过程中的分支的切换等操作:
git 创建个人分支、切换、和合并
# 创建分支:
git branch dev
#切换分支:
git checkout dev
# 两个操作合并在一起, 创建和切换
git checkout -b dev
# 合并,将之前的分支合并到总支上:首先将head切换到总支上,再将要合并的分支合并进来
git checkou master
git merge box
#合并完成后,再删除之前不需要的分支
git branch -d box
# 如果之前对同一个文件的同一个位置在两个不同分支上做了不同的操作处理,在合并时,merge将不知道如何处理,会暂停下来;等待你的处理, 可以使用git status查看各个文件的状态,是否已经合并;可以通过解决冲突,并通过git add命令来标记以及解决冲突的文件;
#或者通过 git mergetool 通过工具化的解决冲突。
综上,一个完整的git项目本地从0到远程github的整体流程如下:
"新建"
1. 从gitlab上建好program;
2. git clone进自己的本地仓库;
3. git init 初始化
4. 在本地项目中新建文件或者文件夹;
5. git add .
6. git commit -m "xxx"
7. git push # 第一次push时 需要网址, 并远程添加进去
# git remote add origin "远程仓库网址"
# 如果链接错误,则使用 git remote -v 查看远程分支;git remote rm origin 删除远程的网址,重新链接
#再push时git push -u origin dev 仍然报错,error: src refspec dev does not match any
#如果想push到远程的dev分支:则需要先对将本地git 切换到dev分支,切换完成后,再上传文件,再git push -u origin dev
# 如果push到master分支上,会报错被拒绝: ! [rejected] master -> master (fetch first)
#error: failed to push some refs to 'https://gitlab.ainnovation.com/huazhongtech/jiaxin-xiche.git'
# 原因是本地目录与远程目录不一致,不能对应,所以先要将代码进行合并:
git pull --rebase origin master
git push -u origin master
# git add jiaxin-xiche/111.txt fatal: Pathspec 'jiaxin-xiche/111.txt' is in submodule 'jiaxin-xiche'
需要先清除点.git里面的目录名,再重新加上: git rm -rf --cached jiaxin-xiche// git add jiaxin-xiche
#git上传上去的是带数字的空文件夹:因为该文件夹里面有git,会默认为是子模块,
#将.git删除:
cd 子文件夹
rm -rf .git
cd 主目录
git rm -r --cached .
git add .
git commit -m "init" #git push -u origin dev #
##新增远程分支: https://www.jianshu.com/p/a48745044bd4
git fetch 与git pull 的区别:
# 如果本地的master ID 为1, 远程master分支上有人更新了代码,ID为2 ,需要通过git fetch 将master分支上的代码copy下来,但是然后通过git merge去与本地代码合并,如果合并时更改的是同一处代码,则会产生冲突,需要解决后,再去处理;合并完生成一个ID3 git pull是将远程的master分支上的代码直接暴力下载下来,自动合并代码;将本地的ID换成ID2 所以git pull = git fetch +git merge (近似,根据ID变化,不是完全一样)
github
上几个概念:
仓库(repository):存放托管项目代码;
一个开源项目对应一个仓库,多个开源项目对应多个仓库;
收藏(star):收藏仓库,方便下次在个人中心上查找;
复制克隆项目(Fork):forked from 张三的仓库;同时fork的项目是独立存在的。
发起请求(Pull request): 在李四的仓库中更新的动作,发起给张三,等待张三查看;如果张三觉得不错,会合并到自己的仓库;
关注(watch):如果你watch了某个项目,当该项目有更新的时候,可以在你的GitHub上收到这个项目的通知提醒。
事务卡片(issue): 发现代码的bug,讨论的时候用;