git入门教程+常用命令

Git入门教程

本文章主要参照视频教程:https://www.bilibili.com/video/BV1FE411P7B3/?spm_id_from=333.337.search-card.all.click&vd_source=06caf161b187fb3f4c039bc15e238fea

为什么要使用GIT

版本控制是项目、文档迭代的必然要求,所以需要使用git来进行版本控制
git入门教程+常用命令_第1张图片

本地版本控制

git入门教程+常用命令_第2张图片
记录文件更新,对不同版本文件做一个快照或是记录补丁,适合个人使用,例如RCS
git入门教程+常用命令_第3张图片

集中版本控制

所有版本数据放在服务器上(CS架构),每个开发者从服务器上拉取最新版本或上传自己的修改
git入门教程+常用命令_第4张图片
特点:

  1. 所有数据保存在单一的服务器上,容易受到服务器损坏影响
  2. 用户本地只有自己之前同步的版本,不联网看不到历史版本
  3. 代表性产品:SVN

分布式版本控制

特点:

  1. 所有版本信息仓库全部同步到每个用户本地
  2. 可以本地查看所有历史版本,可以离线本地提交
  3. 需要在联网时push到相应的服务器或其它用户处
  4. 增加了本地存储空间的占用
  5. 有保密安全隐患
  6. 代表性产品:Git
    git入门教程+常用命令_第5张图片

SVN与Git

  1. SVN是集中式版本控制系统,Git是分布式版本控制系统
  2. 所以SVN的所有历史版本都在一个服务器上,而Git所有用户都有完整的历史记录
  3. SVN需要拉取远程版本,完成工作后上传到远程
  4. Git在工作时不需要联网,联网协同时进行code review即可

安装Git及环境配置

git入门教程+常用命令_第6张图片

官网下载地址: https://git-scm.com/

淘宝镜像地址:https://registry.npmmirror.com/binary.html?path=git-for-windows/

点击下载链接之后,将会跳到Downloading Git,根据自己电脑系统选择不同的位数进行下载,这里有两个版本区别如下:
Standalone Installer:安装版,安装完之后会自动在鼠标右键时显示 Git GUI Here 和 Git Bash Here (推荐)
Portable (“thumbdrive edition”):绿色版,解压就能运行,免安装,不过绿色版不会在鼠标右键时显示 Git GUI Here 和 Git Bash Here

剩余设置查看:https://blog.51cto.com/u_15756445/5592505
安装完成后在任意文件夹位置点击鼠标右键即可出现:
在这里插入图片描述

Git Bash:Unix与Linux风格的命令行,推荐

Git GUI :图形界面的Git 建议少使用 多熟悉命令行

后面都是直接用cmd了

Linux基本命令

cd xxx cd到某个目录
cd … 回退到上一个目录
cd 回到根目录
pwd 显示当前路径
ls 显示当前目录文件
ll 显示当前目录文件(详细)
touch xx.xx 新建文件
rm xx.xx 删除文件
mkdir 新建文件夹
rm -r xxx 删除xxx文件夹
mv xxx.xx src xx 将xxx文件移动到xx目录下
clear 清屏
reset 重新加载终端
history 查看命令历史
help 帮助
exit 退出

Git的必要配置

查看配置

git config -l 当前的配置清单
git入门教程+常用命令_第7张图片

git config - -system -l 查看系统配置
git入门教程+常用命令_第8张图片

git config - -global -l 查看当前用户本地全局配置 (需要在git 文件夹里)

在这里插入图片描述
git入门教程+常用命令_第9张图片
这些配置文件都保存在本地:

  1. Git\etc\gitconfig或Git\mingw64\etc\gitconfig Git安装目录下 是system系统配置
  2. C:\Users\微软账户.gitconfig或C:\Users\Administrator.gitconfig 适用于当前登录用户的配置 是global用户全局配置

都可以直接编辑

推荐使用everything来查找电脑文件 如下图

git入门教程+常用命令_第10张图片

配置用户及邮箱(必要)

git config - -global user.name “xxx”

git config - -global user.email xxx

Git工作原理

Git工作区域

Git本地有三个区域——工作目录(Working Directory)、暂存目录(Stage(Index))、资源库(Reposit或Git Directory)

远程有一个区域——git仓库(Remote Directory)

