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(已跟踪)又包括三种工作状态:Unmodified,Modified,Staged

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_rsa和id_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]:停止追踪指定文件(主要用于在.gitignore中添加屏蔽文件,但是commit窗口还有该文件时使用),该文件会保留在工作区,如果文件太多,可以指定目录,添加 -r 递归目录,rm后要记得commit并push,否则不会生效
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]:创建并切换到新的分支
git branch -M:重命名当前分支,尤其在本地分支名和远程仓库的分支名不一致时非常有用
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的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master,HEAD指针一般指向当前分支,如下:

假设执行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_idgit reset --hard commit_id:想回到过去,回到过去的commit_id
如果代码已经push到远程仓库了,也可以使用reset回滚
git loggit reset --hard commit_idgit push origin HEAD --force
3.5.3 git revert
与git reset不同的是,revert复制了那个想要回退到的历史版本,将它加在当前分支的最前端。
revert之前:
revert 之后:
当然,如果代码已经推送到远程的话,还可以考虑revert回滚
git log:得到你需要回退一次提交的commit idgit 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区别:
未push的Commit记录,会删除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~2或HEAD^^ 表示撤销最后两次提交;HEAD~3或HEAD^^^ 表示撤销最后三次提交;
注意:Reset Type
Mixed:是默认方式。只保留源码,会回退commit 和 index的信息;(常用)Soft:回退到某个版本。只回退了commit的信息,之前写的代码还是保留的,不会恢复到 index file 一级。如果还要提交,直接 commit;Hard:彻底回退,本地源码也会变成上一个版本内容,不保留之前commit的代码。(一般不使用)
3.6 高级命令
3.6.1 标签相关
打tag就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去
git tag:列出所有本地标签git show [tag]:查看taggit tag <tagname>:基于最新提交创建标签git tag [tag] [commit]:新建一个tag在指定commitgit tag -d <tagname>:删除指定标签git show [tag]:查看标签信息git push origin :refs/tags/[tagName]:删除远程标签git push [remote] [tag]:提交指定taggit push [remote] --tags:提交所有taggit 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}:删除一条保存的工作进度,删除最近的一次stashgit stash clear:删除所有缓存的stashgit stash apply:恢复到工作区,但是恢复后,stash内容并不删除,需要用git stash drop来删除,用git stash pop,恢复的同时把stash内容也删了
3.6.4 其他命令
git archive:生成一个可供发布的压缩包
3.7 Git添加新项目
3.7.1 基本设置
需要设置用户名和邮箱 如果是第一次使用 Git,需要设置用户名和邮箱:
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
3.7.2 初始化 Git 仓库
打开项目的本地目录,右键选择 Git Bash Here 或在终端中导航到该目录。
运行以下命令初始化一个 Git 仓库:git init,这个命令会在项目根目录创建一个 .git 文件夹,表示这是一个 Git 仓库。
3.7.3 添加文件到 Git 暂存区
添加所有文件到暂存区:git add .
.:表示将当前目录及其子目录的所有文件添加到暂存区。
如果只想添加特定文件,可以用 git add 文件名
3.7.4 提交到本地仓库
提交暂存区的文件到本地仓库,并添加提交说明:
git commit -m "初始化项目"
-m 后面的内容是对提交的简短描述,便于团队成员理解此次提交的目的。
3.7.5 配置远程仓库
- 如果还没有创建远程仓库:
登录到 Git 服务平台(如 GitHub、GitLab、Gitee 等)。
创建一个新仓库,记下仓库的远程地址(如 https://github.com/username/repository.git 或 git@github.com:username/repository.git)。 - 关联本地仓库到远程仓库:
git remote add origin <实际的远程仓库 URL>
origin是远程仓库的默认名称,也可以修改为其他名称。
3.7.6 推送代码到远程仓库
如果远程仓库是空的,直接推送代码:
# 将本地分支重命名为 main(与远程仓库保持一致)
git branch -M main
# 将代码推送到远程仓库的 main 分支,并设置默认上游分支
git push -u origin main
如果远程仓库已有内容(非空仓库),可能需要先拉取远程代码:
git pull origin main --allow-unrelated-histories
git push -u origin main

浙公网安备 33010602011771号