相关推荐recommended
Git基础命令教程,以及GUI软件TGit介绍
作者:mmseoamin日期:2024-02-06

Git

简介

Git 是一种分布式版本控制系统,广泛用于协同开发和源代码管理.它由Linus Torvalds在2005年创建,最初是为了管理Linux内核的开发而设计的.

Git可以帮助我们实现代码的本地管理和云端同步,本地就是后面的那些基本命令和GUI,云端就通过Git服务器

有以下基本过程

对个人 : 项目文件修改 ->功能完善后add然后commit->连接好远程仓库后push/pull

对团队 : 主要利用分支功能,将不同功能开发创建不同分支.开发好之后合并到一起

下面先介绍Git的目录结构

安装与设置

去Git官方网站下载安装包即可

首先设置你的用户名和邮件地址. 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
git config --list #查看所有配置

Git目录

当创建了Git项目后一般都有的文件

我们自定义Ignore&attributes来实现特定功能

Git通过.git这个隐藏文件夹来储存我们的各种信息

.gitignore

设置文件的忽略规则

让一些文件不被记入仓库的更改中.常见的情况是编译出的可执行文件或中间文件,不需要也不应当出现在代码仓库里.如:

main.exe  	#忽略特定文件
*.exe		#忽略所有exe
!*.cpp 		#忽略cpp以外的文件
build/ 		#忽略这个文件夹

.gitattributes

设置文件的属性,初学可忽略,防止git在文件处理时出错

  1. 文本和二进制文件的处理: 可以指定哪些文件是文本文件,哪些是二进制文件,以便 Git 在进行合并等操作时采取不同的策略.例如,可以告诉 Git 对于某个特定类型的文件,应该使用某种特定的合并策略.

    *.txt   -text
    *.bin   -text
    
  2. 行尾换行符的处理: 可以指定在检出或提交文件时使用的换行符类型,这对于不同操作系统上的协作很有用.例如,可以强制将所有换行符转换为 LF(Unix 格式)或 CRLF(Windows 格式).

    *.sh    eol=lf
    *.txt   text eol=crlf
    
  3. 合并策略的指定: 可以指定在合并文件时使用的合并策略.这对于处理特定类型的文件的合并冲突很有用.

    *.docx merge=word
    
  4. 文件特定的语言统计: 通过.gitattributes文件,可以告诉 Git 在统计代码行数时如何处理文件,以避免将二进制文件的内容计入统计.

    *.png binary
    *.java linguist-language=Java
    

.git

这个目录是 Git 仓库的核心,包含所有的元数据和对象数据库.它通常位于仓库的根目录下,但是默认情况下是隐藏的,即文件名以.开头.不需要用户管理

  1. objects 目录: 用于存储 Git 对象(blob.tree.commit 等).这些对象是 Git 存储文件内容和目录结构的基本单元.
  2. refs 目录: 包含指向各个分支(branches)和标签(tags)的引用,这些引用保存了 Git 仓库中各个提交的哈希值.
  3. logs 目录: 包含引用的变更历史.例如,logs/refs/heads/ 存储了每个分支的修改历史.
  4. hooks 目录: 包含客户端或服务器端的钩子脚本,这些脚本在特定的 Git 事件发生时执行.
  5. HEAD 文件: 指示当前所在的分支.通常是一个指向分支引用的符号链接.
  6. config 文件: 包含 Git 仓库的配置信息,如用户信息.别名等.
  7. index 文件: 包含了当前工作目录状态的缓存信息,即将要提交的文件的信息.

状态

目录内文件用角标来表示状态

符号说明:

  1. 正常的:绿色的对号 Git基础命令教程,以及GUI软件TGit介绍,img,第1张
  2. 被修改过的:红色感叹号 Git基础命令教程,以及GUI软件TGit介绍,img,第2张
  3. 新添加的:蓝色的加号Git基础命令教程,以及GUI软件TGit介绍,img,第3张
  4. 未受控的(无版本控制的):蓝色的问号Git基础命令教程,以及GUI软件TGit介绍,img,第4张
  5. 忽略不受控的:灰色的减号Git基础命令教程,以及GUI软件TGit介绍,img,第5张
  6. 删除的:红色的x号 Git基础命令教程,以及GUI软件TGit介绍,img,第6张
  7. 有冲突的:黄色的感叹号 **Git基础命令教程,以及GUI软件TGit介绍,img,第7张

Git服务器

用于储存代码

