git详解
git详解
基础配置
a.首次使用添加身份说明,使用以下两个命令:
1 | git config --global user.name "你的昵称"git config --global user.email 邮箱@example.com |
b.创建仓库
①在项目文件夹下使用git bash输入
1 | git init |
②使用他人项目创建仓库
1 | git clone 项目url |
状态与提交版本
创建完一个仓库后,会赋予这个仓库每一个文件或目录一个状态
如果是自己创建的,状态均为:未被跟踪
当生成一个版本后,未被跟踪的文件就不会在这个版本里
那么他之前的状态便无法追踪
现在我们可以单独地跟踪一个文件或目录
1 | git add <name> //去跟踪一个文件或目录 |
若一个文件被跟踪,则在这个仓库里会一直被跟踪
解除跟踪:
1 | git rm <name> //解除跟踪 |
或者:
1 | git rm --cache <name> //解除跟踪且保留在目录中 |
接下来就可以对跟踪的文件就行修改,修改完后,将它的状态设置为缓存状态
1 | git add <file-name> |
取消缓存:
1 | gir reset HEAD <name> |
提交:
1 | git commit |
git commit 具体操作
①git commit 进入提交界面,
按” i “键进入输入模式后输入本次提交详情,
然后esc退出编辑模式, 按” : “进入命令栏, 输入”wq”保存并退出.
②git commit -m ‘ 你对提交内容的描述 ‘
③git commit -a
连带未暂存文件一起提交
git commit -am ‘提交描述’
④git reset head~ –soft
取消本次提交,使用该命令取消本次提交, 但是首次提交不可撤回
状态总结:
查看文件状态:
1 | git status |
- 红色:已修改未暂存
- 绿色:暂存
- 提交后,则不显示
查询文件具体修改的位置
1 | git diff |
查看历史提交:
1 | git log |
以一个图形化的方式呈现:
1 | git log --graph |
远程仓库
连接远程仓库:
1 | git remove add (名字) 远程仓库url |
查看连接的远程仓库:
1 | git remote |
改名:
1 | git remote rename 旧名 新名 |
推送到远程仓库:
1 | git push 远程仓库名 master //将本地代码中的master分支推送到远程仓库 |
通过ssh鉴权:
进入到.ssh目录下,执行ssh-keygen生成密钥
1 | ssh-keygen -t rsa -b 4096 -C (邮箱) //-t选择生成密钥的算法,-b选择生成的大小,-C添加评论(Github推荐评论为邮箱) |
后输入这对密钥的名字(eg.test),在ssh目录下会自动生成test.pub(公钥)和test(私钥)
复制公钥,添加到Github
分支
每一个提交生成一个新版本的同时,其实会生成一个提交对象,每个提交对象都有一个独一无二的哈希值。
分支就是一个包含这个哈希值的一个文件,可简单理解为指向一个提交对象的指针,所以我们可以在一个提交对象上新建多个分支。
在我们初始化本地仓库时,就已经创建了一个master分支,当每次进行一个提交的时候,分支也跟着提交对象而向前移动
操作分支:
查看分支:
1
git log //HEAD->当前所处分支
1
git status
创建分支
1
git branch (分支名)
切换分支
1
git checkout (分支名)
1
git checkout -b (分支名) //新建并切换到新分支
分支合并
无冲突合并
在合并至的分支使用
(master)
1 | git merge (分支1) //当前所处master分支,合并了分支1上的修改 |
分支冲突 merge conflict
将 分支2 合并到 master分支 时, 与 分支1 冲突了. 原因是 分支1 和 分支2 修改了同一处内容
git status 查看哪里有冲突
vi 到冲突文件中, 选择一个分支的内容保留下来, 保存退出
git add 文件名
git commit -m ‘提交描述’
git log –all –graph 查看合并状态
推拉与远程跟踪分支
推送
1 | git push 仓库名 分支名 |
或者
1 | git push -u 仓库名 分支名 |
第一次使用 -u 指定推送目标后, 此后可直接使用git push
拉取
1 | git fetch //拉取分支 |
远程分支本地化:
1 | git checkout 远程分支 |
1 | git checkout -b 本地分支名 远程分支 |
1 | git checkout --track 远程分支 |
版本回退
1. reset
此种方式不是很推荐,通过reset
的方式,把head
指针指向之前的某次提交,reset
之后,后面的版本就找不到了。例如我们在开发种一共提交了四次分别是A、B、C、D,此时我们发现操作失误需要回退到B,则使用reset
之后C、D就不再存在与时间线上了。
1 | git reset --hard commit id |
reset
回退操作步骤:
使用git log查找到所需要回退到的版本号,即提交记录的commit id;例如:576223db1ee100a79b4f82d6713cef700d723018;
在客户端执行如下命令(执行前,先将本地代码切换到对应分支)
1
git reset --hard 576223db1ee100a79b4f82d6713cef700d723018`
强制push到对应的远程分支
git push -f -u origin master
或者git push -f
,此时如果用git push
会报错,因为我们本地库HEAD指向的版本比远程库的要旧;
此时,版本回退完成。
此方法不适用于多人共同创作一个项目的情景
2. revert
这种方式不会把版本往前回退,而是生成一个新的版本。所以,你只需要让别人更新一下代码就可以了,你之前操作的提交记录也会被保留下来。例如我们在开发种一共提交了四次分别是A、B、C、D,此时我们发现操作失误需要回退到B,则使用revert
之后会生成一个E版本。
1 | git revert -n commit id |
revert回退操作步骤:
使用git log查找到所需要回退到的版本号,即提交记录的commit id;例如:a53a22f1e8b7ed0c7a9355e8563d234b5b99dd53;
在客户端执行如下命令git revert -n a53a22f1e8b7ed0c7a9355e8563d234b5b99dd53;
使用git commit -m ‘版本回退’进行提交;
git push同步推送到远程仓库即可;
恢复回退
若这个时候突然又发现不需要回退了,刚才那些消失的代码又要重新找回来了,则可以恢复回退
我们可以通过
git reflog
查看本地的操作历史,找到对应的commit id
然后再使用
git reset --hard commit id
就回到之前的操作了