git常用操作以及码云Gitee连接git

1 git简介

每次提交代码都是提交到本地仓库,我们现在将本地仓库的代码推送至远程仓库,供所有人下载
远程仓库:一个远程仓库对应一个本地仓库,不会混乱

1.1 Git四大工作区域

先学习下Git的几个工作区域:
在这里插入图片描述

  • Workspace:电脑本地看到的文件和目录,在Git的版本控制下,构成了工作区
  • Index/Stage:暂存区,一般存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行git add,这些改动就添加到这个区域
  • Repository:本地仓库,当执行git clone 地址,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中HEAD指向最新放入仓库的版本。当执行git commit,文件改动就到本地仓库来了
    或者在计算机中使用 Git 初始化一个仓库时,Git 会在当前目录下创建一个名为.git 的隐藏文件夹来存储仓库的所有相关信息。这个.git文件夹包含了版本历史、分支、标签、配置等信息,是 Git 本地仓库的核心部分
  • Remote:远程仓库,就是类似github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库

1.2 Git工作流程

详情图
在这里插入图片描述
原理图:
在这里插入图片描述
git 的正向工作流程一般就这样:

  • 从远程仓库拉取文件代码回来;
  • 在工作目录,增删改查文件;
  • 把改动的文件放入暂存区;
  • 将暂存区的文件提交本地仓库;
  • 将本地仓库的文件推送到远程仓库;

1.3 Git文件四种状态

根据一个文件是否已加入版本控制,可以把文件状态分为:Tracked(已跟踪)和Untracked(未跟踪),而tracked(已跟踪)又包括三种工作状态:UnmodifiedModifiedStaged
在这里插入图片描述

  • Untracked: 文件还没有加入到git库,还没参与版本控制,即未跟踪状态。这时候的文件,通过git add 状态,可以变为Staged状态
  • Unmodified:文件已经加入git库, 但是还没修改, 就是说版本库中的文件快照内容与文件夹中还完全一致。Unmodified的文件如果被修改, 就会变为Modified,如果使用git remove移出版本库, 则成为Untracked文件。
  • Modified:文件被修改了,就进入modified状态啦,文件这个状态通过stage命令可以进入staged状态
  • staged:暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodified状态.

2 和gitee连接

2.1 创建git仓库

在需要和远端交互的总文件夹内创建git仓库,右键单击->选择Git Bash Here
git init:创建git仓库,这会在项目根目录下生成一个隐藏的名为.git的文件夹,这个文件夹存放的就是git仓库

2.2 通过ssh公钥连接

通过ssh公钥连接就需要ssh的连接地址,比如:git@gitee.com:xxxx/git-test.git

2.2.1 获取公钥

ssh-keygen:创建SSH密钥,在用户根目录下创建一个.ssh文件夹, 里面包含了id_rsaid_rsa.pub两个文件。 前者是私钥, 后者是公钥。秘钥不能泄露出去, 而公钥要设置在gitee相应位置

2.2.2 gitee免密码登录

点击头像--设置---ssh公钥---填写内容---确定
在这里插入图片描述

2.2.3 配置本地仓库连接远程仓库

git remote add test git@gitee.com:xx/xx.git:会关联git@gitee.com:xx/xx.git所对应的远程仓库。test是设置的关联名字,可以随便起, 以后通过它向远程仓库提交程序

2.3 通过https连接

通过https连接就需要https的连接地址,比如:https://gitee.com/xxxx/git-test.git
此时就不需要ssh生成公钥,也不用在gitee上配置ssh公钥

git remote add test https://gitee.com/xxxx/git-test.git:用来和远端仓库进行关联,在拉取或者推送时只用输入账号或者密码就可以了

3 git常用命令

专用名词:

  • master: 默认开发分支
  • origin: 默认远程版本库
  • Index / Stage:暂存区
  • Workspace:工作区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

这个图只是模拟一下git基本命令使用的大概流程
在这里插入图片描述

3.1 新建初始配置类

3.1.1 初始化命令

git init:在当前目录新建一个代码仓库
git init [project-name]:新建一个目录,把它初始化为git代码仓库

3.1.2 拉取命令

git clone [url]:下载一个项目和它整个代码的历史,即从远程把仓库复制一份到本地,克隆后会创建一个新的本地仓库
git checkout -b dev: 创建开发分支dev,并切换到该分支下,-b 选项表示创建一个新的分支。具体来说是:切换到名为 dev 的分支,如果 dev 分支不存在,则创建一个名为 dev 的新分支

3.1.3 配置类命令

git config --list:查看git配置
git config -e [--global]:编辑git配置文件
git config [--global] user.name "用户名":设置[全局]配置用户名
git config [--global] user.password "密码":设置[全局]配置密码
git config [--global] user.email"邮箱":重新全局配置邮箱
ssh-keygen:生成ssh 公钥