git入门教程+常用命令_第11张图片

  • 工作目录(Working Directory)、工作区(Workspace):平时存放项目代码的地方
  • Index/Stage:暂存区 临时存放修改
  • Repository:仓库区,是安全存放数据的位置,HEAD会指向最后存入仓库的版本
  • Remote:远程仓库,托管代码的服务器

工作目录构成:

  • Directory:使用Git管理的目录,也是一个仓库 包含我们的工作空间和Git的管理文件
  • Workspace:需要通过git管理版本的目录和文件
  • .git:存放Git管理信息的目录,初始化仓库时自动创建
  • Index/Stage:待提交区,在提交给repo之前所有的更新都在暂存区
  • Local Repo:本地仓库,存放在本地的版本库,HEAD是当前的开发分支

工作区存放文件 .git(隐藏文件夹)
git入门教程+常用命令_第12张图片
git入门教程+常用命令_第13张图片

打开.git文件夹可以看到HEAD 和Index

git入门教程+常用命令_第14张图片

其中HEAD文件夹打开后是对最新的项目版本的引用

git入门教程+常用命令_第15张图片

Git工作流程

  1. 在工作目录添加、修改文件
  2. 将需要版本管理的文件放入暂存区域(git add)
  3. 将暂存区域的文件提交到git仓库(git commit)

文件状态有三种:已修改(modified)、已暂存(staged)、已提交(committed )

Git实践

Git项目搭建

常用指令

git入门教程+常用命令_第16张图片
常用六大指令如图

  1. 所有修改不一定全部都要提交,只选需要提交的(add)
  2. 提交(commit)
  3. 本地同步远程(push)
  4. 远程克隆本地(clone)
  5. 本地切换工作区(checkout)
  6. 远程直接同步工作区(pull)

本地仓库搭建

  1. 打开文件夹,右键 git bash here
  2. 初始化仓库
    1. git init 初始化仓库 生成.git文件夹
    2. git clone link 克隆远程仓库
      git入门教程+常用命令_第17张图片

文件状态转换

文件的4种状态转换如下流程图:
git入门教程+常用命令_第18张图片

文件状态转换实践

git status 查看所有文件状态 此时会显示当前目录下所有文件的状态

git status 文件名 查看指定文件状态

新创建的文件将会被分类为Untracked files
git入门教程+常用命令_第19张图片

git add . 添加所有文件到暂存区

git add 文件名 添加指定文件到暂存区

添加之后文件变为staged
git入门教程+常用命令_第20张图片

git commit -m “提交备注” 提交文件到本地仓库

git commit -m "commit message"

此时如果是从远程仓库克隆的,就会提示可以push到远程仓库
git入门教程+常用命令_第21张图片

git push 指令将本地仓库与远程仓库同步

git push origin branch-name

origin是远程仓库的名称,branch-name是要推送到的远程分支的名称
git入门教程+常用命令_第22张图片

忽略文件

对于一些不需要进行版本控制的文件可以进行忽略

