文章目录
一、Git操作的四大区域
- workspace:工作区
- staging area:暂存区
- local repository:版本库
- remote repository:远程仓库
二、Git基本操作
git init
git init
把当前目录变成一个git托管的初始化仓库,在该目录下会有一个.git的隐藏文件,表示初始化成功
#1.配置提交代码的用户名
$ git config --global user.name northcastle
#2.配置邮箱提交代码的邮箱
$ git config --global user.email northcastle@163.com
这里配置的全局用户名和邮箱,和远程仓库账号信息是不相关的,这里设置是提交代码的用户标识,因为远程库的项目由很多人去共同开发,我们得知道代码是谁提交的,辨别就靠上面的全局配置
git add
git add "HelloController.java"
把HelloController.java文件提交到暂存区。
git add .
会把当前目录下所有untrack的文件和之前已经add但后来修改过的文件都加入暂存区,并且会根据.gitignore做过滤。
git commit
git commit -m "git忽略约束文件" ".gitignore"
把.gitignore文件上传到本地库中,并添加提示信息
git push
git push origin master
origin是远程仓库地址的别名(别名是远程库地址的标记,要提前设置,后面展示),master是你要推送的本地库分支,如果远程仓库没有这个分支,那么也会新建一个该分支
git push pj first:master
pj也是远程仓库地址的别名,first是你要推送的本地库分支,指定推送到远程库中的master分支,如果远程库还没有master分支,则会新建一个master分支
git rm
git rm --cached <file>
如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中
三、远程库操作
远程库地址
有了远程库的地址我们才能进行本地库和远程库的交互,但远程库地址太长太难记,我们一般会起别名,通过别名访问远程库
git remote
git remote -v
查看远程库地址是否有别名
git remote add pmc https://github.com/pmc7758/gitstudy.git
把远程库地址 https://github.com/pmc7758/gitstudy.git 起一个 pmc 的别名,再次查看时,有两行提示,fetch表示能通过pmc拉取代码,push表示能通过pmc上传代码
四、Git分支管理
git branch
git branch first
在本地库当前分支下创建一个 first 新分支,该新分支拥有和当前分支一样的文件树
git branch [-r][-a]
没有参数则列出本地所有的分支
[-r] 可以列出远程库所有的分支
[-a] 查看所以分支
git checkout
git checkout first
切换到 first 分支上,并在工作区保留上一个分支未add和commit的文件,如果在first分支下commit工作区内的文件,则会上传到first分支下,再一次切回上一个分支,该在first分支下commit文件不会出现在现在的分支下,也就是工作区、暂存区是和本地版本库隔离开的,在该分支下add文件不是上传到了该个分支下的暂存区,而是所有的本地版本库都连着同一个暂存区,commit才是决定上传到哪一个版本库的关键
# 删除本地分支
git branch -d 本地分支名称
# 删除远程分支
git push origin --delete 远程分支名称
五、状态查看
git log
git log
查看历史提交记录
git status
git status
查看仓库当前的状态,显示有变更的文件
六、.gitignore文件
在git托管的仓库第一级目录下创建一个.gitignore文件,可以忽略里面规则约束的文件
#.gitignore文件内容
6.java # 表示不需要托管这个文件
*.java # 表示不需要托管以java为后缀名的文件
!Helloworld.java # 但Helloworld.java文件要托管
resource/ # 表示这个文件下的所有文件都不需要托管
七、冲突解决
造成冲突的原因:两个开发者对同一个文件的同一行做了修改,如果是一个开发者对同一行修改并不会造成冲突,还有就是合并分支的时候,如果两个分支下同时修改同一文件的同一位置并提交到本地库,想要合并的时候就会出现冲突(创建新分支是在旧分支的基础上复制粘贴的)
切换分支冲突
我们在工作区的文件(未add)和未提交到本地版本库的文件(未commit),这些文件在切换分支的时候会随着到别的分支,如果两个分支在同一文件同一行的内容不一样就会报错
原来dev分支A文件没有成员属性,加了之后A文件就变成了未commit,切换分支发生冲突,点击Smart checkout
我们两个结果都要
这里要注意,解决冲突切换到pj分支后,pj分支的本地版本库的代码并没有变,因为此时解决冲突后的A文件还在暂存区,并不会影响到当前pj本地版本库,你commit了才会改变。
有时候是我们误操作了,本来在dev分支时候没注意有代码没提交到版本库,或者我还不想把当前代码commit到本地版本库急需切换到pj分支去参考一下代码,这时候该怎么办?紧接上面所在的pj分支,A文件还是没有commit,我急需切换到dev分支参考别人的代码,这时候如果不做任何操作就切换,肯定会出现之前dev->pj的问题。
我们不想合并,因为这一部分冲突我们不想带到切换结果分支上,我们可以暂存到本地库。(
不同分支的版本库不会因为切换分支而产生冲突
)
点击create Stash之后,再切换到dev分支则不会出现冲突,因为未commit的A文件被暂存到了版本库,我们再参考完dev分支后切换回pj分支,点击:
未commit的代码就回来了
分支合并冲突
dev版本库A文件内容
pj版本库A文件内容
如果dev合并pj分支,就会发生冲突,因为两个分支上的A文件第10行不一样
小结
我们切换分支之前一定要把自己的功能代码给commit到本地版本库或暂存到版本库,不然有可能会出错或冲突
每一个分支都有自己的一个版本库,不同分支对应不同版本库
合并冲突的产生原因是两个版本库的同一文件上的同一行代码不一样
八、实用技巧
创建一个空白分支
git checkout --orphan mains
git rm -rf .
创建一个mains分支,并清空,也就是创建了一个空白分支
版本回退
git log
# 回退到倒数第二次commit的版本
git reset --hard 0e84f66ba78b068ce76fb79a2eb0c7d82a5ae518
九、idea整合git的一些问题
修改了文件但没有commit,马上切换分支
出现的问题以及解析