Git入门
参考资料
https://www.imooc.com/learn/1052
https://www.liaoxuefeng.com/
https://www.cnblogs.com/qdhxhz/p/9757390.html
Git简介
-
概念
Git 是一个开源的分布式版本控制系统。版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。(快照)
-
集中式VS分布式
版本控制系统分为集中式版本控制系统、分布式版本控制系统集中式:
中央服务器保存所有文件的修订版本,其他设备工作时从中央服务器取出最新版本,然后改完后,传回去。
集中化的版本控制系统存放的是项目版本与版本之间的差异
中央服务器挂了?
分布式:
每一个服务器都有一个把代码仓库完整地镜像下来,而不是只有最新版本。
分布式的版本控制系统存的是索引
图片来源:https://www.liaoxuefeng.com/ -
git仓库结构
HEAD:指向 master 的一个指针
workspace:工作区
index:暂存区/缓存区
repository:本地仓库
remote repository:远程仓库
下载安装
git官网下载地址:
https://git-scm.com/downloads
本地仓库
操作目录
#新建一个新目录
$ mkdir demo3
#查看当前所在目录绝对路径
$ pwd
/d/Java/MyRepositories/demo3
#进入目录
$ cd ../ #返回上一级
$ cd demo3 #进入demo3
#列出目录下所有文件,加上-a显示隐藏文件
$ ls -a
./ ../ .git/ test1.txt test2.txt
#列出当前文件或目录的详细信息(等价于 ls -l)
$ ll
total 2
-rw-r--r-- 1 Mathilda 197121 11 9月 3 18:13 test1.txt
-rw-r--r-- 1 Mathilda 197121 12 9月 3 18:14 test2.txt
配置 config
- 设置、查看账户(用户名和邮箱)
- 安装完成后立即配置
#设置账户
$ git config --global user.name "tom"
$ git config --glabal user.email "tom@163.com"
#查看账户
$ git config --list
初始化 init
- 初始化本地仓库(即把这个目录变成Git可以管理的仓库)
$ git init
增加、查看文件 touch, echo, cat
- 操作本地仓库文件
#新建文件
$ touch test3.txt
#把“first test”追加到test1.txt中(没有时,先自动创建该文件,并追加内容)echo
$ echo "first test1" >> test1.txt
#查看文件内容cat
$ cat test1.txt
first test1
提交文件 add, commit
- 提交文件到本地仓库
#从工作区添加到暂存区add
$ git add test1.txt
#从暂存区提交到本地仓库commit
# -m "fisrt commit" 提交说明,必须要有!
$ git commit -m "fisrt commit"
[master (root-commit) 313e2b0] fisrt commit
1 file changed, 1 insertion(+)
create mode 100644 test1.txt
1、可以先多次add,最后一起commit
2、有多个文件添加进了暂存区,只提交一个文件时,最后要加上对应文件名
$ git commit -m “fisrt commit” test1.txt
状态 status
- 查看当前分支的工作区和暂存区的状态
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
test2.txt
On branch master
nothing to commit, working tree clean
uncommited:已有的,刚被修改尚未提交的
untracked:未跟踪的,不参与版本控制
历史 log,reflog
- 查看历史
#查看提交历史log
$ git log
#查看提交历史(在一行显示)
$ git log --pretty=oneline
#查看提交历史(在一行显示,更简洁)
$ git log --oneline
#查看命令历史reflog
$ git reflog
1、由近到远
2、使用场景不同:
·回退到以前版本,用git log可以查看提交历史,以便确定要回退到哪个版本
·要恢复到未来版本,用git reflog查看命令历史,以便确定要恢复到未来的哪个版本
3、空格:下一页 b:上一页 q:退出
版本回退 reset
- 版本回退
#指针不动,回退到暂存区
$ git reset HEAD
#指针移动,回退到上一个版本
$ git reset --hard HEAD^
#指针移动,回退到上上个版本
$ git reset --hard HEAD^^
#指针指向d85a888,回退到暂存区和工作区
$ git reset --hard d85a888
HEAD is now at 313e2b0 fisrt commit
1、HEAD指向当前版本
2、三个参数:
–mixed 默认参数,表示指针移动的同时,重置暂存区,工作区不动
–hard 表示本地库的指针移动的同时,重置暂存区,重置工作区
–soft 表示指针移动的同时,暂存区,工作区都不动
比较 diff
- 比较文件修改
#查看单个文件的修改情况(工作区与暂存区比较)
$ git diff test1.txt
#查看所有文件的修改情况(工作区与暂存区比较)
$ git diff
#查看单个文件修改情况(工作区与本地仓库比较)
git diff 历史版本 文件名
$ git diff 313e2b07f759a30a139a8a39bef46e1e085cb318 "test1.txt"
$ git diff HEAD test1.txt
撤销修改 reset, checkout
- 撤销修改
#丢弃已添加到暂存区的修改,恢复到添加到暂存区前的状态
$ git reset HEAD test1.txt
#丢弃工作区修改,恢复到文件修改前状态(用版本库里的版本替换工作区的版本)
$ git checkout -- test1.txt
1、三种情况下的撤销操作:
(1)修改了工作区文件:用命令git checkout – file
(2)修改文件已添加到暂存区:分两步,第一步用命令git reset HEAD ,就回到了(1),第二步按(1)步骤操作。
(3)修改文件已提交到本地仓库:详见上面版本回退
删除 rm
- 删除文件
$ rm test2.txt
$ git rm test1.txt
删除命令rm VS git rm详解:
https://blog.csdn.net/qq_42780289/article/details/98353792
- 找回删除文件
与版本回退同理
远程仓库
SSH公钥
生成、查看本机SSH公钥:
https://www.runoob.com/w3cnote/view-ssh-public-key.html
关联远程仓库
- 关联 add
$ git remote add origin 远程仓库的SSH/HTTPS地址
- 删除(取消关联)rm
$ git remote rm origin
1、其中orgin是远程仓库默认名称。若想使用其他名字,直接替换掉orgin即可
eg:$ git remote add github 远程仓库的SSH/HTTPS地址
2、若本地仓库需关联多个远程仓库的时候,利用不同的远程仓库名进行区分
$ git remote add github 远程仓库的SSH/HTTPS地址
$ git remote add gitee 远程仓库的SSH/HTTPS地址
- 查看本地仓库关联的远程仓库信息 -v
$ git remote -v
推送 push
git push 远程仓库名 本地分支名
#第一次把本地仓库master分支推送到远程仓库orgin中(必须加上 -u)
$ git push -u origin master
#推送操作
$ git push origin master
#强制push(远程仓库会丢失,慎用)
$ git push -u origin master -f
push时可能出现的错误:
$ git push origin master
To github.com:michaelliao/learngit.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to ‘git@github.com:michaelliao/learngit.git’
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in ‘git push --help’ for details.
解决办法:
先pull, 再push
拉取 pull
#远程分支orgin与当前分支合并
$ git pull origin master
#git 默认拒绝合并无关的历史 fatal: refusing to merge unrelated histories 在git push, git merge时也可能出现
#加上--allow-unrelated-histories,允许合并不相关的历史
$ git pull origin master --allow-unrelated-histories
运行 $ git pull origin master --allow-unrelated-histories时,会进入如下页面,该页面显示“请输入提交消息来解释为什么这种合并是必要的”。
若想直接退出,直接输入 :wq
克隆 clone
$ git clone 远程仓库的SSH/HTTPS地址
默认情况下,从远程clone到本地的库只能看到master分支
分支管理
查看分支
$ git branch
新建
$ git branch dev
切换分支
$ git checkout dev
$ git switch dev
新建并切换
$ git checkout -b dev
$ git switch -c dev
删除
$ git branch -d dev
合并分支
$ git merge feature
解决合并冲突
详见https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344