在主目录下创建.gitignore文件,此文件有以下示例:

  1. 忽略空行和#开头的内容
  2. *.txt 忽略所有以txt结尾的文件
  3. !lib.txt 但lib.txt除外
  4. /temp 忽略目录下除了temp之外的文件夹
  5. build/ 忽略build目录下的所有文件
  6. doc/*.txt 忽略形如doc/notes.txt 但不包括doc/server/arch.txt

码云Gitee使用

码云注册

SSH公钥

  1. 进入C:\Users\微软用户名.ssh文件夹
  2. 右键此文件夹进入git bash
  3. 键入 ssh-keygen -t rsa (这里rsa是加密算法)
  4. 回车到生成完成
    在这里插入图片描述

这里id_rsa 是私钥 .pub是公钥

打开.pub文件,复制内容并粘贴到码云的公钥一栏

打开码云-头像-个人主页-SSH公钥

git入门教程+常用命令_第23张图片

输入公钥并添加即可

git入门教程+常用命令_第24张图片

新建仓库

git入门教程+常用命令_第25张图片

也可以右上角导入GitHub的仓库
git入门教程+常用命令_第26张图片

找到供克隆的链接 clone到本地即可
git入门教程+常用命令_第27张图片

IDE集成Git的使用

Jetbrain IDEA: https://www.bilibili.com/video/BV1FE411P7B3?p=12&vd_source=06caf161b187fb3f4c039bc15e238fea

VSCode:https://code.visualstudio.com/docs/sourcecontrol/overview

git入门教程+常用命令_第28张图片

打开非git管理的文件夹:
git入门教程+常用命令_第29张图片
git入门教程+常用命令_第30张图片
git入门教程+常用命令_第31张图片
git入门教程+常用命令_第32张图片
git入门教程+常用命令_第33张图片
git入门教程+常用命令_第34张图片
git入门教程+常用命令_第35张图片
git入门教程+常用命令_第36张图片

ctrl shift + p 输入clone可以克隆远程仓库

Git分支

Git控制下的项目往往会有许多不同的分支。代表主干、开发、新特性等等的分支
git入门教程+常用命令_第37张图片

分支常用指令

git branch # 列出所有本地分支

git branch -r # 列出所有远程分支

git branch branchname  #新建一个分支,但依然停留在当前分支

git branch -b branchname #新建一个分支并且换到该分支

git merge branchname #合并指定分支到当前分支

git branch -d branchname #删除分支

git push origin --delete branchname # 删除远程分支
git branch -dr branchname #删除远程分支

分支合并时可能会产生冲突,需要修改冲突

一般分支标准

master/main分支作为主分支,应该用来发布新版本,需要特别稳定,一般情况下不允许在上面工作,工作一般是在dev分支上,dev代码分支稳定后合并到主分支上来。

进阶资源

Git大全:https://gitee.com/all-about-git

学习Git分支:https://oschina.gitee.io/learn-git-branching/

官方Git book:https://git-scm.com/book/en/v2

Git常用命令

仓库

# 在当前目录新建一个Git代码库
$ git init

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

# 下载一个项目和它的整个代码历史
$ git clone [url]

配置

# 显示当前的Git配置
$ git config --list

# 编辑Git配置文件
$ git config -e [--global]

# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

增加/删除文件

# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

代码提交

# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

分支

# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

# 分支更名(不在要更名的分支上)
git branch -m 旧分支名 新分支名

标签

# 列出所有tag
$ git tag

# 新建一个tag在当前commit
$ git tag [tag]

# 新建一个tag在指定commit
$ git tag [tag] [commit]

# 删除本地tag
$ git tag -d [tag]

# 删除远程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

查看信息

# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

# 显示当前分支的最近几次提交
$ git reflog

远程同步

# 下载远程仓库的所有变动
$ git fetch [remote]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [remote]

# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库
$ git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

# 推送所有分支到远程仓库
$ git push [remote] --all

# 删除远程仓库
git remote rm [name]

# 更改远程仓库地址
git remote set-url origin [url]

撤销

# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

#暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

# 移除缓存
git rm -r --cached .

# 撤销commit
git reset HEAD^

其他

# 生成一个可供发布的压缩包
$ git archive

以上常用命令来自阮一峰老师的博客文章《常用 Git 命令清单》感谢阮老师!

实践常用命令

# 重命名文件
mv nameA(.xx) nameB(.xx)

# 移动文件
mv fileA dirA

  1. 无法链接Github

    git入门教程+常用命令_第38张图片

    我这里的命令是git config --global http.proxy http://127.0.0.1:7890

  2. 文件超大小:this exceeds GitHub’s file size limit of 100.00 MB【本部分未完全解决】
    在这里插入图片描述

安装git lfs:

安装 Git Large File Storage - GitHub 文档

使用git lfs:

  • 使用 git lfs track 命令进行大文件追踪 例如git lfs track "*.png" 追踪所有后缀为png的文件
  • 使用 git lfs track 查看现有的文件追踪模式
  • 提交代码需要将gitattributes文件提交至仓库. 它保存了文件的追踪记录
  • 提交后运行git lfs ls-files 可以显示当前跟踪的文件列表
  • 将代码 push 到远程仓库后,LFS 跟踪的文件会以『Git LFS』的形式显示:
  • clone 时 使用’git clone’ 或 git lfs clone均可

配置 Git Large File Storage - GitHub 文档

  1. Github不同步contribution

解决:查看本地git的邮箱在不在github的设置里面

  1. 清除commit记录

BFG Repo-Cleaner

BFG Repo-Cleaner 的使用

git bfg 的使用(删除提交记录中的敏感信息,删除文件等)_Grassto的博客-CSDN博客

或者直接删掉.git和.gitignore文件重新初始化git

你可能感兴趣的:(C++,git,c++,linux)