git笔记

托管中心维护远程库

  • 内网:可以自己搭建一个GitLab服务器
  • 外网:可以使用码云、Github

版本控制工具

  • 集中式:CSV ,SVN,VSS
  • 分布式Git,Darcs,…

1 基本概念

工作区和暂存区

  • 工作区(Working Directory)
    电脑中的目录,比如我们的git_test,就是一个工作区。
  • 版本库(Repository)
    工作区有一个隐藏目录.git,这个不是工作区,而是git的版本库。
    git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
    因为我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
    你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
    在这里插入图片描述第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

2 设置签名

  • 项目(仓库)级别仅在当前本地库有效

    git config user.name tom  #设置用户名tom
    git config user.email liu@qq.com #设置用户邮箱
    
  • 系统用户级别仅在当前登录的操作系统用户有效

    git config --global user.name tom
    git config --global user.email liu@qq.com
    

仅仅加了一个 --global

优先级别:项目级别 > 系统级别

信息保存位置:~/.gitconfig 文件

3 基本操作

git init
注意:生成的 .git 目录中存放的是本地库相关文件,不要删除

状态查看

git status   #查看工作区、暂存区状态

文件过滤、文件忽略

先创建一个.gitignore文件。

*.[oa] : 忽略所有以 .o 或 .a 结尾的文件

!lib.a : 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件

*~ : 忽略所有名字以波浪符(~)结尾的文件

/TODO : 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO

build/ : 忽略任何目录下名为 build 的文件夹

doc/*.txt : 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt

doc/星星/星.pdf : 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
如果已经提交过的文件或者文件夹怎么办? 此时更改.gitignore文件对已经提交的文件是无效
的。

  1. 首先,编辑.gitignore文件。

  2. 然后如果是单个文件,可以使用如下命令从仓库中删除:
    git rm --cached logs/xx.log
    如果是整个目录:
    git rm --cached -r logs
    如果文件很多,那么直接
    git rm --cached -r .
    如果提示某个文件无法忽略,可以添加-f参数强制忽略。
    git rm -f --cached logs/xx.log

  3. 然后
    git add .
    git commit -m “Update .gitignore”

  4. 把被忽略的某个文件强制添加回去:
    git add -f filename

  5. ignore规则检查:
    git check-ignore

添加文件

git add fileName  #指定文件
git add . #所有
说明:将工作区的文件添加到暂存区

撤销修改(删除文件也算修改)

  • 只在工作区进行修改,未提交到暂存区和本地版本库
    我们可以使用 git checkout – <文件> 来丢弃工作区的改动。执行如下命令,发现工作区干净了,第二次的改动内容也没了。
  • 提交到了暂存区,未提交到版本库
    git reset HEAD <文件> 以取消暂存,然后使用git checkout – <文件> 来丢弃工作区的改动。

提交

git commit -m 'commit message' fileName
说明:将暂存区内容提交到本地库

查看历史记录

git log 
git reflog  #常用
git log --greph #图形显示,更直观
git log --pretty=oneline #漂亮一行显示
git log --oneline #简洁显示
说明:HEAD@{移动到当前版本需要多少步}

版本回退

  • 基于索引值推荐

    git reset --hard 指针位置
    例子:git reset --hard a6ace91 #回到这个状态
    
  • 使用 ^ 符号只能后退

    git reset --hard HEAD^
    例子:git reset --hard HEAD^^
    注意:几个 ^ 表示后退几步
    
  • 使用 ~ 符号只能后退

    git reset --hard HEAD~n
    例子:git reset --hard HEAD~3
    

reset的三个参数比较

soft: 
  - 仅本地库移动HEAD 指针
mixed:
  - 在本地库移动HEAD指针
  - 重置暂存区
hard:
  - 在本地库移动HEAD指针
  - 重置暂存区
  - 重置工作区

删除文件并找回

  • 相当于建立一个快照,虽然删除了,但只要添加到暂存区,就能找回
git reset --hard 指针位置

文件差异比较

  • 对比工作区和某个版本中文件的不同
    git diff HEAD – 文件名
    在这里插入图片描述
  • 对比本地版本库中两个版本文件的不同
    git diff HEAD HEAD^ – 文件名
    git diff #不带文件名,则比较多个文件

4 分支管理

hot_fix master feature_x feature_y

什么是分支管理

  • 在版本控制中,使用推进多个任务

分支的好处

  • 同时并行推进多个功能开发,提高开发效率
  • 某一分支开发失败,不会对其它分支有任何影响

分支操作

  • 创建分支
git branch 分支名
  • 创建并切换分支 dev
git checkout -b dev
  • 查看分支
git branch
git branch -v 
  • 切换分支
git checkout 分支名
git checkout -b 分支名   #创建分支并直接切换到该分支
  • 合并分支相当于把修改了的文件拉过来
git merge xxx
git merge --no-ff -m "提交说明"   禁用快速合并,使用递归合并策略
注意:合并分支的时候要明确谁谁合并
	我在a分支里面修改了。要合并到master,就先切换到master,然后合并b
合并分支可能会出现的三种情况:
1.  当两个分支同时修改了一个文件,进行合并时会提示需要有冲突解决;
2.  当另一个分支在当前分支的后面又做了一些操作,而当前分支无进行任何操作,合并时会默认使用快速合并,快速合并时会遗漏一次提交信息,进行bug分支修复时应当禁用快速合并(详见下面bug分支笔记)。
3. 当另一个分支新加入一个文件,而当前分支修改另一个文件,合并时不会有冲突,系统会自动帮你进行一次新的提交,但需要输入一些提交信息,见下图。

在这里插入图片描述

修复bug分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
(1)当你接到一个修复一个代号001的bug的任务时,很自然地,你想创建一个分支bug-001来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
在这里插入图片描述并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
(2)git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
在这里插入图片描述(3)首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
在这里插入图片描述

(4)现在修复bug,把 the new line删掉,然后提交。
在这里插入图片描述

(5)修复完成后,切换到master分支,并完成合并,最后删除bug-001分支。
在这里插入图片描述

(6)现在bug-001修复完成,是时候接着回到dev分支干活了!
在这里插入图片描述

(7)工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
在这里插入图片描述

作现场还在,git把stash内容存在某个地方了,但是需要恢复一下.
在这里插入图片描述

小结:
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,恢复工作现场。

  • 删除分支
git branch -d 分支名
  • 把本地分支推送到远程新建分支
    $ git push origin dbg_lichen_star:dbg_lichen_star 前面dbg_lichen_star为本地分支名字,后一个为远程新建的分支

  • 删除远程分支
    git push origin --delete develop_rzq 删除 git自己远程的分支

  • 关联远程分支
    git branch --set-upstream-to=origin/develop_rzq 将分支和远程的分支进行关联,git push 就不用加具体的分支名字了

解决冲突

  • 冲突的表现
  • 冲突的解决
    • 第一步:编辑,删除特殊标记<<< ===
    • 第二步:修改到满意位置,保存退出
    • 第三步:添加到缓存区 git add 文件名
    • 第四步:提交到本地库git commit -m '日志信息' 注意:后面一定不能带文件名
  • 查看冲突解决情况
    git log --graph --pretty=oneline

5 Git 结合Github

别分手 别名 分支名

创建远程库地址别名

git remote -v  #查看远程地址别名
git remote add 别名 远程地址 
例子:git remote add origin https://xx

上传提交分支(push)

  • 项目克隆到本地之后,执行如下命令创建分支smart.
    在这里插入图片描述

开发修改完把本地库的文件推送到远程仓库 前提是提交到了本地库才可以推送

git push 别名 分支名
git push -u 别名 分支名    #-u指定默认主机
例子:git push origin master
  • 提交分支到另外一个仓库
  1. git remote add 仓库别名(可以自己取一个) https://gitee.com/*****/test_b.git 添加另外一个仓库的地址
  2. 推送前需要pull该仓库(出现问题见笔记中pull的操作)
  3. 推送到该仓库
  • 推送本地分支到远程并新建一个分支
    $ git push origin 本地分支名字:远程分支名字(可以随便起名字)