github和gitlab,另外还有国内的gitee,这里不介绍了

  • Git是一种版本控制系统,是一种工具,用于代码的存储和版本控制.
  • GitHub是一个基于Git实现的在线代码仓库,是目前全球最大的代码托管平台,可以帮助程序员之间互相交流和学习.
  • GitLab是一个基于Git实现的在线代码仓库软件,你可以用GitLab自己搭建一个类似于GitHub一样的仓库,但是GitLab有完善的管理界面和权限控制,一般用于在企业.学校等内部网络搭建Git私服.
  • GitHub和GiLlab两个都是基于Web的Git远程仓库,它们都提供了分享开源项目的平台,为开发团队提供了存储.分享.发布和合作开发项目的中心化云存储的场所.从代码的私有性上来看,GitLab 是一个更好的选择.但是对于开源项目而言,GitHub 依然是代码托管的首选.

    命令

    创建

    init 初始化当前目录为git库

    git init
    

    clone 创建在已有的代码基础上

    git clone https://github.com/killsime/gitTest.git
    

    修改

    提交

    add 添加到暂存区

    git add file.cpp
    git add . #当前目录的所有文件
    git add --all #当前目录下的文件以及文件夹内的文件
    

    reset 从暂存区删除

    git reset
    git reset .
    

    status 查看暂存区

    git status
    

    确认暂存区无误后可以进行提交

    commit

    git commit  #弹出文本编辑器,将要提交的取消注释
    git commit -m "commit message" #直接提交
    git commit --amend #修改上次提交
    

    提交后可进行恢复和删除

    回退

    回退项目

    先git log 查询当前分支提交日志

    commit 87908935339fa31e36e97507c28289b352f000d4 (HEAD -> master, origin/master, third)
    # head指向当前分支,后面列出了所有分支,如果推送过远程仓库还会像orign这样标注
    Author: killsime 
    Date:   Mon Dec 25 19:01:22 2023 +0800
                new file:   .gitattributes
                new file:   .gitignore
                new file:   test.bmp
    

    第一行即为该次commit的hash码,用于回退版本时使用(reset)

    git reset 87908#不用全写,只要能区分就好,至少四位
    

    撤回回退

    先git reflog查询引用(references)变更日志 ,整个全局的提交,回退,分支切换的日志

    # 该次操作目标的提交hash值 分支列表,操作的分支为绿色 当前head 日志索引 描述信息
    fd6ed09 (HEAD -> master) HEAD@{0}: reset: moving to fd6e
    1c7886b HEAD@{1}: commit: new file: BMP.bmp
    fd6ed09 (HEAD -> master) HEAD@{2}: commit (initial): new file: TXT.txt
    

    这是两次提交后reset到第一次提交的日志,可以查看第二次commit的hash

    git reset 1c788
    

    分支

    branch,用来管理分支,日志种用head来表示当前分支

    git branch 			#查看所有分支
    git branch test		#创建test分支
    git branch -d test  #删除test分支
    

    checkout,切换分支,必须在所有的修改被提交后才能切换

    git checkout test
    

    合并分支,将test合并到master中,冲突部分以master为准

    $ git checkout master
    $ git merge test
    

    推送

    git remote -v #fetch和push历史
    # 添加远程仓库,pb和origin分别是起的昵称,分别使用https和SSH进行添加,一般我们用SSH.二者区别以及SSH建立教程可以看最后
    git remote add pb https://github.com/paulboone/ticgit 
    git remote add origin git@github.com:wihn2021/git-tut.git
    # push和pull
    git push origin master
    git pull origin master
    

    官方文档Git - Book

    TGit

    因为命令行可能相对门槛较高,所以我们可以通过GUI界面来进行git管理

    这里我们使用 TortoiseGit

    软件安装好后,就可以右键创建git库了

    跟上面Git一样,空的或者从github上克隆

    如果克隆提示No supported authentication methods available

    需要将TGit中setting->network->ssh client换成git/usr/bin/ssh.exe

    其他的类似需要通过命令的操作都可以通过右键菜单来进行了,也不必多唠叨

    SSH与HTTPS

    对比

    二者都是建立加密连接,我们这里选择ssh,具体原因如下

    特点/优缺点

    **ssh:**一般使用22端口;通过先在本地生成SSH密钥对再把公钥上传到服务器;速度相较慢点

    **https:**一般使用443端口;通过用户名/密码授权,可用性比较高;速度相较快点

    使用区别

    ssh

    clone:需要配置ssh key,即要将生成的SSH密钥对的公钥上传至服务器;

    push:不需要验证用户名和密码,直接push即可;

    http

    clone:没有要求,可以直接克隆下来.

    push:需要验证用户名和密码.

    总结

    HTTPS利于匿名访问,适合开源项目,可以方便被别人克隆和读取,push需要登陆

    SSH不利于匿名访问,比较适合内部项目,只要配置了SSH公钥极可自由实现clone和push操作.

    SSH生成密钥

    这里是连接github的教程

    1. 打开终端或命令提示符窗口.

    2. 输入以下命令,并按回车键执行:

      ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
      
    3. 提示你输入保存密钥的文件路径,默认为~/.ssh/id_rsa,直接按回车键即可.

    4. 提示你输入一个密码,这是可选的,如果你想要为密钥添加密码保护,可以输入一个密码.如果不需要密码保护,直接按回车键跳过.

    5. 生成密钥对成功后,终端会显示公钥的路径和指纹.该文件夹下一个公钥(.pub),一个私钥

    6. 将公钥复制到剪贴板中:

      clip < %USERPROFILE%/.ssh/id_rsa.pub
      
    7. 添加公钥,【头像】→【Settings】→【SSH and GPG Keys】→【New SSH Key】,填入上一步的复制的SSHKey,然后【Add SSH Key】