【笔记】Git及Github使用

目录

Git概述及安装

Git常用命令

设置用户签名(姓名和邮箱地址)

“~/.gitconfig”

初始化本地库

查看本地库状态

本地文件添加到暂存区

提交本地库,形成历史版本

修改文件

历史版本信息

版本穿梭(回溯历史版本)

查看当前本地库中所有文件

Git分支操作

创建分支

合并分支

解决冲突的流程

压缩历史(更改历史)

团队协作

团队内协作

跨团队协作

github使用前准备

设置SSH Key

添加公开密钥

创建仓库(Repository)

github操作

本地库代码推送到远程库(push)

pull

clone

加入团队

pull request

IDEA 集成 Git

配置 Git 忽略文件

定位 Git 程序

切换版本

分支操作

IDEA集成github


参考:尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)_哔哩哔哩_bilibili

          《GitHub入门与实践》 ——大塚弘记

课程内容:

【笔记】Git及Github使用_第1张图片

Git概述及安装

Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。

集中式版本控制工具 :CVS、SVN(Subversion)、VSS……

集中化的版本控制系统诸如 CVS、SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。

缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。

像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。

分布式就是每个人手里都有一份自己的历史记录,而集中式只是集中服务器上有所有人的记录

【笔记】Git及Github使用_第2张图片

  • 工作区:本地存放代码的位置,存放本地写的代码
  • 暂存区:临时存储,可将工作区的代码添加(add)到暂存区
  • 本地库:将暂存区的代码提交(commit)到本地库后才会生成历史版本

工作区和暂存区的代码是可以被删掉的,没有历史记录和历史版本

代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。

可以使用push将本地库的代码推送到远程库

【笔记】Git及Github使用_第3张图片

Git常用命令

设置用户签名(姓名和邮箱地址)

【笔记】Git及Github使用_第4张图片

设置用户签名:签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。

想更改这些信息时,可以直接编辑设置文件“~/.gitconfig”。这里设置的姓名和邮箱地址会用在Git的提交日志中。由于在GitHub上公开仓库时,这里的姓名和邮箱地址也会随着提交日志一同被公开,所以请不要使用不便公开的隐私信息。

“~/.gitconfig”

git config --global color.ui auto

将color.ui设置为auto可以让命令的输出拥有更高的可读性。“~/.gitconfig”中会增加下面一行。

【笔记】Git及Github使用_第5张图片

初始化本地库

git init

让git获得目录的管理权。

建议直接从需要操作的目录中进入git bash

此时可以在文件夹下看到.git文件夹(有可能隐藏了),其中的文件不能随便修改

【笔记】Git及Github使用_第6张图片

注:git bash中的命令是和linux通用的

.git目录里存储着管理当前目录内容所需的仓库数据。在Git中,我们将这个目录的内容称为“附属于该仓库的工作树”。

查看本地库状态

git status

【笔记】Git及Github使用_第7张图片

在main分支下,当前没有提交(空)

vim hello.txt
// i 进入编辑模式
// Esc后 yy是复制,p粘贴
// :wq保存退出

使用cat 文件名可以在bash中查看当前工作区存在的文件

【笔记】Git及Github使用_第8张图片

未追踪的文件

可以使用git add追踪(添加到暂存区) (use "git add ..." to include in what will be committed)

本地文件添加到暂存区

git add hello.txt

git默认转换了换行符

【笔记】Git及Github使用_第9张图片

此时文件存在于工作区&暂存区。是可以删除且不显示历史版本的 (use "git rm --cached ..." to unstage)

只删除了暂存区的,工作区依然存在

如果不改变暂存区的文件,只把工作区文件删除:

【笔记】Git及Github使用_第10张图片

git会记录操作历史,可以用git restore xx恢复文件或手动将其从缓存区删除

提交本地库,形成历史版本

git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。

git commit -m "版本日志" 文件名

【笔记】Git及Github使用_第11张图片

fd66e69是版本号

刚才我们只简洁地记述了一行提交信息,如果想要记述得更加详细,请不加-m,直接执行git commit命令。执行后编辑器就会启动,并显示如下结果。

【笔记】Git及Github使用_第12张图片

在编辑器中记述提交信息的格式如下。

  • 第一行:用一行文字简述提交的更改内容
  • 第二行:空行
  • 第三行以后:记述更改的原因和详细内容

【笔记】Git及Github使用_第13张图片