3.2 修改提交类命令

3.2.1 本地修改

git status:查看当前工作区的状态
git diff -- fileName:命令可以查看工作区和版本库里面最新版本的区别
git add [file1] [file2]: 添加文件到暂存区
git add dir: 添加文件目录到暂存区
git add . : 添加当前目录所有文件到暂存区
git add -p : 添加每个变化前都会要求确认,对于同一文件多处变化,可以实现分次提交

git rm [file1] [file2]: 删除工作区文件,并把删除放入暂存区
git rm --cached [file]: 停止追踪指定文件,但该文件会保留在工作区
git mv [file-origname] [file-rename]: 改名文件,并把改名放入暂存区

3.2.2 提交类命令

git commit -m [message]:提交暂存区到本地仓库区
git commit [file1] [file2] ... -m [message]:提交暂存区的指定文件本地仓库区
git commit -a :提交工作区自上次commit之后的变化直接到本地仓库区
git commit -v :提交时显示所有的diff信息
git commit --amend -m [message]:使用一次新的commit,替代上一次提交,如果代码没有变化,就改写上一次commit的提交信息
git commit --amend [file1] [file2]:重做上一次commit,并包括指定文件的新变化
git commit --amend --only -m 'xxxxxxx':如果提交信息(commit message)写错了且这次提交(commit)还没有推(push), 可以通过此方法来修改提交信息(commit message)
git commit --amend --author "New Authorname <authoremail@mydomain.com>":提交(commit)里的用户名和邮箱不对

3.2.3 查看日志

git status:显示有变更的文件
git log:查看历史的每次提交信息,但是如果回退版本了,那么对应的历史信息就没了,那就使用git reflog
git reflog:看到以前的每次执行动作
git log --stat:显示commit历史,以及每次commit发生变更的文件
git log -S [keyword]:根据关键字搜索提交历史
git log [tag] HEAD --pretty=format:%s:显示某个commit之后所有变动,每个commit占据一行
git log [tag] HEAD --grep feature :显示某个commit之后所有变动,其提交说明必须符合搜索条件
git log --follow [file]:显示某个文件版本历史,包括文件改名
git whatchanged [file]:显示某个文件版本历史,包括文件改名
git log -p [file]:显示指定文件相关的每一次的diff
git log -5 --pretty --online :显示过去5次提交
git log --before="1 days" :之前一天的版本提交
git shortlog -sn :显示所有提交过的用户,按提交次数序排序
git blame [file]:以列表方式查看指定文件的提交历史,显示指定文件是什么人在什么时候修改过

3.2.4 显示提交时内容

git show [commit]:显示某次提交元数据和内容变化
git show --name-only [commit]:显示某次提交发生变化的文件
git show [commit]:[fileName]:显示某次时某个文件的内容

3.3 远端仓库类命令

3.3.1 显示远端仓库

git remote:查看关联的远程仓库的名称
git remote -v:显示所有远程仓库
git remote add url:添加一个远程仓库
git remote show [remote]:显示某个远程仓库信息
git remote add [shortname] [url] :增加一个新的远程仓库并命名

3.3.2 远端拉取

git fetch [remote]:下载远程仓库所有变动
git fetch --all:拉取所有远端的最新代码
git fetch origin master:拉取远程最新master分支代码
git pull:拉取远程仓库所有分支更新并合并到本地分支
git pull origin master :将远程master分支合并到当前本地分支
git pull [remote] [branch]:获取远程仓库变化,并与本地代码合并
git pull origin master:master:将远程master分支合并到当前本地master分支,冒号后面表示本地分支

3.3.3 远端推送

git push [remote] [branch]:上传本地指定分支到远程仓库
git push [remote] --force:强行推当前分支到远程仓库,即使有冲突
git push [remote] --all :推送所有分支到远程仓库
git push <remote> :<branch/tag-name>:删除远程分支或标签
git push --tags :上传所有标签
git push origin -d <branchname>:删除远程branchname分支

3.4 分支类命令

3.4.1 查看分支

git branch:查看所有分支,当前分支前面会有一个*表示
git branch -r :列出所有远程分支
git branch -a :列出所有本地分支和远程分支

3.4.2 切换分支

git checkout -b [branch]:创建并切换到新的分支
git checkout [branch]:切换到指定分支,并更新工作区
git checkout - :切换到上一个分支

3.4.3 新建分支

git branch [branch-name]:新建一个分支,但依然停留在当前分支
git branch --track [branch] [remote-branch]:新建一个分支,与远程指定分支建立追踪关系
git branch --set-upstream [branch] [remote-branch] :建立追踪关系,在现有分支与指定远程分支之间
git checkout -b [branch]:创建并切换到新的分支

