Linux下Git简单使用

前言

Git是一个分布式版本控制系统,用于高效的处理或大或小的项目,之前一直使用IDEA整合的Git,对Git的各种命令和原理不是很了解,所以来学习一下。
Git的分布式体现在每台电脑上的Git都包含完整的版本库信息(如历史提交记录),有一个集中式的服务器如GitHub只是为了方便我们交换代码,实际上任意两个Git之间都是可以相互通信的。

安装

Linux下可以使用yum直接安装

复制yum install git

配置属性

git config --system user.name 'szz'可以配置系统属性,当前操作系统所有用户有效
git config --global user.name 'szz'可以配置全局属性,当前操作系统当前用户有效
git config --local user.email 'szz@163.com'可以配置本地属性,当前操作系统当前用户当前仓库有效

commit文件前需要先配置user.name和user.email两个属性

各种概念

一个受Git管理的文件有3种状态

  • 工作区,文件创建之后就在工作区,使用git add test1.txt命令将test1.txt文件添加到暂存区
  • 暂存区,使用git rm --cached test1.txt命令将test1.txt文件从暂存区清除,不影响工作区,
    使用git checkout -- test1.txt命令将暂存区的test1.txt文件替换工作区的test1.txt文件,很危险,会清除工作区那些未添加的改动。
    使用git reset HEAD test1.txt命令将暂存区test1.txt文件回退到上一次commit提交之后的版本(清除暂存区),不影响工作区。
    使用git commit -m '测试'命令将暂存区文件提交到版本库。
  • 版本库,使用git log查看commit记录,
    使用git reset --soft HEAD^回退到上次commit的版本

常用命令

git init初始化一个git仓库,会创建一个.git目录,包含该仓库的所有元数据,如暂存区数据等
git status查看当前仓库(当前分支)的状态,如有哪些文件处于暂存区需要commit。
git log查看提交记录(当前分支)
git reflog查看操作记录(当前分支)
git blame a.txt查看a.txt的修改记录
git reset --mixed a.txt重置暂存区a.txt文件和最后一次commit保持一致(默认--mixed)。
git reset --soft HEAD^重置版本库所有文件到最后一次commit(回退版本,不能回退指定文件,不影响暂存区和工作区文件,可以废弃之前有错误commit日志的commit)。
git reset --hard HEAD^重置版本库所有文件到最后一次commit(回退版本,不能回退指定文件,工作区文件也回退,清除暂存区)。
git reset --hard 04ae重置版本库所有文件到指定commit。
git rm a.txt删除工作区和暂存区的a.txt文件(前提是a.txt已经存在版本库中),如果暂存区之前已经有修改过的a.txt,可以使用git rm --cached a.txt先删除暂存区的a.txt,或者使用
git rm -f a.txt强制删除。
git rmrm的区别,前一种不仅会删除,且会将这次删除操作添加到暂存区。
如果使用git rm a.txt命令之后,又想不删了,可以先使用git reset HEAD a.txt将这次删除操作移除暂存区,再使用git checkout -- a.txt丢弃工作区的删除操作,就可以将a.txt恢复到工作区了。
git diff a.txt比较暂存区和工作区a.txt文件的区别
git diff HEAD a.txt比较最新commit和工作区a.txt文件的区别
git diff --cached a.txt比较最新commit和暂存区a.txt文件的区别
git diff master dev比较master分支和dev分支的区别
git cherry-pick [commitid]将指定的commit应用到当前分支(部分合并分支)

配置.gitignore文件

我们可以使用.gitignore文件来忽略不想提交的文件,如java项目中编译的class和IDE的配置信息等。

复制*.txt  # 所有类型为txt的文件
!a.txt # 不忽略a.txt
b/     # b目录下所有文件
b/**/c.txt  # b目录下所有层级下的c.txt文件

分支管理

使用分支可以让我们每个人独立于主线之外开发,互不影响。
git branch查看所有分支
git branch test1创建test1分支
git branch -m test1 test2修改test1分支的名称为test2
git checkout test1切换到test1分支
git checkout -b test1创建test1分支并切换到test1分支
git branch -d test1删除test1分支,如果test1分支有提交没有被合并,不能删除,可以强制删除或进行合并
git branch -D test1删除test1分支,强制删除
git merge test1将test1分支合并到当前分支上

分支切换及合并的原理

git会将所有的commit串成一条线,每个commit都有一个或多个(合并情况下)parent指针(指向上次的commit),HEAD指针指向当前分支(可以通过.git目录下HEAD文件查看),master指针指向master分支最新的commit。
我们可以使用git log查看commit记录,使用git show --pretty=raw [commit id]查看一次commit的详细信息,包含它的parent指针。

当我们创建了一个新的分支dev并且切换过去后,HEAD就指向了dev分支,dev指针也指向了最新的一次commit。

我们在dev分支上做了新的commit后,dev指针向前移动一个,master指针不变。

当我们想将dev分支合并到master分支上时,要先切换到master分支,HEAD指针就指向了master分支,合并之后master指针直接指向当前dev指针指向的commit。

上面是没出现冲突的情况,如果出现了冲突,dev分支修改了a文件,master分支也修改了a文件,且都修改了同一行,将dev合并到master时就会冲突

这种情况需要我们手动修改a文件解决冲突,然后再次commit,master指针就指向了新的commit(此commit有两个parent指针)。

merge和rebase的区别

假设当前在mywork分支,执行git merge origin可以将origin分支内容合并到当前分支,并生成一个新的commit

执行git rebase origin,相当于将mywork的两次commit以补丁的形式合并到origin的最后一次commit上,会将原来的commit删除(C5,C6),创建新的commit(修改了历史commit,不建议使用)

标签管理

标签可以看做当前仓库当前分支最新commit时的一个快照
git tag -l查询所有标签
git tag -l 'v1.0'查询名称为v1.0的标签
git tag -a v1.0 -m '版本1'创建名称为v1.0的标签,注释为版本1
git tag -d v1.0删除名称为v1.0的标签

远程仓库

git clone [url]从远程git服务器克隆一个仓库到本地,后续可以直接push
git remote add origin [url]添加一个远程仓库的关联,origin就是远程仓库的别名
git remote -v查看当前仓库关联的远程仓库
git remote show origin查看关联的远程仓库的信息
git push origin master将本地的master分支推送到远程仓库的master分支
git pull origin master将远程仓库的master分支拉取到本地的当前分支并合并,相当于git fetchgit merge origin/master两个命令的简写。
在项目中,我们一般多人开发,张三修改了a.txt,commit之后,push到远程,李四也修改了本地的a.txt,push时会失败(因为和远程的有冲突),需要先pull,处理完冲突,再次push。
git branch -a查看所有分支,包含远程分支
git branch -r查看所有远程分支
git push origin --delete test2删除远程的test2分支
git push origin v1.0将本地的标签v1.0推送到远程
git push origin --delete v1.0删除远程的v1.0标签
git checkout -b dev origin/dev根据远程分支dev创建本地分支dev

模块管理

关于submodule,可以查看7.11 Git 工具 - 子模块
关于subtree,可以查看用 Git Subtree 在多个 Git 项目间双向同步子项目,附简明使用手册

总结

理解了各种命令,也就理解了图形化工具各种功能的原理,如IDEA对git整合的各种操作。

参考

git-简明指南
Git教程-菜鸟教程
Git官网
git分支开发的原理
git rebase原理和使用
【转载】剖析Git的实现机制

posted @   strongmore  阅读(1206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示