【Git】

发布于:2024-12-07 ⋅ 阅读:(102) ⋅ 点赞:(0)

1、概述

Git是分布式的,Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。

git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git远程仓库:GitHubGiteeGitLab

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,在文件里加上不想提交的文件或目录。

8、IDEA集成Git

10、资料


网站公告

今日签到

点亮在社区的每一天
去签到