Git介绍及常用命令详解

一、Git的概述

Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。

Git 会跟踪我们对文件所做的更改,因此我们可以记录已完成的工作,并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易,允许将多个人的更改全部合并到一个源中。

二、Git的常用命令

命令名称 作用
git config --global user.name 用户名 设置用户签名
git config --global user.email 邮箱 设置用户签名
git init 初始化本地库
git status 查看本地库状态
git add 文件名 添加到暂存区
git commit -m "日志信息" 文件名 提交到本地库
git reflog 查看历史记录
git reset --hard 版本号 版本穿梭

2.1.设置用户签名

用法

复制代码
git config --global user.name 用户名 
git config --global user.email 邮箱

说明:"

签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。注意: 这里设置用户签名和将来登录 GitHub(或其他代码托管中心) 的账号没有任何关系。"

设置完成之后会在对应的用户下存在.gitconfig文件

2.2.初始化本地库

2.2.1.基本语法

复制代码
git init

执行完成之后会出现.git文件,初始化成功

2.2.查看本地库状态

复制代码
git status

2.3.添加暂存区

本地修改完的文件,需要添加到暂存区才可以提交本地仓库。

复制代码
git add 文件名
或者
git add .

删除暂存区内容

复制代码
git restore --staged 文件名
git rm --cached  文件名   (这是比较旧的命令)
区别:
git restore 恢复我此次的修改,我此次的修改不提交
git rm 是删除文件,就是本来仓库中已经有了这个文件,但是我把他删除

git restore --staged 文件名 : 将文件从暂存区撤出,但不会撤销文件的更改(我修改了文件,已经放到暂存区了,现在我不想将这次修改放到暂存区,可以使用 这个命令)
git restore 文件名 :将在工作区中的修改丢弃(需要被追踪,也就是也就被版本控制的文件才可以使用git restore命令

比如我已经把这个文件删掉了,那么我就可以使用这个命令放弃这个删除,但是如果我已经将删掉这个文件并且提交到暂存区之后,那么我需要先执行git restore --staged 文件名之后才可以执行这个命令)

git rm --cached命令与git rm命令都可以删除git版本库中的文件,但是两者之间有一些区别。

使用git rm -f 文件名 命令会将文件从版本库中删除,并且同时删除工作区中对应的文件。而使用git rm --cached 文件名命令会将文件从版本库中删除,但是不删除工作区中的对应文件。

复制代码
1.git rm 会删除工作区中的文件;
2.git rm 会同时将删除的文件添加到暂存区;
【因此 git rm 相当于 rm + git add 两个命令】
【注意】 git rm 删除的文件必须是 没有经过修改的,也就是说必须要和当前版本库的内容一致的。
3.git commit 后,版本库中的此文件记录也会被删除。
如果git rm 文件  删除的文件和上一个版本库内容不一致,那么要执行删除,则会出现报错。
这时可以使用git rm -f 文件 进行强制删除

.git rm --cached 会删除暂存区中的文件,但是会保留工作区中的文件,并将此次删除提交到暂存区;
2.因此:文件从暂存区中删除掉,即不会被提交到版本库中,也就是说此文件被取消了版本控制。
3.注意 : --cached 参数 删除的文件必须是已经被追踪的文件,即之前被版本控制的文件
向暂存区告知本文件已经删除,但工作区却偷偷保留这个文件。于是commit后仓库就不会有这个文件,是为了用户本次不想上传某些缓存文件设立。

2.4.提交本地库

复制代码
git commit -m "日志信息"

2.5.历史版本

查看提交记录

复制代码
git reflog

git log
复制代码
git reset --hard 版本号

穿越回对应的版本号

Git 切换版本,底层其实是移动的 HEAD 指针,具体原理如下图所示。

指针指向对应的版本。

三、GIT分支操作

3.1.什么是分支

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。分支可以简单理解为副本,一个分支就是个单独的副本。(分支底层其实也是指针的引用)

3.2.分支的好处

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

各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败

的分支删除重新开始即可。

3.3.分支的操作

命令名称 作用
git branch 分支名 创建分支
git branch -v 查看分支
git checkout 分支名 切换分支
git merge 分支名 把指定的分支合并到当前分支上

3.3.1.查看分支

复制代码
git branch -v	

3.3.2.创建分支

复制代码
git branch 分支名	

3.3.3.切换分支

复制代码
git checkout 分支名

3.3.4.合并分支

复制代码
git merge 分支名