3.4.4 删除分支

git branch -d [branch] :删除分支
git push origin --delete [branch] :删除远程分支
git branch -dr [remote/branch] :删除远程分支

3.4.5 合并分支

git merge [branch]:用来合并指定分支到当前分支,假如要合并dev到master,使用此命令时需要先使用checkout命令切换到master分支,然后将 dev分支的修改合并到master分支
git merge --no-ff origin/dev:在当前分支上合并远程分支dev
git merge --abort:终止本次merge,并回到merge前的状态
git rebase [branch]:衍合指定分支到当前分支
git cherry-pick [commit]:合并部分commit,不像merge是合并全部commit,选择一个commit合并到当前分支

3.4.6 比较不同

git diff:显示暂存区和工作区差异
git diff --cache [file]:显示暂存区和上一个文件的差异
git diff HEAD :显示工作区和当前分支最新commit之间差异
git diff [first-branch] ... [second-branch]:显示两次提交之间差异
git diff --shortstat "@{0 day ago}":显示今天写了多少行代码

3.5 撤销操作

Git的撤销与回退,在日常工作中使用的比较频繁。比如我们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到git的撤销和回退操作。

代码在Git的每个工作区域都是用哪些命令撤销或者回退的呢,如下图所示:
在这里插入图片描述

3.5.1 git checkout

如果文件还在工作区,还没添加到暂存区,可以使用git checkout撤销
git checkout [file]:恢复暂存区指定文件到工作区
git checkout [commit] [file]:恢复某个commit指定文件到暂存区和工作区
git checkout . :恢复暂存区所有文件到工作区
git checkout HEAD <file>:撤销指定的未提交文件的修改内容

3.5.2 git reset

3.5.2.1 简介

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,为了更好地理解git reset,我们来回顾一下,Git的版本管理及HEAD的理解
Git的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是masterHEAD指针一般指向当前分支,如下:
图片
假设执行git reset,回退到版本二之后,版本三不见了哦,如下:

图片
使用模式
在这里插入图片描述

3.5.2.2 命令

git reset [file] :重置暂存区指定文件,与上一次commit保持一致,但工作区不变
git reset [commit] :重置当前分支指针为指定commit,同时重置暂存区,但工作区不变
git reset --hard :重置暂存区与工作区,与上一次commit保持一致
git reset --hard HEAD:撤销工作目录中所有未提交文件的修改内容,这个操作是不可逆的,慎用
git reset --hard HEAD^:把当前的版本回退到上一个版本,如果退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推
git reset --hard HEAD~100:回退到前100个版本
git reset HEAD --file:回退暂存区里的某个文件,回退到当前版本工作区状态,即可以取消已经使用git add命令暂存的文件
git reset --hard [commit]:重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --keep [commit] :重置当前分支的HEAD为指定commit,但是保持暂存区和工作区不变

hard,mixed,soft 三个区别:

  • git reset –-soft目标版本号:可以把版本库上的提交回退到暂存区,修改记录保留
  • git reset –-mixed 目标版本号:可以把版本库上的提交回退到工作区,修改记录保留
  • git reset –-hard:可以把版本库上的提交彻底回退,修改的记录全部revert

3.5.2.3 回滚操作

假如代码git add到暂存区,并未commit提交,可以这样回退,如下:

  • git reset HEAD file:取消暂存
  • git checkout file:撤销修改

假如代码已经git commit了,但是还没有push

  • git log:获取到想要回退的commit_id
  • git reset --hard commit_id:想回到过去,回到过去的commit_id

如果代码已经push到远程仓库了,也可以使用reset回滚

  • git log
  • git reset --hard commit_id
  • git push origin HEAD --force

3.5.3 git revert

git reset不同的是,revert复制了那个想要回退到的历史版本,将它加在当前分支的最前端。
revert之前:图片
revert 之后:图片
当然,如果代码已经推送到远程的话,还可以考虑revert回滚

  • git log:得到你需要回退一次提交的commit id
  • git revert -n <commit_id>:撤销指定的版本,撤销也会作为一次提交进行,新建一个commit,用来撤销指定commit,后者所有变化都被前者抵消,并且应用到当前分支

3.5.4 Idea中撤销操作

是否删除对代码的修改 是否删除Commit提交记录 是否会新增Commit记录
Undo Commit 不会 未Push会,已Push不会 不会
Revert Commit 不会
Drop Commit 未Push会,已Push不会 不会

3.5.4.1 Undo Commit

