git命令详解和配置
先推荐一个自学git的链接,可以动态的看到分支变化
git学习
1. git配置命令
1.1 设置用户名和邮箱
git首次安装必须要设置一次(只需设置一次),否则无法提交代码;签名的作用是区分不同人的提交人。注:此处设置的用户签名和登录github的账号没有任何关系。
(邮箱虚拟的也可以,git不会验证)
git config --global user.name 用户名
git config --global user.email 用户邮箱
cat ~/.gitconfig #查看是否设置成功
1.2 初始化本地库
目的是让 git 获取目录的管理权
git init
2. git常用命令
2.1 查看本地库状态—git status
红色表示未被追踪的文件
绿色表示已追踪的文件
2.2 添加暂存区—git add
注意,此时还没有生成历史版本
2.3 提交本地库—git commit
将暂存区的文件提交到本地库,形成自己的历史版本
git commit -m "log infomation" filename
这7个字符(9ae05ae)表示版本号
2.4 查看版本信息
- git reflog
9ae05ae—提交的版本号
HEAD—当前的指针
HEAD->master—表示当前的指针指向master - 查看详细信息:git log
2.5 修改文件
git 是按行来追踪文件的,即使修改一行,它也是先删除原来的一行,然后再添加新增的一行
此时可以看到已经有三个提交记录了
2.6 版本穿梭—git reset
如果想回退到之前的结点,可以使用命令
git reset --hard 版本号
可以根据版本号回退到任意一个结点
原理是移动head指针,因为此处只有一个master分支,所以head一直指向master。
3. git分支操作
在版本控制过程中,同时推进多个任务,就可以为每个任务创建单独的分支。使用分支意味着程序员可以把自己的工作从主线上分离出来,开发自己的任务的时候,并不会影响主线分支的运行。
使用分支可以同时并行推进多个功能的开发,提高开发效率;各个分支之间不会影响,如果一个分支开发失败,不会对其它分支造成任何影响。
所谓创建分支的本质就是多穿件一个指针。
如果HEAD指针指向哪个分支,那么当前就在哪个分支上。
git branch 分支名 #创建分支名
git branch -v #查看分支
git branch -d 分支名 #删除分支
git branch -D 分支名 #强制删除分支
git checkout 分支名 #切换分支
git checkout -b 分支名 #创建并切换分支
git merge 分支名 #把指定的分支合并到当前分支上
1.创建分支是基于当前切换的分支创建的,所以两个分支刚开始是一模一样的,版本号也相同
2. 如果master分支没有修改代码,且hot-fix分支是基于master分支创建出来的,那么在hot-fix分支上修改代码再合并到master分支的时候是不会产生冲突的。
3. 如果两个分支在同一个文件的同一个位置有两种不同的修改,那么合并分支的时候就会产生冲突,必须人为解决冲突。产生冲突必须手动打开有冲突的文件,然后人工确认需要保留哪部分的代码。(可以用git status查看哪些文件产生冲突)
4. 冲突代码的格式
<<<<<<<HEAD # 当前分支
当前分支的代码
=======
要合并的代码
>>>>>>>hot-fix # 要合并的分支
#根据实际情况选择要保留的代码,并把>、<、==全部删掉
在修改代码解决完冲突之后还需添加到暂存区,然后执行提交,注:提交的时候不能带文件名,否则会报错,因为git不知道用哪个分支的文件
4. github远程仓库
4.1 创建远程仓库别名
为了方便操作,首先会给远程仓库起别名,来代替一串链接
git remote -v # 查看所有远程地址别名
git remote add 别名 远程地址 # 给远程地址起别名
4.2 推送到远程分支
git push 别名 分支名 # 推送分支到远程
问题描述:不能连接到远程仓库
解决办法:没有秘钥或者ssh秘钥过期了
ssh-keygen
cd ~
cd .ssh/
cat id_rsa.pub
将一串秘钥复制到github仓库即可
添加完之后再次推送即可
4.3 拉取远程分支
git pull 别名 远程分支名 #拉取远程仓库分支的代码
4.4 克隆远程库
克隆相当于:拉取代码、初始化本地仓库、创建别名origin
git clone github链接
如果是别的电脑可以直接克隆仓库,因为是开源的,但是如果想要让其他人能够推送代码则必须要将这个人加入到团队中去。
将邀请函发送给对方,对方登陆github账户后点击邀请函,接收邀请即可。这样不仅可以拉取代码,还可以推送自己修改的代码!
5. git进阶命令
5.1 git rebase
当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。
//将master分支衍合到feature分支
git checkout feature
git rebase master
//这两条命令等价于git rebase master feature
如图,master指基分支、目标分支;feature指待变基分支;衍合完后虚线内的分支就不存在了(和merge不一样)
git merge会合并分支,相当于多了一次提交记录,git rebase是变基操作,就是改变你代码分支的基底(分支是从哪个节点开始的)
//将master分支合并到feature分支
git checkout feature
git merge master
推荐两个链接:
git rebase
git rebase 和 git merge的区别
5.2 版本回退git reset
硬回退
git reset --hard 版本号
git reset --hard HEAD^
#重置 HEAD 指针、index 暂存区和工作区。这个才是完整的版本回退
#如果本次修改未提交,那么硬回退后本次修改永久被删掉了
软回退
git reset --soft 版本号
git reset --soft HEAD^
#仅重置HEAD指针,即只改变 HEAD 的指向,但保持工作区和暂存区不变
#只回退了commit的信息,如果还要提交,直接commit即可;
比如现在有三个提交
我想要将最后两个提交合并为一个提交,那么我首先应该软回退到上一个节点,毕竟我的修改不能丢失,应该执行
git reset --soft HEAD^
此时发现暂存区有个未提交的修改,也就是我们想要合并提交的那个文件
执行
git commit --amend
会将这次的提交追加到上一次的提交日志中,这样后两个提交日志就合并成一个提交了