Git
概念
- Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型地各种项目。
- Git易于学习、占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCase等版本控制工具。
何为版本控制
- 版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
- 版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
💌分布式的版本控制出现以后,解决了集中式版本控制系统的缺陷?
- 服务器断网的情况下也可以进行开发(因为版本控制式在本地进行的)
- 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
为什么要版本控制
有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。
Git工作机制
Git基本常用命令:
创建本地文件夹:mkdir <文件夹名>
创建本地文件:touch <文件名>
显示当前的目录:pwd
删除工作区文件:git rm <文件名>
移动或重命名工作区文件:git mv <源文件名> <改后文件名>
查看文件更改了什么内容:git diff <文件名>
查看历史:git log
回退到上一个版本:git reset --hard HEAD^100 或者 git reset --hard HEAD~100
(如果想回退到100个版本,使用git reset --hard HEAD~100 )
查看XX文件内容:cat XX
git stash:把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list:查看所有被隐藏的文件列表
git stash apply:恢复被隐藏的文件,但是内容不删除
git stash drop:删除文件
git stash pop:恢复文件的同时 也删除文件
Git和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
- 局域网
- GitLab
- 互联网
- GitHub(外网)
- Gitee码云(国内网站)
设置用户签名
💌签名的作用:
区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户名,否则无法提交代码。
❗注意:这里设置用户名签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系。
1.设置用户名:
git config --global user.name <用户名>
2.设置用户名邮箱:
git config --global user.email <用户名邮箱>
3.查看设置:
git config --list
文件状态
💌查看文件状态
查看所有文件状态:git status
查看指定文件状态:git status <文件名>
💌文件的四种状态
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
- Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
- Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
- Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified1.Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
历史版本
💌查看历史版本
- git reflog 查看版本信息
- git log 查看详细版本信息
💌版本穿梭
- git reset --hard 版本号
查看系统config: git config --system --list
查看当前用户(global)配置: git config --global --list
❗注意:Git切换版本,低层其实是移动的HEAD指针,具体原型如下图
分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支,使用分支意味着程序员可用把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。(分支低层其实也是指针的引用)
💌分支的好处
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可
💌创建与合并分支
查看分支:git branch
查看远程分支:git branch -r
创建分支(但依然停留在当前分支):git branch <分支名>
创建并切换分支:git checkout –b <分支名>
切换分支:git checkout <分支名>
合并某分支到当前分支:git merge <分支名>
删除分支:git branch –d <分支名>
删除远程分支:
1.git push origin --delete <远程分支名>
2.git branch -dr [remote/branch]
💌删除分支
❗注意:不能删除当前分支,只能删除其他分支
git branch -d <分支名> : 删除分支时,需要做各种检查
git branch -D <分支名> : 不做任何检查,强制删除
💌冲突产生的原因
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个,必须人为决定新代码的内容。
简单来说:就假如我们分别在两个分支上修改同一个文件,分别提交致本地库,然后在其中一个分支里执行合并操作,发现不能合并
💌解决冲突
1.编辑有冲突的文件,删除特殊符号,决定要使用的内容
- 特殊符号:
- <<<<<<<HEAD 当前分支的代码
- ========
- 合并过来的代码:>>>>>>> 另一个分支名
2.添加到暂存区
git add 文件名
3.执行提交(注意:吃屎使用git commit命令时不能带文件名)
git commit -m "这里边写什么都可以"
❗注意:合并分支只会修改你合并的那个分支,不会修改合并过的分支
删除文件
💌git rm与git rm --cached:
- 当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用
git rm file_path
git commit -m 'delete somefile'
git push
- 当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用
git rm --cached file_path
git commit -m 'delete remote somefile'
git push
团队内协作和跨团队协作
- 团队内协作
- 跨团队协作
配置Git忽略文件
- Eclipse特定文件
- IDEA特定文件
- Maven工程的target目录
💌为什么要忽略他们?
- 与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽开发工具之间的差异
💌怎么忽略?
- 创建忽略规则文件xxxx.ignore(前缀名随便起,建议是git.ignore)
这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig文件引用,建议也放在用户家目录下- 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文件中引用忽略配置文件(此文件在Windows的家目录中)
[core]
excludesfile=忽略配置文件的路径
❗注意:这里要使用“正斜线( / )”,不要使用“反斜线( \ )”
配置SSH公钥
💌生成SSH公钥
- ssh-keygen -t rsa
- 不断回车
- 如果公钥已经存在,则自动覆盖
- Gitee设置用户公钥
-
获取公钥
- cat ~/.ssh/id_rsa.pub
- cat ~/.ssh/id_rsa.pub
-
验证是否配置成功
- ssh -T git@gitee.com
-
操作远程仓库
git remote:查看远程库的信息
git remote –v:查看远程库的详细信息
git remote show <远程仓库>:显示某个远程仓库的信息
git remote rm <远程仓库名>:删除远程仓库
git remote rename <源仓库名> <改后仓库名>:修改仓库名
💌添加远程仓库
此操作是先初始化本地库,然后与已创建的远程库进行对接
- 命令:git remote add <远端名称> <仓库路径>
- 远端名称,默认是origin,取决于远端服务器设置
- 仓库路径,从远端服务器获取此URL
- 例如: git remote add origin git@gitee.com:mydercode/trytrytrytry.git
💌查看远程仓库
- 命令:git remote
💌推送到远程仓库
- 命令:
git push [ -f ] [--set-upstream] [远端名称[本地分支名][:远端分支名]]
- 如果远程分支名和本地分支名称相同,则可以只写本地分支
- git push origin master
-f 表示强制覆盖
--set-upstream
推送到远端的同时并且建立起和远端分支的关联关系git push --set-upstream origin master
- 如果当前分支已经和远端分支关联,则可以省略分支名和远端名
git push 将master分支推送到已关联的远端分支
- 如果远程分支名和本地分支名称相同,则可以只写本地分支
💌本地分支与远程分支的关联关系
- 查看关联关系我们可以用
git branch -vv
命令
💌从远程仓库克隆
如果已经有一个远端仓库,我们可以直接clone到本地
- 命令:
git clone <仓库路径> [本地目录]
- 本地目录可以省略,会自动生成一个目录
💌从远程仓库中抓取和拉取
远程分支和本地分支一样,我们可以进行merge操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
- 抓取命令:
git fetch [remote name] [branch name]
- 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并
- 如果不指定远端名称和分支名,则抓取所有分支
- 拉取命令:
git pull [remote name] [branch name]
- 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
- 如果不指定远端名称和分支名,则抓取所有并更新当前分支