Git
前言
git是一个开源的分布式版本控制系统,它能帮助你管理不同的版本,并且随时退回到任意时刻,而且也可以协同开发。之前也学过一点git,不过那阵用不到git,而且学的也比较琐碎难以理解,现在在我有一定基础的情况下,重新学习git,写下这份博客用以记录学习内容。Git指令繁多,但是常用的就十几条,下述介绍的指令掌握了足以应对常规使用,新的指令也会慢慢学习记录。
基本使用
初始化一个仓库
1 | git init |
将当前目录变成Git可以管理的仓库,当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的。
提交
先将文件加入暂存区
1 | git add <filename> |
可以使用
1 | git add . |
将所有文件都加入暂存区
然后,把文件提交到仓库
1 | git commit -m <message> |
在此过程中,为了时刻掌握仓库状态,可以使用
1 | git status |
也可以查看提交日志
1 | git log |
如果一次add后还没来得及commit,此时后悔了,则可以把文件从暂存区撤下,但是文件内容还是更改之后的形式
1 | git reset <filename> |
文件状态
文件一共有四种状态
untracked:表示新建立的文件,之前没有被commit过
unmodified:表示仓库文件,文件被commit后的状态
modified:文件被更改之后,内容有了变更的状态
staged:暂存区文件,等待commit一起提交
工作区和版本库
图示的很明晰
回退
当commit提交到仓库的时候,想回到上一个版本就可以使用
1 | git reset <commitID> |
这里commitID是commit每个操作的hash值,也有另一种表示方式
在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
1 | git reset --hard HEAD^ |
表示返回上一个版本,–hard是一个参数
现在来说明reset的参数:
–hard:不保留所有变更
–soft:保留变更且变更内容处于staged
–mixed:保留变更且变更内容处于modified
(不带参数,默认就是mixed)
Git提供了一个命令,用来记录你的每一次命令
1 | git reflog |
分支
1 | git checkout -b <name><template> |
该命令用于新建一个分支,name是新建分支的名称,template为模板分支,如果不填,则以现在分支为模板
1 | git branch |
用于显示所有的分支,当前分支前面会标一个*
号。
1 | git checkout <branchName> |
用于切换分支
1 | git branch -d <branchName> |
用于删除分支
合并
合并分支变更
1 | git merge <branchName> |
合并有很多方式,具体内容使用可知
解决冲突
当两个分支都做了修改,现在要将其合并一起,就会产生冲突,必须手动解决冲突后再提交
git status
也可以告诉我们冲突的文件
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容
远程仓库
将远程仓库下载到本地,远程仓库的默认名称是origin
1 | git clone <Clone with SSH > |
要查看远程库的信息,用
1 | git remote |
或者,显示更详细的信息:
1 | git remote -v |
上面显示了可以抓取和推送的origin
的地址。如果没有推送权限,就看不到push的地址。
可以在本地自建分支
1 | git checkout -b <branchName> |
然后将分支上传到远程仓库
第一次上传会没有上流分支而失败,所以使用
1 | git push --set-upstream origin <branchName> |
之后就可用git push
上传更改到上流分支
协同开发
当多人对一个远程仓库开发时,都会在本地新建一个分支并在远程仓库上传分支,此时远程仓库是不断更新的,因为有多人不同时git push
想要获得此时远程仓库的状态,可使用
1 | git fetch |
如果此时发现有人在远程仓库新建了一个分支,而这个分支是本地没有的,则可以使用
1 | git checkout <branchName> |
切换并下载该分支
如果发现你的本地仓库比远程仓库老旧,需要更新,可以使用
1 | git pull |
注意:如果你在git push
时发现远程仓库是最新版,即别人git push
了,而你的更改是对上一版的更改,此时就会产生冲突,你可以git pull
将最新版下载下来,手动在本地解决冲突,然后再git push
变基
实际应用中,或许存在这种情况,当你使用的分支源于某个模板分支,你已经在自己分支上进行过commit了,发现模板分支有被commit更新过,这个时候你想要将自己分支源于旧模板分支的base更新为新base,并且你提交在自己分支的commit要在新base之后,此时,你就可以用到
1 | git rebase <BaseBranchName> |
示例:
若此时在bc分支进行git rebase master
会出现冲突,此时解决冲突后,git add .
将变更存入暂存区,使用
git rebase --continue
继续下一个节点的rebase,以上操作直到变基完成,