中止提交:如果在编辑器启动后想中止提交,请将提交信息留空并直接关闭编辑器,随后提交就会被中止。


当文件夹中所有文件都提交到本地库后:

git reflog

指针指向第二个版本

git log

详细日志不仅可以看到不同版本,还能看到是谁提交的(显示用户签名),此时显示的版本号是完整的版本号

【笔记】Git及Github使用_第14张图片

修改文件

模拟企业中版本和代码的迭代

【笔记】Git及Github使用_第15张图片

修改文件后查看状态,可以看到修改记录,但此次修改还未加入暂存区

【笔记】Git及Github使用_第16张图片

git是按行维护文件的,修改了其中的一行就会显示一行被修改(把修改之前的删掉,插入修改之后的)

【笔记】Git及Github使用_第17张图片

历史版本信息

git reflog //查看版本信息(显示的版本号是精简版的)
git log //查看版本详细信息(显示完整版本号)
git log --pretty=short //仅显示第一行简述信息
git log --graph //可视化显示版本信息

只要在git log命令后加上目录名,便会只显示该目录下的日志。如果加的是文件名,就会只显示与该文件相关的日志。

  • git log命令只能查看以当前状态为终点的历史日志
  • git reflog命令可以查看当前仓库的操作日志。
git log hello.txt //查看关于该文件的改动
git log -p hello.txt //查看该文件改动前后的差别

git diff查看工作树、暂存区、最新提交之间的差别。

【笔记】Git及Github使用_第18张图片

  • 执行git diff命令,如果工作树和暂存区的状态并无差别,什么都不会显示
  • 要查看与最新提交的差别,执行git diff HEAD

在执行git commit命令之前先执行git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的HEAD是指向当前分支中最新一次提交的指针。

版本穿梭(回溯历史版本)

如果想要切换到之前的版本,可以先查看对应的版本号,

复制:Ctrl + Insert ;粘贴:Shift + Insert

鼠标快捷键:复制是双击左键 粘贴是鼠标中键

之后:

git reset --hard f6ad36c

【笔记】Git及Github使用_第19张图片

打开.git文件夹下的HEAD文件,可以看到ref: refs/heads/main,表明指针指向main,目前处在main分支上

打开".git\refs\heads\main"文件可以看到当前指向的提交版本的哈希值。

版本穿梭会直接刷新工作区当前的文件内容
Git 切换版本,底层其实是移动的 HEAD 指针,而不是创造很多副本

【笔记】Git及Github使用_第20张图片

查看当前本地库中所有文件

git ls-tree --full-tree -r HEAD  //列出正在跟踪的所有已提交文件
git ls-files  //列出存储库中的所有文件,包括仅暂存但尚未提交的文件。

Git分支操作

【笔记】Git及Github使用_第21张图片

版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。

【笔记】Git及Github使用_第22张图片

创建分支

git checkout -b feature-A

//或者
git branch feature-A
git checkout feature-A

【笔记】Git及Github使用_第23张图片

【笔记】Git及Github使用_第24张图片

在feature-A分支修改文件后查看状态,此时工作区存在未提交的hello.txt。需要重复添加暂存区-提交本地库的过程

【笔记】Git及Github使用_第25张图片

.git中的HEAD文件

【笔记】Git及Github使用_第26张图片

git checkout - //可以表示切换到上一个分支

合并分支

要转到想要合并到的分支上,git merge 要合并的分支

git merge --no-ff feature-A

为了在历史记录中明确记录下本次分支合并,我们需要创建合并提交。所以使用--no-ff

Git 合并时 --no-ff 的作用_Double-Injured的博客-CSDN博客_git 快进式合并

git merge和git merge --no-ff的区别 图解易懂_阿喵阿旺的博客-CSDN博客

【Git学习笔记5】以普通模式合并(--no-ff)、push到远程库及分支管理策略_小詹学 Python的博客-CSDN博客


什么时候会遇到合并冲突:

冲突产生的原因:

合并分支时,两个分支在同一个文件有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。

【笔记】Git及Github使用_第27张图片

【笔记】Git及Github使用_第28张图片

(main|MERGING)情况下使用vim hello.txt查看文件具体冲突内容

此时提交到本地库不可以带文件名

合并时只会修改main分支下的内容,feature-A不会被修改

git commit --amend  // 修改提交信息

解决冲突的流程

合并时出现冲突,分支显示为:(main|MERGING)