正常合并情况(没有出现冲突)

出现冲突情况进行合并

产生冲突原因:

合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。"查看状态(检测到有文件有两处修改)"

这时需要手动进行合并分支

  • 打开冲突文件

修改前:

修改后

保存之后添加暂存区

复制代码
git add test4.txt

提交版本库

复制代码
git commit -m "日志信息"  (此时不能带文件名)

master、fix-bug 其实都是指向具体版本记录的指针当前所在的分支,其实是由 HEAD决定的。所以创建分支的本质就是多创建一个指针。"

HEAD 如果指向 master,那么我们现在就在 master 分支上。"HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上。"所以切换分支的本质就是移动 HEAD 指针。

3.3.5.创建并切换分支

复制代码
git checkout -b 分支名 // 新建  分支,并切换到该分支上

3.3.6.删除分支

当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可以删除它。

复制代码
git branch -d 分支名 // 删除  分支

四、GIT团队协作机制

4.1.团队内协作

4.2.跨团队协作

五、GitHub操作

5.1.远程仓库操作

命令名称 作用
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址 起别名
git push 别名 分支 推送本地分支上的内容到远程仓库
git clone 远程地址 将远程仓库的内容克隆到本地
git pull 远程库地址别名 远程分支名 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并

5.2.创建远程仓库

使用github或者gitee

5.2.1.创建远程仓库别名

复制代码
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址

5.2.2.添加远程仓库

如果你已经有了一个本地仓库,然后你打算将它发布到远程,供其他人协作。那么使用:

复制代码
git remote add origin your_remote_git_repo // 为本地仓库添加远程仓库

5.2.3.移除当前远程仓库

复制代码
git remote rm origin //先移除之前的远程仓库

5.3.推送本地分支到远程仓库

复制代码
git push 别名 分支
或
git push 远程仓库地址 分支

如果出现

复制代码
fatal: refusing to merge unrelated histories
致命:拒绝合并不相关的历史记录
这是因为本地仓库与远程仓库存在不同的历史记录(不是同一个仓库)
解决方法:
在你操作命令后面加 --allow-unrelated-histories
如git pull 远程仓库地址 分支名 --allow-unrelated-histories

推送远程仓库

5.4.拉取远程库到本地库

复制代码
git pull 别名 分支名
或
git pull 远程仓库地址 分支名
或
git fetch 别名 master

git fetchgit pull 之间的区别:

  • git fetch 是仅仅获取远程仓库的更新内容,并不会自动做合并。

  • git pull 在获取远程仓库的内容后,会自动做合并,可以看成 git fetch 之后 git merge

  • 注意:建议多使用 git fetch

5.5.克隆远程仓库到本地

复制代码
git clone 远程仓库地址(克隆公开代码不需要登录)

git clone 克隆会做三件事

  • 拉去远程代码
  • 初始化本地仓库
  • 创建别名origin

六、SSH免密登录

在对应运用命令生成.ssh密钥目录

复制代码
ssh-keygen -t rsa -C 892640297@qq.com

生成.ssh文件

在gitee或者github上将公钥输入

之后就可以使用ssh进行项目的拉取以及推送。

七、自建代码托管平台-GitLab

官网地址:https://about.gitlab.com/

安装说明:https://about.gitlab.com/installation/

八、Git可能需要用到的命令

8.1.查看仓库中的具体修改

复制代码
git diff    // 查看版本库中所有的改动
git diff Readme.md        // 查看具体文件的改动

很经常的,我们对某个文件做了修改,但过不久就忘记了。这时候就可以通过 git diff 来查看具体的修改内容。

8.2.版本回退

有了 git reflog 来查看提交的历史记录,我们就可以通过 git reset --hard 来回退到我们需要的特定版本,然后使用当时的代码进行各种操作。

java 复制代码
git reset --hard HEAD^        // 回退到上一个提交版本
git reset --hard HEAD^^        // 回退到上上一个提交版本
git reset --hard 'commit_id'    // 会退到 commit_id 指定的提交版本

8.3.撤销修改

撤销修改同样包括两方面的内容,由于仓库中的文件在提交之前,可能在工作区中,尚未在版本控制范围内,也可能在暂存区中。

8.3.1.丢弃工作区中文件的修改

java 复制代码
git checkout -- Readme.md    // 如果 Readme.md 文件在工作区,则丢弃其修改
git checkout -- .            // 丢弃当前目录下所有工作区中文件的修改

