Git基础应用
本文最后更新于:3 年前
Git是什么
Git是分布式版本管理系统
它可以帮助你:
- 构造本地仓库
- 管理本地仓库内的文件版本(可以回滚,可以往前)
- 与远程仓库建立连接(通过SSH)
- 远程仓库存储副本
- 多人协作开发
- …
Git安装
- windows系统
下个Git Bash - Linux系统
yum install git -y
安装完成后我们需要在Git Bash内或是Linux的终端中(下文统一称为terminal)设置全局属性name和email。用以标识用户。
git config --global user.name "ayyHA"
git config --global user.email "email@qq.com"
还可以启用Git的一些额外颜色
git config --global color.ui true
Git本地仓库的操作
我们可以新建一个目录,用以作为被Git管理的本地仓库,放置于其内的任意文件都会被Git进行版本管理。
本地仓库初始化
通过git init
命令即可以将该目录设置为本地仓库,且该目录内会多出一个**.git**文件夹,其内是Git用于版本管理的东西,没事别乱动!!
提交文件
之后你可以往这个文件夹里建文件,写东西。但是这并没有使用到我们Git的版本管理。如何使用到呢?
我们可以打开terminal输入git status
这条命令进行查看。
你会发现上面写着Untracked files,即意味着你的文件只是放在这个目录下,还没有被Git进行跟踪管理。
我们可以通过git add <file>
来将文件放置到一个叫暂存区的地方(即index或stage,存放于.git下)
我们可以一次性将许多文件放在暂存区内,然后提交到本地仓库:git commit -m "这里写此次提交的注释"
之后当你修改这些被跟踪的文件时,都可以通过git status
来查看有谁被modified,有谁需要committed。
你可能会想到一种情况:
我在本地仓库里新建了a文件,修改了其内容,然后通过git add a.txt
将其提交到暂存区,之后忽然发现有个地方写错了,然后直接先去修改a文件了,此时Git会将你放入暂存区的文件和再次修改的文件分隔来看,即放入暂存区的文件可以通过git commit
将内容上交,而新加的内容则是被认为是modified,需要重新git add
。
撤销修改
当我们对文件一股脑的进行修改后发现,修改的部分极大可能出错了,且修改的地方比较多,若是一点一点回去改,会很耗时。而Git给我们提供了一剂后悔药git checkout -- <file>
即可以将修改撤销,变回修改前的模样。
①若是未将文件git add
到暂存区,则文件会回滚文修改前的版本;
②若是将文件放到了暂存区,又进行了修改,则checkout后得到的是暂存区的版本;(现在Git)
除了上面所说的git checkout -- <file>
来对文件进行撤销修改外,Git也提供了git restore <file>
来撤销修改(因为git checkout
也与后面的分支切换有关),还提供了git restore --staged <file>
来撤销放置于暂存区的文件
版本回退
撤销修改中的①其实就是回退到最新的版本,也可以通过版本回退来实现:git reset --hard HEAD^
此即为回退到上一个版本,若是想回退到上上一个版本,加多个即可。但若是我们需要回退的版本很前很前,写那么多个并不现实,可以通过:git --reset HEAD~100
即可以回退到前100个版本去;
那我们如果想回退到某一个版本,我们不知道它跟我们现在的版本差距为多少,我们可以通过版本号来进行回退。版本号可以通过git log
来得到(commit后面那一串就是版本号),如果版本太多,可以通过git log --pretty=oneline
来较为清晰地输出版本信息。
回退的时候我们不需要把版本号全部写上去,写前几个字母就好了,如:git reset --hard 95a9b
。
那当我们知道了版本号,其实不只可以进行版本回退,也可以将版本向前移动。若是不知道版本号,我们可以通过git reflog
来进行查询。
上面指令中的HEAD其实就是指向当前分支(如master), 而当前的分支才是指向提交的,也即是说我们commit到本地仓库的内容是提交在当前分支上的,这个在后面的分支管理部分可以更好的理解。
Git远程仓库的操作
Github设置及远程推送
要知道,我们GitHub和Git的数据传输是通过SSH加密的,需要进行如下的设置:
- 在terminal中通过
ssh-keygen -t rsa -C "email"
来生成,它利用RSA加密算法生成一个公钥和密钥,放在你当前用户的HOME目录下(windows在C:/User/UserName/.ssh下,Linux在~/.ssh下); - 将在.ssh目录下的id_rsa放置到你的Github的Settings下的SSH and GPG keys中(通过点击New SSH key放置其中);其中id_rsa是公钥,带pub后缀的是密钥;
至此,你的电脑利用Git去远程访问你的Github下的信息已经可以进行权限认证了(就是可以分辨出有没资格去拿信息)。 - 我们需要在Github上建一个仓库,并将本地仓库和远程仓库通过
git remote add origin git@github.com:github_name/repo_name.git
关联起来(注意github_name需替换成你的GitHub账号,repo_name需替换成你的仓库名);
以上,你便将你的本地仓库和远程仓库建立了连接。我们可以将本地文件push到repo了。git push -u origin master
首次push需要加-u,以使得你的本地分支master和远程仓库分支master相关联。之后就git push origin master
就行。
我们也可以拉取到该repo的文件git pull origin master
。
分支管理
通过上面的描述我们知道,我们的本地仓库在创建之时给我们自带了一个master分支,我们也可以自创分支git branch branchName
,也可以切换分支git checkout branchName
,可以通过git branch来查看当前有多少分支
,还可以通过git branch -d branchName
来删除分支。
上面的分支切换和分支创建也可以通过如下指令完成git checkout -b branchName
。
我们一般都是用一个分支(如dev)进行修改提交(就是dev改了内容之后要add、commit),然后再合并到主分支master上,即是:git merge dev
(master合并掉dev,通过fast-forward策略)。
分支就像是一个线程一样,共享仓库里的文件,但是对文件的修改提交只对该分支可见。
我们前面曾说过,我们的分支是面向提交的,那么也就是说如果我有master分支和dev分支,我们即对dev做了修改提交,又对master做了修改提交,那么在合并的时候就会产生冲突,我们可以通过查看产生了冲突的文件,上面会有<<<<< ===== >>>>>的信息来指示这个部分是哪个分支进行的修改,手动解决冲突后,即可合并。
fast forward策略合并分支后,我们若是删除了分支,会丢失掉分支的信息。因此可以通过禁用fast forward的方式来避免丢失信息:git merge -no-ff -m "注释" branchName
,之后还可以通过git log
来找到它。
若是在遇到某些bug的情况下需要另建分支,解决bug,而此时工作现场又无法commit的话,我们可以通过git stash
来隐藏工作现场,后期可以通过git stash list
来查看现场,然后可以通过git stash apply
和git stash drop
来应用和删除现场,也可以通过git stash pop
来恢复现场和删除现场。
多人协作
在前面push内容到GitHub时,我们用到了git push origin master
其实这个origin就是远程仓库默认的名字。我们可以通过git remote
和git remote -v
来查看远程仓库的信息。而这里的master则是指的本地分支,意为:将本地的master分支push到origin上去。
那么我们若是要push本地的dev分支到origin去的话,我们的远程仓库会自动set up一个叫dev的分支,并与我们本地的dev分支建立关联。
若是我们需要将origin上的dev分支弄到本地来,可以通过git checkout -b dev origin/dev
实现;
若是当我们要提交的dev分支产生冲突,我们需要拉取最新的下来,我们需要先指定本地dev分支与远程origin/dev分支的关联关系:git branch --set-upstream dev origin/dev
,再pull即可。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!