将本地分支跟踪服务器分支

git branch --set-upstream-to=origin/远程分支名称 本地分支名称
例:
git branch --set-upstream-to=origin/smart smart
在这里插入图片描述

克隆

完整的把远程库克隆到本地 克隆下来后不要在主分支里面做开发 clone进行一次,从无到有的过程,更新用pull

git clone  远程地址
例子:git clone https://xx

拉取 git pull

本地存在clone下来的文件 就用pull更新

pull = fetch + merge
	git fetch 别名 分支名
	git merge 别名 分支名
git pull 别名 分支名
使用上述命令会把远程分支上的代码下载并合并到本地所在分支。
  • git配置过程中fatal:拒绝合并无关的历史
    首先将远程仓库和本地仓库关联起来:
    git branch --set-upstream-to=origin/master master
    然后使用git pull整合远程仓库和本地仓库,
    git pull --allow-unrelated-histories (忽略版本不同造成的影响)

解决冲突

注意:解决冲突后的提交是不能带文件名的

如果不是基于远程库最新版做的修改不能推送,必须先pull下来安装冲突办法解决

rebase

提交记录简洁不分叉 没学懂,感觉有点鸡肋 混眼熟

git rebase -i 索引号
git rebase -i HEAD~3  #合并最近三条记录
说明:在vim编辑里面改成s

beyond compare

用软件解决冲突

1.安装 :
   beyond compare 
2.配置:
   git config --local merge.tool bc3  #合并名称
   git config --local mergetool.path '/usr/local/bin/bcomp' #软件路径
   git config --local mergetool.keepBackup false  #False不用保存备份
3.应用:
   git mergetool
说明:--local指只在当前操作系统有效

跨团队合作

代码review之后合并

  • 适用于个人

    邀请成员:Settings --> Collaborators -->填写用户名 -->打开链接接受邀请

  • 企业 创建一个组织 方便管理

  • review

    组织做review 通过Pull request

  • 给开源社区共享代码

    点击别人仓库的fork 到自己的仓库 – > 然后clone下来 修改后推送到远程库 --> 点击Pull Request请求 --> Create pull request发消息

Tag标签

为了清晰的版本管理,公司一般不会直接使用commit提交

git tag -a v1.0 -m '版本介绍'   #创建本地tag信息
git tag -d v1.0    		#删除tag
git push origin --tags   #将本地tag信息推送到远程库
git pull origin --tags    #拉取到本地

git checkout v.10    #切换tag
git clone -b v0.1 地址   #指定tag下载代码

SSH 免密登录

  • 输入:ssh-keygen -t rsa -C GitHub邮箱地址
  • 进入.ssh目录,复制id_rsa.pub文件内容
  • 登录GitHub。Settings --> SSH and GPG keys --> New SSH Key
  • 回到git通过ssh地址创建。git remote add 别名 SSH地址

6 Git工作流

概念

在项目开发过程中使用Git的方式

分类

集中式工作流
像SVN一样,集中式工作流有一个中央仓库,所有的修改都提交到了Master分支上
GitFlow工作流 *

主干分支master 开发分支develop 修复分支hotfix 预发布分支release 功能分支feature

GitFlow 有独立的分支,让发布迭代过程更流畅。
Forking 工作流
在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。 
安全可靠地管理大团队的开发者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值