1、概述
Git是分布式的,Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。
git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
2、版本控制器的方式
- 集中式版本控制工具
集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。
举例:SVN和CVS - 分布式版本控制工具
分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需要联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的修改了。
举例:Git
3、Git 安装
3.1 Mac
Mac 通常自带 Git,若没有可使用 homebrew
来安装:
brew install git
Git 官网 还提供了一些其他的安装方式。
4、Git 工作流程图
命令如下:
- clone(克隆): 从远程仓库中克隆代码到本地仓库
- checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
- add(添加): 在提交前先将代码提交到暂存区
- commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
- fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
- pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于
fetch+merge - push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
5、Git 常用命令
5.1 基本配置
查看配置信息
git config --global user.name git config --global user.email
设置用户信息
git config --global user.name "zhangsan" git config --global user.email "lisi@abc.cn"
设置初始分支名称
git config --global init.defaultBranch master
Git 中文乱码问题
git config –global core.quotepath false git config –global gui.encoding utf-8 git config –global i18n.commitencoding utf-8 git config –global i18n.logoutputencoding utf-8
5.2 查看提交记录
git log [option]
option:
- 基本选项:
--oneline
:将每个提交压缩成一行显示,通常与 --graph 一起使用以显示分支和合并历史。--graph
:以 ASCII 图形方式显示分支和合并历史。--decorate
:在提交的摘要旁边显示额外的信息,如分支名称和标签。--all
:显示所有引用(分支和标签)的提交历史。--since
和--until
:根据日期范围过滤提交。例如,–since=“2 weeks ago”。--author
和--committer
:根据作者或提交者的名字过滤提交。--grep
:根据提交消息中的文本模式过滤提交。
- 格式化选项:
--pretty
:指定输出格式。常用的格式有 oneline、short、full、fuller 和 format:。例如,–pretty=format:“%h - %an, %ar : %s”。--abbrev-commit
:显示提交的简短哈希值而不是完整的 40 个字符。
- 高级选项:
S<string>
:查找提交中引入或删除特定字符串的更改。-G<regex>
:查找提交中引入或删除与给定正则表达式匹配的更改。--merges
:仅显示合并提交。--no-merges
:不显示合并提交。--follow
:跟踪文件的历史记录,即使文件已被重命名。-L <start>,<end>:<file>
:显示特定文件特定行范围的变化历史。
- 合并选项:
--stat
:显示每个提交更改的文件统计信息。--numstat
:以数字格式显示文件更改统计信息,适合脚本处理。--shortstat
:给出每个提交的简短统计信息。--summary
:给出每次提交的摘要统计信息。
- 限制选项:
-n <number>
或--max-count=<number>
:限制显示的提交数量。--skip=<number>
:跳过指定数量的提交。--since
和--until
:按日期过滤提交。--after
和--before
:与 --since 和 --until 类似,但用于更灵活的日期指定。
- 远程和引用选项:
<branch>、<tag>、<commit>
:直接指定要显示的提交的引用(如分支名、标签名或提交哈希)。--remotes
:显示远程跟踪分支的提交历史。--refs/heads/<pattern>
、--refs/tags/<pattern>
:按模式匹配显示特定的分支或标签。
示例:
- 显示所有分支的提交历史,以一行格式显示,并装饰以分支名称:
git log --oneline --graph --decorate --all
- 显示过去两周内由特定作者提交的更改:
git log --since="2 weeks ago" --author="John Doe"
- 显示包含特定字符串的提交消息:
git log --grep="fix bug"
- 显示文件的历史记录,包括重命名:
git log --follow -- path/to/file
git log 的选项可以组合使用,以创建满足特定需求的输出。## 5.2 项目初始化
会在当前目录下创建一个 .git
目录,即本地仓库
git init
5.3 查看修改的状态
git status
5.4 添加工作区到暂存区
# 添加工作区一个或多个文件的修改到暂存区
git add 单个文件名|通配符
# 将所有修改提交到暂存区
git add .
# 撤销暂存
git rm --cached <文件>...
5.5 管理远程仓库
- 查看已有的远程仓库
# 列出当前仓库中所有的远程仓库名称 git remote # 查看当前仓库的所有远程仓库的详细信息,包括名称和对应的 URL。 git remote -v git remote --verbose
- 添加远程仓库
git remote add 远程仓库简称 远程仓库地址 # 添加一个新的远程仓库 git remote add origin https://github.com/username/repo.git
- 删除远程仓库
# 删除一个已经存在的远程仓库 git remote remove 远程仓库名称 git remote rm 远程仓库名称
- 重命名远程仓库
git remote rename <远程仓库原简称> <远程仓库新简称>
- 修改远程仓库的 URL
git remote set-url 远程仓库名称 新URL # 修改远程仓库origin的仓库地址 git remote set-url origin https://github.com/newusername/repo.git
- 查看远程仓库的详细信息
# 显示指定远程仓库的详细信息,包括分支情况、跟踪的分支、拉取和推送的 URL 等。 git remote show <名称>
- 更新远程仓库的引用
# 更新指定远程仓库的引用(即本地仓库记录远程仓库的最新状态) git remote update <名称>
- 移除已不存在于远程仓库的分支
git remote prune <名称>
- 模拟执行操作而不实际改变仓库状态
-n 或 --dry-run
- prune操作
# 与 update 命令结合使用时,会同时执行 prune 操作 -p 或 --prune
5.6 从远程仓库中克隆代码到本地仓库
git clone url
5.7 提交暂存区内容到本地仓库的当前分支
git commit -m '注释内容'
5.8 拉取远程代码
git fetch [remote name] [branch name]
: 从远程库抓取到本地仓库,不进行任何的合并动作,一般操作比较少。# 若不指定远程名称与分支名,则抓去所有分支 git fetch
git pull
:从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于
fetch+merge
5.9 推送代码 git push
修改完成后,需要和团队成员共享代码时,将本地仓库的代码推送到远程仓库(记得先commit)。
git push [<选项>] [<仓库> [<引用规格>...]]
-v, --[no-]verbose 更加详细
-q, --[no-]quiet 更加安静
--[no-]repo <仓库> 仓库
--[no-]all 推送所有分支
--[no-]branches --all 的别名
--[no-]mirror 镜像所有引用
-d, --[no-]delete 删除引用
--[no-]tags 推送标签(不能使用 --all or --branches or --mirror)
-n, --[no-]dry-run 演习
--[no-]porcelain 机器可读的输出
-f, --[no-]force 强制更新
--[no-]force-with-lease[=<引用名>:<期望值>]
要求引用旧的取值为设定值
--[no-]force-if-includes
要求远程更新在本地被整合
--[no-]recurse-submodules (check|on-demand|no)
控制子模组的递归推送
--[no-]thin 使用精简打包
--[no-]receive-pack <receive-pack>
接收包程序
--[no-]exec <receive-pack>
接收包程序
-u, --[no-]set-upstream
设置 git pull/status 的上游
--[no-]progress 强制显示进度报告
--[no-]prune 清除本地删除的引用
--no-verify 绕过 pre-push 钩子
--verify 与 --no-verify 相反
--[no-]follow-tags 推送缺失但有关的标签
--[no-]signed[=(yes|no|if-asked)]
用 GPG 为推送签名
--[no-]atomic 需要远端支持原子事务
-o, --[no-]push-option <server-specific>
传输选项
-4, --ipv4 只使用 IPv4 地址
-6, --ipv6 只使用 IPv6 地址
示例:
# 如果远程分支名和本地分支名称相同,则可以只写本地分支
git push origin master
# 推送到远端的同时并且建立起和远端分支的关联关系
git push --set-upstream origin master
# 如果当前分支已经和远端分支关联,则可以省略分支名和远端名
git push
5.10 管理本地分支 git branch
- 查看分支
# 查看本地分支, # 不显示分支信息的移步:https://blog.csdn.net/qq_39698985/article/details/141767718 git branch # 查看本地分支与远程分支的关联关系 git branch -vv
- 创建分支
git branch 分支名
- 删除分支
# 删除分支时,需做各种检查 git branch 分支名 -d b1 # 不做任何检查,强制删除分支 git branch 分支名 -D b1
- 分支重命名
git branch -m <name>
5.11 切换分支 git checkout
- 切换分支
git checkout <branch>
- 创建新分支并切换
git checkout -b <new-branch>
- 恢复文件修改
git checkout -- <file> # 将文件 index.html 恢复到最近一次提交时的状态,丢弃工作目录中的更改 git checkout -- index.html
- 撤销文件修改(完全)
# 将文件 <file> 恢复到最近一次提交时的状态,并且将修改的内容从暂存区和工作目录中完全删除 git checkout HEAD <file>
- 切换到历史版本
# 切换历史版本,工作目录和代码库将会回滚到目标提交时的状态 # <commit> 是要切换到的目标提交的哈希值 # 此时,HEAD 会处于“分离头指针”状态,即不再位于任何分支上 git checkout <commit>
- 恢复特定提交中的文件状态
# 从指定提交中恢复特定文件的状态 git checkout <commit> -- <file> # 覆盖当前工作目录中的 first.py 文件,并将其还原为指定提交 81768b740cb2785327a239b1fd42fca19d8c81d 的版本。 git checkout 981768b740cb2785327a239b1fd42fca19d8c81d -- .\first.py
- 切换到远程分支并创建本地跟踪分支
# 可以切换到远程仓库的某个分支,并在本地创建一个与之跟踪的新分支 git checkout -b <local-branch> <remote>/<remote-branch> # 切换到远程仓库的 dev 分支,并在本地创建一个名为 local_dev 的新分支,跟踪远程的 dev 分支 git checkout -b local_dev origin/dev
- 丢弃所有本地修改
# 丢弃当前目录下所有文件的本地修改,并还原成最近一次提交的版本。 # 这个操作会覆盖工作目录中的所有更改,因此在使用前需要谨慎确认。 git checkout .
5.12 合并分支 git merge
git merge <branch>
合并指定分支到当前分支,常用选项:
--no-ff
:禁用 Fast-forward 合并。即使当前分支没有新的提交,也会创建一个新的合并提交,使合并历史更加清晰。--squash
:将要合并的分支的所有提交压缩成一个新的提交,使历史记录更加简洁。--strategy
或-s
:指定合并策略。Git 提供了多种合并策略,比如默认的 recursive 合并策略,或者 ours 和 theirs 合并策略。--no-commit
:不自动提交合并后的代码。Git 只会将合并的结果显示在工作区,不进行提交,给用户一个机会来检查合并的结果并进行修改。--edit
或-e
:在创建合并提交之前编辑提交信息。这样可以方便地修改合并提交的信息,如标题、描述等。--abort
:取消当前的合并操作。如果在合并过程中遇到问题,可以使用此参数取消正在进行的合并操作。-X theirs
:在合并时,如果遇到冲突,自动选择目标分支(即被合并分支)的更改。-X ours
:在合并时,如果遇到冲突,自动选择当前分支的更改。
5.13 回退版本 git reset
git reset soft|hard commitID
:回退版本--soft 撤回commit并保留修改的代码 --hard 撤回commmit且删除所有修改过的代码 这个慎用奥
5.14 查看已删除的提交记录
git reflog
6、本地项目如何推送到 Github
- 第一步,本地新建项目
demo
- 第二步,进行初始化:
zs@Mac demo % git init zs@Mac demo % git add . zs@Mac demo % git commit -m "Initial commit"
- 第三步,Github上创建一个空白项目
demo
- 第四步,绑定远程仓库,推送代码
zs@Mac demo % git remote add origin https://github.com/username/demo.git # main为分支名,可通过 git branch 查询当前分支 zs@Mac demo % git push -u origin main
7、忽略文件提交
在项目下新建文件 .gitignore
,在文件里加上不想提交的文件或目录。