什么是Git,Git可以做什么
Git是一个开源免费的分布式版本控制系统,可以快速高效的管理从小型到大型的项目。
作为分布式版本控制工具,Git可以帮我们做以下的事:
- 版本控制:
版本控制主要任务是追踪、管理软件开发过程中各种程序代码、配置文件及说明文档等文件的变更。首先我们有一个仓库来存储开发过程中的代码、配置文件等,这个仓库通常是远程的,每次对仓库内文件的变更都不会覆盖原来的文件,Git会帮我们忠实的记录谁在什么时间修改了远程仓库的什么文件,将仓库原来的所有文件进行一个完整的备份,标记为一个版本,将新的变更后的仓库文件标记为一个新的版本。软件开发中会经常面临需求变更,比如要求添加新的功能,当我们修改完代码发现新的功能并没有很好地实现,甚至原来的功能也出现了严重问题,我们可以方便的回退到上一个版本来保证项目原有功能不受影响。
- 并行开发:
软件开发往往是多人协同作业,各人负责各人的功能模块,在远程仓库会有一个主分支,每个项目成员都可以通过Git来获取远程仓库主分支的完整拷贝,将其作为一个分支,在本地修改代码进行开发,完成后将代码合并到远程仓库主分支,当所有人完成了任务,主分支也就具有了完整的功能。
创建本地仓库git init
首先需要电脑上安装了Git,百度搜索Git进入官网下载后一直下一步安装即可,安装完成后,我们在电脑的任意文件夹下点击鼠标右键,会出现Git GUI Here和Git Bash Here选项,Git GUI是图形化的Git管理工具,一般我们都会使用Git Bash Here采用命令行方式操作Git。
我在F盘创建了一个project空文件夹,当我们点击Git Bash Here后,弹出了一个命令行窗口,输入git init命令,可以看到Initialized empty Git repository in F:/project/.git/,同时project文件夹下多了个.git的文件夹,这个文件夹是隐藏的,所有 git 需要的数据和资源都存放在这个目录中,这时一个本地仓库就已经创建好了,git会自动追踪project文件夹下文件的变更。
新创建的本地仓库目录结构如下:
Git的工作区–>暂存区—>版本库(本地仓库)
Git版本控制的工作流程就是将变更的文件从工作区提交到暂存区,然后从暂存区提交到版本库,生成一个新的版本的数据。
工作区(workspace):工作区是我们编写程序的地方。我们刚在poject文件夹下创建了本地仓库,那么这个poject文件夹就是我的工作区,工作区不包括我们刚创建好的.git文件夹。创建好本地仓库后,下面我们就要开始干活儿了,比如我在工作区创建了一个HelloWorld.java文件,这时我的工作区文件就发生了变更。
暂存区(stage 或 index):暂存区在.git文件夹中,是一个名为index的文件,这个文件保存着我们工作区所有文件变更的信息。刚刚创建好的本地仓库没有这个文件,当我们将变更的文件提交到暂存区,这个index文件会被自动创建。
首先我们需要将变更的文件提交到暂存区,这时就需要用到git add 文件名命令,我们在命令行窗口输入git add HelloWorld.java命令,没有报错,并且.git文件夹下多了个index文件。
如果有很多文件发生了变更,使用git add 文件名一个一个地提交暂存区就太麻烦了,这时可以用git add . 命令将所有的文件一次性提交到暂存区。
版本库(repository):保存每一个版本数据的地方。因为暂存区只是一个索引文件,所以我们习惯上称作的本地仓库,就是指的版本库。版本库最主要的一个概念就是HEAD,HEAD就是一个指针,指向的是我们版本库中最新版本的数据。每一次将变更文件提交到版本库,就像是我们将工作区的文件全部复制了一遍,并且创建了一个文件夹来保存他,然后将最新的版本号作为这个文件夹的名字,HEAD指针则指向了最新版本号所代表的文件夹。
我们需要将暂存区的内容提交到版本库来生成一个新版本的数据,这时需要用到git commit -m ‘本次提交描述信息’命令,如图72eba05就是版本号,这时变更文件已经保存到了本地仓库,版本号72eba05保存着我们最新版本的所有数据。
Git文件的四种状态和查看文件状态命令git status
我们日常工作中并不会写完一个文件就提交一次本地仓库,有可能是下班前提交一次,也有可能是完成了一个功能后提交一次。这个时候,可能有很多很多文件发生了变更,Git将文件分为4种状态Untracked、Unmodify、Modified、Staged。
使用git status命令能够帮助我们知道哪些文件被新创建了,哪些文件被删除了,哪些文件被修改了,这些变更的文件是需要提交到暂存区还是提交到本地仓库。
Untracked:新创建的文件,还没有提交到暂存区,没有与本地仓库产生任何联系。
Modified:与版本库最新版本的文件相比,被修改了。
Unmodify:与版本库最新版本的文件相比,没有任何变动。
Staged:已经存入了暂存区。
我在工作区新创建了一个a.txt和b.txt,并且将原来的HelloWorld.java删除了。
使用git status命令查看文件状态,Changes not staged for commit,变更文件没有进入暂存区用来被提交,变更文件中HelloWorld.java已经被删除了,a.txt和b.txt还没有被追踪,没有进入暂存区的文件用红色标注了出来。
使用git add .命令将所有变更文件提交到暂存区,再次使用git status命令查看,可以看到Changes to be committed,变更等待提交,并且3个文件是staged file,已经进入暂存区了,进入到暂存区的变更文件从红色变成了绿色。
接下来我们将暂存区的变更提交到本地仓库,再次使用git status查看文件状态,nothing to commit,working tree clean。表示没有需要提交的文件了,我们工作区的文件与本地仓库最新版本中的文件是一致的。
Git的分支
注意我们之前的所有操作,都有一个master的标志,这个master就是我们仓库的主分支(也叫主干),在git init的时候,就由Git帮我们自从创建好了,分支是并行开发的关键。
在主分支上,我们可以开辟子分支,子分支包含了主分支的完整拷贝,一条子分支就是一条完整的开发路线,在子分支上开发不会影响主分支的代码。假如主分支已经写好代码完成了很多功能,这时需要开发一个新的功能,为了保证主分支的正常运行,不影响其他人使用主分支,我们就需要从主分支上开辟一条子分支来工作,等到工作完成后再将代码合并到主分支。
查看当前的分支情况: git branch -a,现在我只有一条master主分支,星号标注我现在在master分支上工作,当前分支是绿色的。
新建分支:git checkout -b 分支名,创建了一个名为hello的子分支,从master分支上拷贝了一份完整的数据到hello分支,并且git自动切换到了hello子分支上。
切换分支:git checkout 分支名,切换分支会将分支中的文件拉取到工作区。
让我们回到hello分支工作,切换前我的master分支上有a.txt、b.txt和c.txt三个文件。在hello分支上,我创建了d.txt文件,并将a.txt文件删除了,并提交到了本地仓库,现在我的工作区的文件是这样的。
现在再次切换到master分支,可以发现我master分支上的文件并没有受到影响,工作区的文件自动换成了master分支上的。
将子分支代码合并到主分支:假如我在hello子分支上完成了工作,这个时候hello子分支才是我们想要的完整功能的代码,这时需要将master主分支的代码替换为hello子分支的代码,我们可以使用git的合并分支命令git merge。首先我们需要切换到主分支,然后使用git merge 分支名,来将具体某个分支的代码合并到主分支,这里我使用了git merge hello。
删除本地子分支:使用git branch -d 分支名可以删除本地子分支,删除前应切换到其他分支才能删除。
Git与远程仓库建立连接
刚才我们所有的操作都是在本地仓库进行的,代码完成后我们需要推送到远程仓库,首先需要与远程仓库建立连接,我在码云(gitee)注册了账号并且新建了一个名为test的远程仓库,这时gitee为我生成了一个远程仓库的地址,使用这个地址,我们就可以使用命令与远程仓库建立连接。
使用git remote add origin 远程仓库地址,与远程仓库建立连接,连接过程中需要输入gitee的账号密码,因为我之前输入过了,所以不需要再次输入。
解除与远程仓库的连接: git remote remove origin
Git本地仓库与远程仓库交互
push:建立连接后,我们可以使用git push origin 分支名命令,将本地仓库的内容推送到远程仓库分支,如果远程仓库没有这个分支,则在远程仓库创建分支,并将代码推送到远程仓库分支。使用git push origin master命令将master分支代码推送到远程仓库。
在我们的远程仓库中,多了a.txt和b.txt文件
我们在本地完成的任何修改,都可以提交到本地仓库后,使用push命令推送到远程仓库,我在工作区又添加了一个c.txt文件,通过git add . –> git commit -m ‘描述信息’–>git push origin master,三个命令就可以完成与远程仓库同步的工作。
有的时候我们并不希望直接将代码推送到主分支,有可能是因为代码还没有写完,也有可能代码还没有经过测试,为了保证远程仓库有一个我们本地分支代码的备份,我们可以在远程仓库建立一个子分支来保存我们本地分支的代码。现在我的远程仓库只有一个master分支。
现在我在本地切换为hello分支,并将hello分支的代码推送到远程仓库的hello分支。使用git push origin hello就可以完成这项工作,现在我的远程仓库也有个一个hello分支,这条命令也适用于更新远程仓库子分支的代码。
假设我不再需要远程仓库的hello分支,我们可以使用git push origin –delete hello来删除远程仓库的分支
clone:使用git clone 远程仓库地址命令,可以将远程仓库克隆至本地,克隆不需要在本地初始化本地仓库,我在本地创建了一个test的空文件夹,右键Git Bash here,将远程仓库这个克隆到了本地。
fetch:从远程仓库拉取某个分支的代码到本地仓库,如果没有指定分支名称,则默认拉取master分支的代码,使用fetch命令需要初始化本地仓库并建立与远程仓库的连接。我在本地新建了一个test1的文件夹,并将远程仓库hello分支的代码拉取到了本地仓库。
pull:从远程仓库拉取代码并与现在所在的分支代码进行合并,是升级版的fetch。我在本地新建了test2文件夹,初始化本地仓库并建立与远程仓库的连接,将远程hello分支代码拉取到了本地,由于我在本地处于master分支,pull命令自动将远程hello分支的代码与本地master分支的代码进行了合并。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/51241.html