如果代码修改完了,已经Commit了,但是还未push,然后发现还有地方需要修改,但是又不想增加一个新的Commit记录。这时可以进行Undo Commit,修改后再重新Commit
如果已经进行了Push,线上的Commit记录还是会存在的,简单来说,就是撤销了Commit的这个动作。
详细解释下:
首先,对项目进行了代码修改,然后进行commit操作。
在这里插入图片描述
确认Commit之后(未进行Push),这时候分支用户什么都不要选都是默认才能看到已提交未Push 的记录
在这里插入图片描述
进行Undo Commit操作
在这里插入图片描述
执行后和未Commit之前完全一样。
在这里插入图片描述

3.5.4.2 Revert Commit

会新建一个 Revert “xxx Commit”Commit记录,该记录进行的操作是将xxx Commit中对代码进行的修改全部撤销掉。
首先,对项目进行了代码修改,然后进行commit操作。
在这里插入图片描述
Commit之后:
在这里插入图片描述
进行Revert Commit
在这里插入图片描述
执行成功后:
可以看到,新增了Commit 记录Revert “测试Revert Commit”,该记录中将测试Revert Commit中对代码进行的修改删除了。
在这里插入图片描述

3.5.4.3 Drop Commit(慎用)

未push已push区别:

  • 未pushCommit记录,会删除Commit记录,同时Commit中对代码进行的修改也会全部被删除
  • 已push的Commit记录,区别在于线上的Commit记录不会被删除

修改代码,然后进行Commit
在这里插入图片描述
在这里插入图片描述
进行Drop Commit操作后,Commit 记录被删除,代码修改也被删除
在这里插入图片描述
已push的Commit记录
在这里插入图片描述

3.5.4.4 不能Undo,Revert,Drop的撤销

如果在idea中是因为merge后操作,这时代码在 commit 没有 push,但是还不能使用Undo,Revert,Drop,可以使用强制撤销操作

在这里插入图片描述
回退上个版本,使用 HEAD^ or HEAD~1
以此类推,HEAD~2HEAD^^ 表示撤销最后两次提交;HEAD~3HEAD^^^ 表示撤销最后三次提交;

注意Reset Type

  • Mixed:是默认方式。只保留源码,会回退 commit 和 index 的信息;(常用)
  • Soft:回退到某个版本。只回退了 commit 的信息,之前写的代码还是保留的,不会恢复到 index file 一级。如果还要提交,直接 commit;
  • Hard:彻底回退,本地源码也会变成上一个版本内容,不保留之前 commit 的代码。(一般不使用)

3.6 高级命令

3.6.1 标签相关

tag就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去

  • git tag:列出所有本地标签
  • git show [tag]:查看tag
  • git tag <tagname>:基于最新提交创建标签
  • git tag [tag] [commit]:新建一个tag在指定commit
  • git tag -d <tagname>:删除指定标签
  • git show [tag]:查看标签信息
  • git push origin :refs/tags/[tagName]:删除远程标签
  • git push [remote] [tag]:提交指定tag
  • git push [remote] --tags:提交所有tag
  • git checkout -b [branch] [tag]:新建一个分支指向某个tag

3.6.2 git rebase

rebase又称为衍合,是合并的另外一种选择。

假设有两个分支master和test

     D---E test
      /
  A---B---C---F--- master

执行 git merge test得到的结果

       D--------E
      /          \
 A---B---C---F----G---   test, master

执行git rebase test,得到的结果

A---B---D---E---C‘---F‘---   test, master

rebase好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:git pull --rebase,就是因为想更优雅

3.6.3 git stash

假如当前开发分支的工作区有开发的东西,但是另一个分支也有需要急需开发的代码,如果直接切换到新的分支,那么当前分区的工作就白费了,如果先把代码提交啊,回头再接着写。但是这样的提交是不合理的,也没有任何实际意义的,因为代码并没有完成,提交的是不完整的功能
git给提供了stash功能,可以把当前工作区的内容进行快照,等待以后恢复使用
stash命令可用于临时保存和恢复修改

  • git stash:把当前的工作隐藏起来 等以后恢复现场后继续工作
  • git stash save "修改的信息":保存工作区
  • git stash list:显示保存的工作进度列表
  • git stash pop stash@{num}:恢复工作进度到工作区
  • git stash show:显示做了哪些改动
  • git stash drop stash@{num}:删除一条保存的工作进度,删除最近的一次stash
  • git stash clear:删除所有缓存的stash
  • git stash apply:恢复到工作区,但是恢复后,stash内容并不删除,需要用git stash drop来删除,用git stash pop,恢复的同时把stash内容也删了

3.6.4 其他命令

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

posted @ 2021-08-09 18:15  上善若泪  阅读(534)  评论(0编辑  收藏  举报