本文参考资料:廖雪峰的GIT教程
快捷使用导航:
廖老师总结的常用命令
github官网
一、什么是Git
Git是分布式版本控制系统,由Linusk开发。其作用可总结为两点:
- 记录代码各个版本间的修改
- 多人协作,代码合并
Git的安装见官网https://git-scm.com/download/win
二、常用操作
1.导入文件
版本库(repository)是git要管理的目录。
- 创建版本库
mkdir <文件目录>
cd <文件目录>
git init
git init为初始化版本库。
- 添加文件
需要在创建的git目录下将文件导入,然后执行下列操作
git add <文件名>
git commit -m "备注"
最终显示1个文件被改动,插入一个,删除一个。
-
重要概念:工作区和暂存区
工作区:存放文件的目录
暂存区:文件add后到这里
master:分支,commit后暂存区的内容提交到分支
可以多次add,一次commit。修改之后,只有add到暂存区再commit才会生效。
2.修改查询
- git diff 查看修改的内容。 git diff HEAD -- <文件名>查看当前提交的和目录下文件的区别。
-
git status 查看目前工作区的状态
修改上述的java文件,在add之前,执行git status命令,结果如下
使用git diff 查看修改了什么,如下图,结果告诉我们从红色改成了绿色。
3.版本回退
- 查看提交历史:git log。回退到过去:log+reset。
- 版本回退:git reset --hard <commit_id> 或者git reset --hard HEAD标识。
-
查看命令历史:git reflog。穿梭到未来:reflog+ reset。
首先通过git log查看提交的历史,结果显示出三个提交历史,并显示了commit时的备注(要好好写备注)。其中head指向的是当前的版本。
要回退版本,有两个方式:(1)使用版本号(commit_id),即log信息里显示的一大串编码。(2)使用HEAD标识,HEAD^标识上个版本,HEAD~N表示往上N个版本。
使用git reset --hard HEAD^操作,并使用cat <文件名>查看当前文件内容。确实回退回来了。
如果后悔回退,可以使用git reflog看一下自己的命令历史,然后找到此前的版本号。
回退到备注为"commit"时的版本。
4.撤销修改
- git checkout -- <文件名>
撤销修改分为以下几种情况: - 工作区修改,未add,撤销后和现存版本库的一样
- 提交到暂存区后修改,未commit,撤销后和提交到暂存区后一样
- 工作区修改后提交到暂存区想撤销工作区的修改:分两步走
step1:先git reset HEAD <文件名>撤销add操作
step2:git chechkout -- <文件名>撤销修改操作 - 已经commit到分支,撤销修改使用版本回退操作
5.删除文件
删除和创建文件的流程相似,先手动删除目录中的文件,再使用命令行
- git rm
- git commit -m "备注"
如果误删,可以使用git checkout -- <文件名>撤销删除操作。
三、github远程仓库
为github账户添加key,可以从本地电脑推送文件到github仓库。
添加key的操作见:
https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416
1.关联github和推送
- git remote add origin git@<github用户名>:path/repo-name.git
- git push -u origin master第一次推送master分支的所有内容;将本地的master和远程的master关联上
-
此后每次修改,git push origin master推送最新修改;
推送Git.java到我的github:
2.从github克隆
- git clone 地址,地址可以在github的clone选项中找到
Git支持多种协议,包括https,但ssh协议速度最快。
四、分支操作
1.分支概述
分支可以实现多人协作,每个人在自己的分支上干活,最后进行合并。
其中,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;干活在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
HEAD指向当前分支
2.分支操作
- 查看分支:git branch
- 创建分支:git branch <name>
- 切换分支:git checkout <name>或者git switch <name>
- 创建+切换分支:git checkout -b <name>或者git switch -c <name>
- 合并某分支到当前分支:git merge <name>
- 删除分支:git branch -d <name>
-
强行删除分支:如果分支没有被合并过,需要删除,使用git branch -D <name>
创建一个分支dev,对文件进行修改后提交。切换为maste分支,发现内容并未改动。
将主分支和dev分支融合,再查看内容,发现内容已改变。
如果分支修改的内容不一致,需要手动解决冲突。
3.冲突解决
- 在master分支上创建一个新的practice.txt文件
- 创建一个新的分支feature1,并在该分支下修改practice文件(增加一列内容:It is Saturday.)提交。
- 切换分支到master,可以看到在master分支显示的还是未修改时的文件内容(即没有“It is Saturday.”)。在master分支下新增最后一行为“It is Sunday.”提交。
-
尝试融合feature1和master两个
打开practice.txt文件,可以看到git帮助我们标记出了两个分支的不同
This is a practice text.
Created by Pengu
Aug.21st, 2022.
<<<<<<< HEAD
It is Sunday.
=======
It is Saturday.
>>>>>>> feature1
在practice.txt文件后更改“It is Sunday, not Saturday.”手动解决冲突,然后提交
-
通过git log --graph --pretty=oneline --abbrev-commit命令查看分支合并情况
显示如下:
- 删除分支feature1
4.bug分支和feature分支
- bug分支,如果要修复bug,要新建bug分支,然后合并,删除bug分支。
- feature分支,开发一个新功能,最好新建一个分支,合并到dev分支上。
四、多人协作
1、各自推送到远程
- git push origin <branch-name>
2、解决冲突
- git pull
先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
五、github操作
- 任意Fork开源仓库到自己的github
- 更改别人的代码后可以pull requests来请求更改别人库里的代码