Hasuer's Studio.

Git学习笔记

Word count: 2.1kReading time: 7 min
2021/07/07

Git命令行操作

本地库初始化

进入文件夹

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

设置签名

这里设置的签名和GitHub中的用户,密码没有关系。

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

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

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

仅仅加了一个 --global

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

项目级别的作用范围更小,类似于局部变量 > 全局变量。二者必须要有其一。

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

查看方式:cat .git/config

查看当前用户(global)配置 git config --global --list
查看当前仓库配置信息 git config --local --list

基本操作

状态查看

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

添加

1
2
3
4
git add fileName  #指定文件
git add . #所有
说明:将工作区的文件添加到暂存区
git rm --cached filename #将暂存区的文件撤销

提交

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

查看历史记录

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

前进后退

  • 基于索引值推荐

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

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

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

reset的三个参数比较

1
2
3
4
5
6
soft:   - 仅本地库移动HEAD 指针
mixed: - 在本地库移动HEAD指针
- 重置暂存区
hard: - 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区

删除文件并找回

  • 相当于建立一个快照,虽然删除了,但只要添加到暂存区,就能找回

    如果文件删除之后已经commit了,那么在log里就有有一条记录,这时,使用git reset --hard 指针位置来还原。

    如果删除文件之后只是add,没有commit,那么log中没有新的记录,使用git reset --hard HEAD来刷新工作区。

文件差异比较

1
2
3
git diff 文件名 #工作区文件和暂存区比较
git diff 哈希值 文件名 #工作区文件和本地库历史记录比较
git diff #不带文件名,则比较多个文件

分支管理

什么是分支管理

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

分支的好处

  • 同时并行推进多个功能开发,提高开发效率

  • 某一分支开发失败,不会对其它分支有任何影响

分支操作

  • 创建分支
1
git branch 分支名
  • 查看分支
1
2
git branch
git branch -v
  • 切换分支
1
2
git checkout 分支名
git checkout -b 分支名 #创建分支并直接切换到该分支
  • 合并分支相当于把修改了的文件拉过来

    • 第一步:切换到接收修改的分支名上

      git checkout [分支名]

    • 第二步:执行merge命令

      git merge [分支名]

  • 删除分支
1
git branch -d 分支名

解决冲突

  • 冲突的表现

  • 冲突的解决

    • 第一步:编辑,删除特殊标记<<< ===
    • 第二步:修改到满意位置,保存退出
    • 第三步:添加到缓存区 git add 文件名
    • 第四步:提交到本地库git commit -m '日志信息'
      • 注意:后面一定不能带文件名

Git 结合Github

创建远程库地址别名

1
2
3
4
git remote -v  #查看远程地址别名
git remote add 别名 远程地址
例子:git remote add origin https://xx
这里的 origin 是别名的意思

推送

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

1
2
3
git push 别名 分支名
git push -u 别名 分支名 #-u指定默认主机
例子:git push origin master

克隆

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

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

常见建立仓库方式

  1. 建立仓库 —> 打开空文件夹(还没有项目) —> 克隆下来
  2. 建立仓库 —> 打开项目文件夹(已经有项目)—> 初始化仓库 —> 设置remote仓库链接

拉取

pull = fetch + merge

把远程库中的内容拉取到本地库,但是在本地库没有 被更新,这个时候当前分支(本地库)是看不到变化的,只有进入origin/分支名才能看到变化。这个时候在本地的分支执行merge命令之后才能在本地的分支看到变化。

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

1
2
3
4
pull = fetch + merge	
git fetch [远程地址别名] [分支名]
git merge [远程地址别名] [分支名]
git pull [远程地址别名] [分支名]

解决冲突

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

  • 如果不是基于GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
  • 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。

rebase

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

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

beyond compare

用软件解决冲突

1
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提交

1
git tag -a v1.0 -m '版本介绍'   #创建本地tag信息git tag -d v1.0    		#删除taggit push origin --tags   #将本地tag信息推送到远程库git pull origin --tags    #拉取到本地git checkout v.10    #切换taggit clone -b v0.1 地址   #指定tag下载代码

SSH 免密登录

  • 进入当前的家目录

    1
    $ cd ~
  • 删除.ssh目录

    1
    $ rm -rvf .ssh
  • 运行命令生成SSH密钥目录

    1
    2
    3
    $ ssh-keygen -t rsa -C [Github邮箱]
    或者
    $ ssh-keygen (会让你设置SSH的登录密码,可以不输入,一直Enter)
  • 进入.ssh目录查看文件列表

    1
    2
    $ cd .ssh
    $ ls -la

  • 查看id_rsa.pub的内容

    1
    $ cat id_rsa.pub

  • 在GitHub上建立SSH Key, 把刚刚生成的ssh密钥填进去。

  • 保证本地库对应的远程库是SSH方式的。

    如果没有:

    1
    git add remote origin_ssh[(这是别名) [SSH地址]
  • 然后就可以愉快的push啦~~

    1
    2
    3
    git push [别名] [分支名]
    # 这里要注意,如果你在本地库只建立了一个远程地址,
    # 那么不用使用[别名]和[分支名]。如果有多个才要使用。

Git工作流

概念

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

分类

集中式工作流

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

GitFlow工作流 *

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

GitFlow 有独立的分支,让发布迭代过程更流畅。

Forking 工作流

在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。 安全可靠地管理大团队的开发者

CATALOG
  1. 1. Git命令行操作
    1. 1.1. 本地库初始化
    2. 1.2. 设置签名
    3. 1.3. 基本操作
      1. 1.3.1. 状态查看
      2. 1.3.2. 添加
      3. 1.3.3. 提交
      4. 1.3.4. 查看历史记录
      5. 1.3.5. 前进后退
      6. 1.3.6. reset的三个参数比较
      7. 1.3.7. 删除文件并找回
      8. 1.3.8. 文件差异比较
    4. 1.4. 分支管理
      1. 1.4.1. 什么是分支管理
      2. 1.4.2. 分支的好处
      3. 1.4.3. 分支操作
      4. 1.4.4. 解决冲突
  2. 2. Git 结合Github
    1. 2.1. 创建远程库地址别名
    2. 2.2. 推送
    3. 2.3. 克隆
    4. 2.4. 常见建立仓库方式
    5. 2.5. 拉取
    6. 2.6. 解决冲突
    7. 2.7. rebase
    8. 2.8. beyond compare
    9. 2.9. 跨团队合作
    10. 2.10. Tag标签
    11. 2.11. SSH 免密登录
  3. 3. Git工作流
    1. 3.1. 概念
    2. 3.2. 分类
      1. 3.2.1. 集中式工作流
      2. 3.2.2. GitFlow工作流 *
      3. 3.2.3. Forking 工作流