GIT--快速入门
本文仅用于作者个人学习记录,如有侵权请联系删除
什么是Git
分布式版本控制和源代码管理系统软件
GIT中的基础概念
GIT分区
Workspace:工作区
//通过git init创建的代码库不包含.git(版本库)
Index/Stage:暂存区---索引
//通过 add ./*/*Xxxx/Xxxx* 添加的修改都进入了暂存区
//通过git status 可以查看到修改状态
Repository:仓库区(本地仓库),存储库
Remote:远程仓库
版本控制系统(VCS)
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
本地版本控制系统
RCS,现今许多计算机系统上都还看得到它的踪影。
甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。
它的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
集中化的版本控制系统
为了让不同系统的开发者协同工作
CVCS/SVN:
有一个单一的集中管理的服务器---保存所有文件的修订版本
协同工作---通过客户端连接服务器
//缺点:只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
分布式版本控制系统
DVCS:
客户端将最新版本完全镜像。
可以指定和若干个不同的远端代码仓库进行交互。
GIT基础和原理
直接记录快照,而非比较差异
其他:
将保存的信息看作一组基本文件和每个文件随时间逐步累积的差异
存储每个文件与初始版本的差异
Git:
快照流,修改提交时,对当前全部文件制作一个快照并保存这个快照的索引
无修改时,不重新存储该文件,而是保留一个链接指向之前存储的文件
其他:
GIT:
近乎所有操作都是本地执行
GIT保证完整性
数据存储前计算校验和,以校验和引用
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b0037
//实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
一般只添加数据
难以再丢失数据
三种状态
已提交(committed): 已提交表示数据已经安全的保存在本地数据库中
已修改(modified):已修改表示修改了文件,但还没保存到数据库中
已暂存(staged):已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
GIT仓库:用来保存项目的元数据和对象数据库的地方
工作目录:从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改
暂存区域:保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作‘索引’
工作流程:
1.在工作目录中修改文件。
2.暂存文件,将文件的快照放入暂存区域。
3.提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
GIT使用前配置
配置用户名称和邮件地址
$ git config --global user.name "maxsu"
$ git config --global user.email maxsu@yiibai.com
//如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用这些信息。公司账号已经配置好了
检查配置信息
git config --list
yiibai@ubuntu:~$ git config --list
user.name=maxsu
user.email=maxsu@yiibai.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...
git config <key> ---检查单行信息
获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
要想获得 config
命令的手册,执行
$ git help config
创建远程仓库(Repository)
//安装,去百度下载对应版本即可
远程仓库包含:
许多commit objects
到commit objects的指针,叫做heads
Git的仓库和工程存储在同一个目录下,在一个叫做.git的子目录中。
http://git.oschina.net/ ---国内仓库 国外--github
克隆现有仓库-clone
git clone + 仓库地址
克隆该仓库服务器上的所有数据,每一个文件的每一个版本都会被拉取下来
//仓库地址在http://git.oschina.net 项目管理里--code--clone or download
会在当前目录下创建:“git-start.git”的目录,并初始化一个.git文件夹(存放拉取数据)
自定义本地仓库名字:git clone + 仓库地址 mygit-start
//支持多种传输新协议:http://协议 git://协议 ssh传输协议
在现有目录中初始化仓库-init
$ git init
$ git commit
创建.git的子目录--包含初始化Git仓库中所有的必须文件
已经存在文件的文件夹初始化Git仓库进行版本控制,应该开始跟踪这些文件并提交
//git add 命令实现对指定文件的跟踪,然后执行 git commit 提交
//git commit -m 'initial project version'
检查当前文件状态-git status
$ git status
//默认分支名:master
//当前目录下没有出现任何于为跟踪状态的新文件
新建文件没有被追踪的情况
跟踪新文件-git add
$ git add mytext.txt
再次运行 git status---mytext.txt处于暂存状态
//如果git add 后以目录路径为参数---递归跟踪该目录下的所有文件
暂存状态:只要处于changes to be committed这行下---暂存状态---被记录保存在历史记录中
暂存已修改文件
跟踪了README.md,但之后对其进行修改了,再次查看 git status
此时文件在changes not staged for commit下---表示还未进入暂存区---需要重新git add
//添加内容到下一次提交中
READNE.md 同时出现在暂存区和非暂存区
//git add只是暂存了运行此命令时候的版本,如果后面又修改了,需要重新git add
状态简览-status -s
git status -s -----紧凑格式展示
?? ---未跟踪文件
A ---新添加到暂存区的文件
M ---修改过的文件---靠左边M文件被修改并放入了暂存区,靠右边的M被修改没放进暂存区
MM---在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录
忽略文件-.gitignore
用于不需要GIT管理,且不想出现在??表的
可创建.gitignore文件 ,列出要忽略的文件模式
cat .gitignore
*.[oa] --忽略所有 .a .o结尾的文件
*~
文件 .gitignore 的格式规范如下:http://github.com/github/gitignore
1.所有空行或者以 # 开头的行都会被 Git 忽略。
2.可以使用标准的 glob 模式匹配。
3.匹配模式可以以(/)开头防止递归。
4.匹配模式可以以(/)结尾指定目录。
5.要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
查看已暂存和未暂存的修改--diff
git diff---用于查看具体修改了哪些地方,只用于没暂存的
git diff --cached/--staged 查看已经暂存起来的变化
图形化差异分析
git difftool
git difftool --tool-helo 用于看系统支持哪些Git Diff插件
提交更新--commit
git status ---先查看还有哪些修改了,没有git add过
git add
git commit ---启动文本编辑器以便输入本次提交的说明
//提交时记录的是放在暂存区域的快照
跳过使用暂存区--commit -a
自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
git commit -a -m 'added new benchmarks'
移除文件-rm
用于从已跟踪文件清单中移除(从暂存区移除)---提交---将不会再出现在未跟踪文件清单了
如果是用手工删除 还是会出现在未暂存清单里
git rm
git rm -f 如果删除之前,修改过的文件已经存放在暂存区,需要强制删除
git rm --cached xxx 从暂存区删除,但是又想保存在磁盘,不想git继续跟踪
git rm 列出文件/目录名字
移动文件-mv
执行git mv相当于
mv README.md README
git rm README.md
git add README
这三条命令的集合
$ git mv file_from file_to ---重命名
查看提交历史-log
一般会列出:
按提交时间理出所有的更新,最新的在上面
SHA-1校验和
作者的名字和电子右键地址
提交时间
提交说明
git log -p -2 显示每次提交的内容差异,显示近两次的提交
git log --stat 看每次提交的简略的统计信息
额外列出所有被修改过的文件、有多少文件被修改了
以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结
git log --pretty 指定使用不同于默认格式的方式展示提交历史
--pretty=oneline 以一行列出展示
--pretty=format 定制要显示的记录格式
$ git log --pretty=format:"%h - %an, %ar : %s"
//short 、full、fuller 展示信息多少
git log --graph 以ASCII字符串形象的展示分支,合并历史
撤销操作
git commit --amend
git commit --amend 如果漏掉文件没添加用这个/提交信息写错了
提交后没修改,快照不变,所修改的只是提交信息
提交了两次,但是第二次提交会替换第一次提交的结果
取消暂存的文件--reset
假设:有两个文件都暂存了,想取消其中的一个
撤销对文件的修改--checkout
git checkout -- 文件 //checkout的用法之一
假设我更改了文件,然后已经保存到暂存区了,此时我不想更改之前的操作了
远程仓库的使用
查看远程仓库 -remote
git remote
列出指定的每一个远程服务器的简写
clone了自己的仓库----会看到origin----系统默认名
git remote -v 显示需要读写远程仓库使用保存的简写 + 对应URL
会显示全部远程仓库,列出详细信息
URL:是“统一资源定位符”(Uniform Resource Locator)的首字母缩写,中文译为“网址”
添加远程仓库-add
git remote add <shortname> <url>
例子中,用wy替代整个url
拉取仓库中有但我没有的信息---git fetch gs
现在master 分支可以通过本地 wy/master访问
可合并进自己的某个分支
从远程仓库中抓取和拉取-fetch/pull
git fetch [remote-name]
是从远程获取最新版本到本地,不会自动合并
//1.git fetch origin 抓取克隆后新推送的所有工作
//2.会将数据拉取到本地仓库--并不会自动合并和修改
/*假设:有一个分支设置为跟踪一个远程分支
git pull 自动抓取然后合并远程分支到当前分支
git clone 会自动设置本地master分支,跟踪克隆的远程仓库的master分支
运行git pull---从最初克隆的服务器上抓取数据并自动尝试合并到当前所在分支*/
git pull
从远程获取最新版本并merge到本地
//fetch 完整过程--fetch--diff--merge
推送到远程仓库-push
git push [remote-name] [branch-name]
将master 分支推送到 origin服务器 (master和origin克隆时候自动设置好了)
git push origin master
推送成功
查看远程仓库-show
git remote show [remote-name]
远程仓库的移除与重命名--rename
重命名:
git remote rename wy newwy 将wy更名为newwy
git remote
移除:
git remote rm newwy
git remote
进阶操作
获取最新更改--pull
情景:当有其他人对远程仓库推送过修改的代码,此时你想推送你的修改时,需要先更新本地才能推送
//建议推送前先更新代码
git pull
将本地仓库与远程仓库同步
pull同步后,查看修改的位置,更改后再提交
GIT隐藏操作--Stash
情景:当遇到突发情景,一段时间内不能提交代码,需要保存之前所做的工作,等情况处理完之后才能提交
这个时候就会用到隐藏---修改跟踪文件,阶段更改,并保存一系列未完成的更改,且可随时重新应用
git stash 之后,工作去状态目录为干净
git stash list ---用来查看已存在更改的列表
git stash pop ---当突发情况解决完,想恢复到之前的状态---从堆栈中删除更改并放置在当前工作目录中
移动/重命名操作--mv
需要移动文件/目录的时候 ---- 重命名
git mv 文件 移至文件位置
git mv 原文件 重命名
更改结构后----其他人需要PULL后才能看见结构修改
修正错误
checkout 命令
快速入门里有介绍
删除分段区域的更改
GIT 中 有一个HEAD指针指向最新的提交
想从分段区域撤销更改 使用
git checout head --string.py
---重置工作树,并删除分段更改
用Git复位移动头指针--reset
--soft 选项
--soft
选项后跟提交ID的Git reset命令
那么它将仅重置HEAD指针而不会破坏任何东西。
重置HEAD指针
git reset --soft (commit ID)
//之前那笔待提交还是会在暂存区
--mixed选项
从尚未提交的暂存区域还原修改
git reset -mixed commit ID(7位有效)
--hard选项
将清除分段区域,并且HEAD指针重置为特定提交ID,删除本地修改
//与soft的区别,会清除更改
GIT标签操作
标签---收藏夹--收藏标记的是当前HEAD指针
创建:
git tag -a '标签名称' -m '标签信息'
提交:
提交使用的是对应的 CMMIT ID 非 HEAD指针
git push origin xxx
(提交是提交的tag标签,远程仓库没有变,查看tag标签可以看到那一次记录的快照)
查看标签:
git tag -l 查看所有分支下所有可用的tag(在其他分支上也能看见)
删除标签:git tag -d 标签名
补丁操作
管理分支
用于不同方向上的开发,例如:对新版本2.0的开发,与旧版本1.0的修正
创建分支--branch
git branch <branch name> 从现有分支创建一个新分支
也可以特定提交和标签作为分支创建的起点
没有ID,以HEAD为起点创建
git branch 列出分支
切换分支--checkout,switch
git checkout 分支名
git switch 分支名
创建并切换分支
git checkout -b 分支名
删除分支
git branch -D 删除前必须切换到其他分支才能操作
在当前分支,删除自己所处的分支---无法删除
删除其他分支
重命名分支
git branch -m 旧分支名 新分支名
合并两个分支
方法1
假设:有两个分支 master
*wchar_support
在master分支上做了一些代码修改,现在想将这些修改推送到分支wchar_support
修改文件为 XXX.c
先git add XXX.c 再git commit -m 'xxxx'
git push origin wchar_support(将更改推送到新分支)
git log oringin/wchar_support -2 查看在这个分支上做了什么
方法2--git merge
用于将两个,或者两个以上的开发历史(合并)一起
1.合并分支1 和分支2 在当前分支的顶部,合并
git merge 分支1 分支2
2.合并 分支1 到当前分支--ours
git merge -s ours 分支1
3.合并分支1到当前分支,但不要自动进行新的提交
git merge --no-commit 分支1
4.将分支1合并到当前分支,自动进行新的提交
git merge dev
处理冲突
假设: user1在wchar_support分支中执行更改---修改1
user2在master分支中执行更改---修改2--并推送到origin
此时user2想看wchar_support上分支做了什么,拉取最新情况---此时user1,user2同时GIT---冲突出现
解决冲突:①git diff 查看更多细节
<<<<<<<<<<<<<<<< 和 >>>>>>>>>>>>>>>>>>>>的行
查看冲突出现的具体位置
②选择需要保留的版本手动修改
③对修改后的文件进行提交--再次git pull 即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)