(main|MERGING)情况下使用vim hello.txt查看文件具体冲突内容,并对其进行修改

之后重新加入缓存区&提交本地库。提交本地库时不可以带具体文件名

git merge no- ff fix-B

不加no-ff表示fast forward合并方式,no- ff表示不使用fast forward

压缩历史(更改历史)

在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,可以提交一个修改,将这个修改包含到前一个提交之中,压缩成一个历史记录。

git commit -am "Add feature-C" 
//只能提交已经追踪过且修改了的文件,新增文件需要add+commit

git rebase -i HEAD~2
//用上述方式执行git rebase命令
//可以选定当前分支中包含HEAD(最新提交)在内的两个最新历史记录为对象,并在编辑器中打开。

【笔记】Git及Github使用_第29张图片

使用rebase后编辑内容:

【笔记】Git及Github使用_第30张图片

【笔记】Git及Github使用_第31张图片

这样一来,Fix typo就从历史中被抹去,也就相当于Add feature-C中从来没有出现过拼写错误。这算是一种良性的历史改写。

最后合并feature-C分支

团队协作

需要用到代码托管中心,把代码推送到远程服务器

  • push 将代码上传到远程库
  • clone 将代码复制到本地
  • pull 将代码拉取到本地(pull 是本地已有文件,clone是本地无源代码)
  • fork 将代码从其他团队的远程库复制到自己的远程库

团队内协作

【笔记】Git及Github使用_第32张图片

跨团队协作

【笔记】Git及Github使用_第33张图片

fork 将代码从其他团队的远程库复制到自己的远程库,可以从自己的远程库clone。修改完成后push到自己的远程库。之后发送pull request向其他团队的远程库,经审核后即可使用merge合并

github使用前准备

什么是SSH? - 知乎

设置SSH Key

GitHub上连接已有仓库时的认证,是通过使用了SSH的公开密钥认证方式进行的。

【笔记】Git及Github使用_第34张图片

输入密码后会出现以下结果。(也可以不设置密码,直接点回车)

【笔记】Git及Github使用_第35张图片

.ssh文件夹中会出现两个文件:id_rsa文件是私有密钥,id_rsa.pub是公开密钥。

添加公开密钥

在GitHub中添加公开密钥,今后就可以用私有密钥进行认证了。

查看id_rsa.pub的内容:

复制内容,在github中连接

【笔记】Git及Github使用_第36张图片

确认连接github成功:

【笔记】Git及Github使用_第37张图片

创建仓库(Repository)

【笔记】Git及Github使用_第38张图片

【笔记】Git及Github使用_第39张图片

建议远程库的名字和本地库相同

在Initialize this repository with a README选项上打钩,随后GitHub会自动初始化仓库并设置README文件,让用户可以立刻clone这个仓库。如果想向GitHub添加手中已有的Git仓库,建议不要勾选,直接手动push。

  • 可以在初始化时自动生成.gitignore文件。该文件用来描述Git仓库中不需管理的文件与目录。

这个设定会帮我们把不需要在Git仓库中进行版本管理的文件记录在.gitignore文件中,省去了每次根据框架进行设置的麻烦。下拉菜单中包含了主要的语言及框架,选择今后将要使用的即可。

# no .a files 
# 忽略所有.a文件
*.a

# but do track lib.a, even though you're ignoring .a files above
# 表示不忽略(跟踪)匹配到的lib.a文件或目录
!lib.a

# only ignore the TODO file in the current directory, 
# 只忽略当前目录中的TODO文件,而不是子目录/TODO
not subdir/TODO /TODO

# ignore all files in the build/ directory
# 忽略build/目录中的所有文件
build/

# ignore doc/notes.txt, but not doc/server/arch.txt
# 忽略doc/notes.txt,但不要忽略doc/server/arch.txt
doc/*.txt

# ignore all .pdf files in the doc/ directory
# 忽略doc/目录下的所有。pdf文件
doc/**/*.pdf
  • Add a license:许可协议

仓库地址:https://github.com/用户名/Hello-World

  • README.md会在初始化时生成好,README.md文件的内容会自动显示在仓库的首页当中。因此,人们一般会在这个文件中标明本仓库所包含的软件的概要、使用流程、许可协议等信息。

【笔记】Git及Github使用_第40张图片

起别名:远程地址太长了

【笔记】Git及Github使用_第41张图片

github操作

本地库代码推送到远程库(push)

