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项目后一般都有的文件
我们自定义Ignore&attributes来实现特定功能
Git通过.git这个隐藏文件夹来储存我们的各种信息
设置文件的忽略规则
让一些文件不被记入仓库的更改中.常见的情况是编译出的可执行文件或中间文件,不需要也不应当出现在代码仓库里.如:
main.exe #忽略特定文件 *.exe #忽略所有exe !*.cpp #忽略cpp以外的文件 build/ #忽略这个文件夹
设置文件的属性,初学可忽略,防止git在文件处理时出错
文本和二进制文件的处理: 可以指定哪些文件是文本文件,哪些是二进制文件,以便 Git 在进行合并等操作时采取不同的策略.例如,可以告诉 Git 对于某个特定类型的文件,应该使用某种特定的合并策略.
*.txt -text *.bin -text
行尾换行符的处理: 可以指定在检出或提交文件时使用的换行符类型,这对于不同操作系统上的协作很有用.例如,可以强制将所有换行符转换为 LF(Unix 格式)或 CRLF(Windows 格式).
*.sh eol=lf *.txt text eol=crlf
合并策略的指定: 可以指定在合并文件时使用的合并策略.这对于处理特定类型的文件的合并冲突很有用.
*.docx merge=word
文件特定的语言统计: 通过.gitattributes文件,可以告诉 Git 在统计代码行数时如何处理文件,以避免将二进制文件的内容计入统计.
*.png binary *.java linguist-language=Java
这个目录是 Git 仓库的核心,包含所有的元数据和对象数据库.它通常位于仓库的根目录下,但是默认情况下是隐藏的,即文件名以.开头.不需要用户管理
目录内文件用角标来表示状态
符号说明:
用于储存代码
github和gitlab,另外还有国内的gitee,这里不介绍了
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: killsimeDate: 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
因为命令行可能相对门槛较高,所以我们可以通过GUI界面来进行git管理
这里我们使用 TortoiseGit
软件安装好后,就可以右键创建git库了
跟上面Git一样,空的或者从github上克隆
如果克隆提示No supported authentication methods available
需要将TGit中setting->network->ssh client换成git/usr/bin/ssh.exe
其他的类似需要通过命令的操作都可以通过右键菜单来进行了,也不必多唠叨
二者都是建立加密连接,我们这里选择ssh,具体原因如下
**ssh:**一般使用22端口;通过先在本地生成SSH密钥对再把公钥上传到服务器;速度相较慢点
**https:**一般使用443端口;通过用户名/密码授权,可用性比较高;速度相较快点
ssh
clone:需要配置ssh key,即要将生成的SSH密钥对的公钥上传至服务器;
push:不需要验证用户名和密码,直接push即可;
http
clone:没有要求,可以直接克隆下来.
push:需要验证用户名和密码.
HTTPS利于匿名访问,适合开源项目,可以方便被别人克隆和读取,push需要登陆
SSH不利于匿名访问,比较适合内部项目,只要配置了SSH公钥极可自由实现clone和push操作.
这里是连接github的教程
打开终端或命令提示符窗口.
输入以下命令,并按回车键执行:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
提示你输入保存密钥的文件路径,默认为~/.ssh/id_rsa,直接按回车键即可.
提示你输入一个密码,这是可选的,如果你想要为密钥添加密码保护,可以输入一个密码.如果不需要密码保护,直接按回车键跳过.
生成密钥对成功后,终端会显示公钥的路径和指纹.该文件夹下一个公钥(.pub),一个私钥
将公钥复制到剪贴板中:
clip < %USERPROFILE%/.ssh/id_rsa.pub
添加公钥,【头像】→【Settings】→【SSH and GPG Keys】→【New SSH Key】,填入上一步的复制的SSHKey,然后【Add SSH Key】