注意: git checkout -- 中的 -- 是必须的。

8.3.2.丢弃已经进入暂存区的修改

复制代码
git reset HEAD Readme.md // 将 Readme.md 恢复到 HEAD 提交版本的状态
git reset HEAD 文件名 // 将 文件 恢复到 HEAD 提交版本的状态

8.4.建立本地分支和远程分支的关联

在本地仓库中的分支和远程仓库中的分支是对应的。一般情况下,远程仓库中的分支名称和本地仓库中的分支名称是一致的。

有的时候,我们会需要指定本地分支与远程分支的关联。

复制代码
git branch --set-upstream-to=origin/远程分支名 本地分支名

在zkt-git-test上的hello.txt文件中加入zkt-git-test之后,重新拉去,显示如下

复制代码
git branch --set-upstream 'local_branch' origin/remote_branch
显示不再支持
--set-upstream已经过时,需要用 新的命令 --set-upstream-to

8.5.修改本地仓库对应的远程仓库地址

当远程的仓库地址发生变化时,需要修改本地仓库对应的远程仓库的地址。主要应用在工程迁移过程中。

复制代码
git remote set-url origin 远程仓库地址

8.6.标签管理

在项目开发过程中,当一个版本发布完成时,是需要对代码打上标签,便于后续检索。获取处于其他的原因,需要对某个提交打上特定的标签。

8.6.1.创建标签

复制代码
git tag -a 标签名 -m '备注信息' 'commit_id'

-a 参数指定标签名, -m 添加备注信息, 'commit_id' 指定打标签的提交(某个版本号)。

8.6.2.查看所有标签

复制代码
git tag // 查看本地仓库中的所有标签

8.6.3.查看具体标签信息

复制代码
git show 标签名

8.6.4.删除本地标签

如果打的标签出错,或者不在需要某个标签,则可以删除它。

复制代码
git tag -d 标签名

8.6.5.推送标签到远程仓库

打完标签以后,有需要推送到远程仓库。

复制代码
//推送单个标签到远程仓库
git push origin 标签名
//一次性推送所有标签到远程仓库。
git push origin --tags

8.6.6.删除远程标签

复制代码
git push origin :refs/tags/标签名
 
git push origin --delete 标签名
 
git push origin :标签名

8.7.临时保存修改

在执行很多的 Git 操作的时候,是需要保持当前操作的仓库/分支处于 clean 状态,及没有未提交的修改。如 git pull, git merge 等等,如果有未提交的修改,这些将无法操作。

但是做这些事情的时候,你可能修改了比较多的代码,却又不想丢弃它。那么,你需要把这些修改临时保存起来,这就需要用到 git stash。

8.7.1.临时保存修改

临时保存修改,这样仓库就可以回到 clean 状态。

复制代码
git stash // 保存本地仓库中的临时修改。

注意:可以多次的 git stash 来保存不同的临时修改。

保存之后,仓库回到clean状态,目前在工作区、暂存区的已经没有了,被暂时保存起来了。

8.7.2.查看临时保存

当你临时保存以后,后面还是要取回来的,那它们在哪里呢?

复制代码
git stash list // 显示所有临时修改

8.7.3.恢复临时保存

当我们处理完其他操作时,想要恢复临时保存的修改。

复制代码
git stash apply        // 恢复所有保存的临时修改
git stash pop        // 恢复最近一次保存的临时修改

8.7.4.丢弃临时保存

我们后面觉得临时保存不想要了,那可以丢弃它。

复制代码
git stash clear // 丢弃所有保存的临时修改
相关推荐
MatrixOrigin1 小时前
MatrixOne Git4Data 技术详解(二):从零跑通所有 Git 原语
git
anew___1 小时前
常用的 Git 工作流
git
shimly1234562 小时前
git diff 生成一部分文件的补丁
git
m0_579146652 小时前
Git 重置模式详解:四种重置方式的原理与应用场景
git
恋喵大鲤鱼3 小时前
git grep
git·git grep
霸王龙的小胳膊3 小时前
Git基础知识
git
恋喵大鲤鱼4 小时前
git fetch
git·git fetch
Java知识技术分享4 小时前
安装sourcetree
java·git·源代码管理
恋喵大鲤鱼4 小时前
git revert
git·git revert
爱和冰阔落4 小时前
【Codex项目实战】从模糊需求到可验证交付:Plan、测试、Review与Worktree完整流程
人工智能·git·codex