git push 别名 分支

推送的最小单位是分支

git推送的完整写法如下:

git push @remoteName  @localBranch:@remoteBranch   
    
// eg.remoteName:origin  localBranch:ceshi  remoteBranch:test   
git push origin ceshi:test 

但是如果本地分支与远程分支名字一样的话,是可以简写的。

pull

$ git pull <远程主机名> <远程分支名>:<本地分支名>  //本地分支与远程分支名字一样,可以简写
$ git pull  <远程分支名>:<本地分支名>

【笔记】Git及Github使用_第42张图片

clone

clone和pull不需要登录帐号,公共库的读取权限没有限制

不需要初始化本地库

与pull的区别:pull要求本地已经有文件

clone 会做如下操作:1、拉取代码。2、初始化本地仓库。3、创建别名

加入团队

【笔记】Git及Github使用_第43张图片

填入需要邀请的人之后会获得一个链接,被邀请人可以通过点击链接加入

pull request

【笔记】Git及Github使用_第44张图片

IDEA 集成 Git

配置 Git 忽略文件

一些文件与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之

间的差异。

创建忽略规则文件 xxxx.ignore(前缀名随便起,建议是 git.ignore)。这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig 文件引用,建议也放在用户家目录下。C:\Users\ROG

git.ignore 文件模版内容如下:

# Compiled class file 
*.class
# Log file 
*.log 
 
# BlueJ files 
*.ctxt 
 
# Mobile Tools for Java (J2ME) 
.mtj.tmp/ 
 
# Package Files # 
*.jar 
*.war 
*.nar 
*.ear 
*.zip 
*.tar.gz 
*.rar 
 
# virtual machine crash logs, see 
http://www.java.com/en/download/help/error_hotspot.xml 
hs_err_pid* 
 
.classpath 
.project 
.settings 
target 
.idea 
*.iml

之后需要在.gitconfig文件(也在家目录)中引用.ignore文件

【笔记】Git及Github使用_第45张图片

也可以直接在IDE中安装.ignore插件

【笔记】Git及Github使用_第46张图片

定位 Git 程序

以pycharm为例:

【笔记】Git及Github使用_第47张图片

【笔记】Git及Github使用_第48张图片

VCS: version control setting

项目文件夹下出现.git文件,表示配置完成

且可以看到项目中文件变红

【笔记】Git及Github使用_第49张图片

,在git中表示“untracked”状态,还未被加入暂存区

【笔记】Git及Github使用_第50张图片

选择后会变绿。表示已添加到暂存区,但未提交本地库。

也可以右键项目根目录add

新建文件时会自动提示是否添加暂存区

【笔记】Git及Github使用_第51张图片

之后可以选择commit(提交),会自动忽略ignore中的文件。commit成功后文件会变回黑色

【笔记】Git及Github使用_第52张图片

切换版本

IDEA 使用的是 git checkout 的方式进行的版本切换

(IDEA中追踪过的文件可以不add直接commit)

【笔记】Git及Github使用_第53张图片

【笔记】Git及Github使用_第54张图片

当前的HEAD指针指向main,main分支指向second版本。切换版本可以直接选定版本右键checkout

分支操作

图中hot-fix master分别表示不同分支指向的版本,HEAD表示当前指针指向的分支

创建分支:在文件夹上点击右键/点击右下角分支标志

切换分支:右下角点击分支图标

合并分支

点击右下角分支图标,切换到master分支,之后

【笔记】Git及Github使用_第55张图片

冲突合并

【笔记】Git及Github使用_第56张图片

【笔记】Git及Github使用_第57张图片

手动修改到中间的result栏

IDEA集成github

安装github插件→settings中选择github,连接账号→VCS(Git)选择github,在github上共享项目

【笔记】Git及Github使用_第58张图片

push 是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push 的操作是会被拒绝的。要想 push 成功,一定要保证本地库的版本要比远程库的版本高。在动手改本地代码之前,一定先检查下远程库跟本地代码的区别,如果本地的代码版本已经落后,要先 pull 一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送。

pull 是拉取远端仓库代码到本地,如果远程库代码和本地库代码不一致,会自动合并,如果自动合并失败,还会涉及到手动解决冲突的问题。

LFS

当文件过大时可以使用Git Large File Storage (LFS)

git lfs install
git lfs track "*.pt"
git add .gitattributes

你可能感兴趣的:(github,git)