赞
踩
目录
参考:尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)_哔哩哔哩_bilibili
《GitHub入门与实践》 ——大塚弘记
课程内容:
Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
集中式版本控制工具 :CVS、SVN(Subversion)、VSS……
集中化的版本控制系统诸如 CVS、SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式就是每个人手里都有一份自己的历史记录,而集中式只是集中服务器上有所有人的记录
add
)到暂存区commit
)到本地库后才会生成历史版本工作区和暂存区的代码是可以被删掉的,没有历史记录和历史版本
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
可以使用push
将本地库的代码推送到远程库
设置用户签名:签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
想更改这些信息时,可以直接编辑设置文件“~/.gitconfig”。这里设置的姓名和邮箱地址会用在Git的提交日志中。由于在GitHub上公开仓库时,这里的姓名和邮箱地址也会随着提交日志一同被公开,所以请不要使用不便公开的隐私信息。
git config --global color.ui auto
将color.ui设置为auto可以让命令的输出拥有更高的可读性。“~/.gitconfig”中会增加下面一行。
git init
让git获得目录的管理权。
建议直接从需要操作的目录中进入git bash
此时可以在文件夹下看到.git文件夹(有可能隐藏了),其中的文件不能随便修改
注:git bash中的命令是和linux通用的
.git目录里存储着管理当前目录内容所需的仓库数据。在Git中,我们将这个目录的内容称为“附属于该仓库的工作树”。
git status
在main分支下,当前没有提交(空)
- vim hello.txt
- // i 进入编辑模式
- // Esc后 yy是复制,p粘贴
- // :wq保存退出
使用cat 文件名
可以在bash中查看当前工作区存在的文件
未追踪的文件
可以使用git add
追踪(添加到暂存区) (use "git add <file>..." to include in what will be committed)
git add hello.txt
git默认转换了换行符
此时文件存在于工作区&暂存区。是可以删除且不显示历史版本的 (use "git rm --cached <file>..." to unstage)
只删除了暂存区的,工作区依然存在
如果不改变暂存区的文件,只把工作区文件删除:
git会记录操作历史,可以用git restore xx
恢复文件或手动将其从缓存区删除
git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。
git commit -m "版本日志" 文件名
fd66e69
是版本号
刚才我们只简洁地记述了一行提交信息,如果想要记述得更加详细,请不加-m,直接执行git commit
命令。执行后编辑器就会启动,并显示如下结果。
在编辑器中记述提交信息的格式如下。
中止提交:如果在编辑器启动后想中止提交,请将提交信息留空并直接关闭编辑器,随后提交就会被中止。
当文件夹中所有文件都提交到本地库后:
git reflog
指针指向第二个版本
git log
详细日志不仅可以看到不同版本,还能看到是谁提交的(显示用户签名),此时显示的版本号是完整的版本号
模拟企业中版本和代码的迭代
修改文件后查看状态,可以看到修改记录,但此次修改还未加入暂存区
git是按行维护文件的,修改了其中的一行就会显示一行被修改(把修改之前的删掉,插入修改之后的)
- git reflog //查看版本信息(显示的版本号是精简版的)
- git log //查看版本详细信息(显示完整版本号)
- git log --pretty=short //仅显示第一行简述信息
- git log --graph //可视化显示版本信息
只要在git log命令后加上目录名,便会只显示该目录下的日志。如果加的是文件名,就会只显示与该文件相关的日志。
- git log hello.txt //查看关于该文件的改动
- git log -p hello.txt //查看该文件改动前后的差别
git diff
查看工作树、暂存区、最新提交之间的差别。
git diff
命令,如果工作树和暂存区的状态并无差别,什么都不会显示git diff HEAD
在执行git commit命令之前先执行git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的HEAD是指向当前分支中最新一次提交的指针。
如果想要切换到之前的版本,可以先查看对应的版本号,
复制:Ctrl + Insert ;粘贴:Shift + Insert
鼠标快捷键:复制是双击左键 粘贴是鼠标中键
之后:
git reset --hard f6ad36c
打开.git文件夹下的HEAD文件,可以看到ref: refs/heads/main
,表明指针指向main,目前处在main分支上
打开".git\refs\heads\main"文件可以看到当前指向的提交版本的哈希值。
版本穿梭会直接刷新工作区当前的文件内容
Git 切换版本,底层其实是移动的 HEAD 指针,而不是创造很多副本
- git ls-tree --full-tree -r HEAD //列出正在跟踪的所有已提交文件
- git ls-files //列出存储库中的所有文件,包括仅暂存但尚未提交的文件。
版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。
- git checkout -b feature-A
-
- //或者
- git branch feature-A
- git checkout feature-A
在feature-A分支修改文件后查看状态,此时工作区存在未提交的hello.txt。需要重复添加暂存区-提交本地库的过程
.git中的HEAD文件
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 无法替我们决定使用哪一个。必须人为决定新代码内容。
在(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(最新提交)在内的两个最新历史记录为对象,并在编辑器中打开。
使用rebase后编辑内容:
这样一来,Fix typo就从历史中被抹去,也就相当于Add feature-C中从来没有出现过拼写错误。这算是一种良性的历史改写。
最后合并feature-C分支
需要用到代码托管中心,把代码推送到远程服务器
fork 将代码从其他团队的远程库复制到自己的远程库,可以从自己的远程库clone。修改完成后push到自己的远程库。之后发送pull request向其他团队的远程库,经审核后即可使用merge合并
GitHub上连接已有仓库时的认证,是通过使用了SSH的公开密钥认证方式进行的。
输入密码后会出现以下结果。(也可以不设置密码,直接点回车)
.ssh文件夹中会出现两个文件:id_rsa文件是私有密钥,id_rsa.pub是公开密钥。
在GitHub中添加公开密钥,今后就可以用私有密钥进行认证了。
查看id_rsa.pub的内容:
复制内容,在github中连接
确认连接github成功:
建议远程库的名字和本地库相同
在Initialize this repository with a README选项上打钩,随后GitHub会自动初始化仓库并设置README文件,让用户可以立刻clone这个仓库。如果想向GitHub添加手中已有的Git仓库,建议不要勾选,直接手动push。
这个设定会帮我们把不需要在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
仓库地址:https://github.com/用户名/Hello-World
README.md
会在初始化时生成好,README.md文件的内容会自动显示在仓库的首页当中。因此,人们一般会在这个文件中标明本仓库所包含的软件的概要、使用流程、许可协议等信息。
起别名:远程地址太长了
git push 别名 分支
推送的最小单位是分支
git推送的完整写法如下:
- git push @remoteName @localBranch:@remoteBranch
-
- // eg.remoteName:origin localBranch:ceshi remoteBranch:test
- git push origin ceshi:test
但是如果本地分支与远程分支名字一样的话,是可以简写的。
- $ git pull <远程主机名> <远程分支名>:<本地分支名> //本地分支与远程分支名字一样,可以简写
- $ git pull <ssh链接> <远程分支名>:<本地分支名>
clone和pull不需要登录帐号,公共库的读取权限没有限制
不需要初始化本地库
与pull的区别:pull要求本地已经有文件
clone 会做如下操作:1、拉取代码。2、初始化本地仓库。3、创建别名
填入需要邀请的人之后会获得一个链接,被邀请人可以通过点击链接加入
一些文件与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 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
文件
也可以直接在IDE中安装.ignore插件
以pycharm为例:
VCS: version control setting
项目文件夹下出现.git文件,表示配置完成
且可以看到项目中文件变红
,在git中表示“untracked”状态,还未被加入暂存区
选择后会变绿。表示已添加到暂存区,但未提交本地库。
也可以右键项目根目录add
新建文件时会自动提示是否添加暂存区
之后可以选择commit(提交),会自动忽略ignore中的文件。commit成功后文件会变回黑色
IDEA 使用的是 git checkout <commit> 的方式进行的版本切换
(IDEA中追踪过的文件可以不add直接commit)
当前的HEAD指针指向main,main分支指向second版本。切换版本可以直接选定版本右键checkout
图中hot-fix master分别表示不同分支指向的版本,HEAD表示当前指针指向的分支
创建分支:在文件夹上点击右键/点击右下角分支标志
切换分支:右下角点击分支图标
合并分支:
点击右下角分支图标,切换到master分支,之后
冲突合并:
手动修改到中间的result栏
安装github插件→settings中选择github,连接账号→VCS(Git)选择github,在github上共享项目
push 是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push 的操作是会被拒绝的。要想 push 成功,一定要保证本地库的版本要比远程库的版本高。在动手改本地代码之前,一定先检查下远程库跟本地代码的区别,如果本地的代码版本已经落后,要先 pull 一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送。
pull 是拉取远端仓库代码到本地,如果远程库代码和本地库代码不一致,会自动合并,如果自动合并失败,还会涉及到手动解决冲突的问题。
当文件过大时可以使用Git Large File Storage (LFS)
- git lfs install
- git lfs track "*.pt"
- git add .gitattributes
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。