git的安装可以参考我的博客:https://www.cnblogs.com/shanfeng1000/p/10969116.html
一、工作流程
Git 工作流程一般是:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
二、基本操作
看完工作流程,我们可以一边操作,一边理解基本概念,另外,虽然git现在有一些工具能直接在UI界面上操作,但为了更好的说明,下面都是采用命令行操作
首先,我们可以在我们电脑上创建两个文件夹:
server:充当远程仓库,一般是在服务器上的,我们这里只是模拟,读者可以把它当做服务器上的一个目录,后文称之为远程server
custom:本地目录,充当本地仓库,存放从远程仓库克隆下来的代码,读者可以把它理解为本地的一个目录
提示:下面每一个命令的执行,注意看执行的路径,如下图
1、创建远程仓库
进入server目录,在空白区域右键=》Git Bash Here,打开git的命令行窗口,输入git init,回车就初始化了仓库,同时可以看到server目录下生产了一个.git目录,这个.git目录称为版本库
server下面所有.git目录以外的东西称为工作区,我们可以再工作区添加,修改,删除文件
版本库下有一个区域叫暂存区,当我们工作区有改动需要提交时,都是先添加到暂存区,再提交至版本库(对象库)中
注:如果看不到.git目录,可能是隐藏了,显示隐藏目录就可以了
好了,远程仓库创建好了,我们可以添加一些内容,比如,我们在工作区创建一个redme.txt的文件,然后再git命令行窗口输入:git add redme.txt
这样,我们就将redme.txt添加到了暂存区,在使用:git commit -m 'redme.txt'
现在,redme.txt就已经被从暂存区提交到了版本库
我们打开redme.txt,修改里面的内容,并保存
这样就说明了我们工作区有修改,我们可以使用git status查看工作区的修改
命令的结果显示,我们有个叫redme.txt的文件有修改,同样的,我们可以使用 git add redme.txt 和 git commit -m 'redme.txt'将修改提交到版本库
这样我们在工作区做的修改就提交了,我们也接着使用git status查看是否工作区是否还有修改
到这里,我们的远程仓库就创建好了,但是一般的,开发过程中,远程仓库不是我们自己创建的,我们只是克隆一份代码到本地查看,如果有修改,再提交而已
2、克隆仓库,创建本地仓库
所以,我们创建custom充当本地仓库,进入custom目录,这时就不需要我们创建仓库了,只需要克隆远程仓库就可以了
同样的,在空白区域右键=》Git Bash Here,打开git命令行,输入git clone /e/git/server 就可以克隆项目到本地了,
注意:因为我这边都是本地操作,所有后面克隆的地址是/e/git/server ,但是真正的过程中,远程仓库都不在本地,所以git clone命令后面一般都是跟一个url
现在,可以看到,在custom目录下面生成了一个server文件夹,这个目录下的内容就是我们远程仓库的一个副本,进入这个server目录可以看到
打开redme.txt,正是我们之前在远程仓库中输入的内容,我们将内容做个修改
保存之后,在空白区域右键=》Git Bash Here,打开git命令行,输入 git status 查看工作区状态:
结果显示redme.txt有改动,同样的,我们可以使用 git add redme.txt 和 git commit -m 'local redme.txt' 将修改提交到本地版本库
提交之后,我们可以使用 git log 查看我们的提交日志
我们回到远程的server目录(不是custom/server,是最开始的那个server),打开redme.txt,发现它还是hello,而不是hello git
这是因为我们在custom/server中提交的内容是提交到本地版本库,也就是custom/server中的.git目录中,而不是远程的server,所以我们需要将本地库的内容推送到远程库去
在本地库(custom/server)的git命令行中输入 git push origin master :
结果显示推送被拒绝了,一个简单的解决方案是:
使用txt打开远程server的.git/config,在最后main加上下面的节点(如果有receive节点,那只需要添加下面的键值即可)
[receive] denyCurrentBranch = ignore
然后再执行一次 git push origin master 就可以了
然后就可以去远程server下,查看redme.txt,发现内容还未被修改,我需要更新一下了,执行 git checkout -- redme.txt ,之后就发现内容已经被修改了
附:一般的,除非你要在远程server上查看文件内容,否则一般不用使用git checkout命令,而且,我们一般不在远程server上查看文件的
以上就是我们模拟操作推送修改的过程,画一张图来说明:
以上使我们模拟的一个客户端的操作过程,但是实际应用中,我们往往是一个需求多个人员去开发,每个人都可以签入签出代码文件,现在我们来模拟这个过程
我们先创建一个custom1,表示另外一个用户的客户端
同样的,我们进入custom1目录,打开git的命令行,将仓库克隆下来,得到了和custom一样的文件结构
进入custom1/server目录,我们添加一个文件test.txt,再执行 git add test.txt 和 git commit -m 'test.txt' 就可以将test.txt提交到custom1的本地版本库中
这个时候test.txt还在custom1的版本库中,要想他人能获取到这个文件,我们需要将它推送到远程server端,使用 git push origin master 进行推送
现在test.txt就被推送到了远程server端,其他人员就能获取到了,我们可以进入custom/server目录,没获取之前是没有test.txt文件的,使用 git pull 命令获取更新
执行完之后test.txt文件就出现了,当然,我们可以再custom/server下修改,提交,推送之后,在custom1/server下也能获取到更新
注:git pull 是从远程仓库更新内容到本地仓库,更新完之后会自定签出内容到我们的工作区,所以就不需要再执行 git checkout 命令了
3、添加忽略目录
为什么要添加忽略目录?我们可以想想,如果是做java,.net之类的开发,开发过程中往往回生成一些编译后的文件,如.class文件,bin目录,或者是开发过程中的个人配置
而这些文件往往他人是不需要的,如果不忽略,一来导致网络传输慢下来,二来可能给他人造成不必要的困扰
git允许我们在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如target,bin,*.db等,然后它就会自动忽略这些文件了
我们可以模拟一下,随便进入一个工作区,远程server,custom/server,custom1/server都可以,比如,我们进入custom/server目录,我们可以创建一个setting.txt文件
再打开git命令行,输入 git status ,发现git输出告诉我们,有一个新文件在工作区生成了
加入这个setting.txt文件是custom用户自己的,他当然不想提交了,怎么做呢?
首先,在根目录下创建一个.gitignore文件,用txt打开,输入setting.txt
注:windows创建.gitignore会提示输入文件名,可以参考:https://www.cnblogs.com/mmzs/p/9761016.html
然后再git命令行输入 git add .gitignore 和 git commit -m '.gitignore' 添加到本地版本库
在使用 git status 查看工作区变化,发现已经忽略了setting.txt文件,
为了让他人也能获取,最好建议也使用 git push origin master 将它推送远程server
然后可以再custom1/server下通过 git pull 可以获取到这个.gitignore文件
4、分支管理
前面,我们已经多次看到 git push origin master 这个命令了,其中master就是分支名,为什么要有分支?
举个例子,假如我们有个需求A,如果一直在一个版本上开发,可能等我们开发完成了,老板说市场需求变了,需求A不要了,那我们要在项目中将需求A的东西全干掉?
再举个例子,假如在进行需求A的时候,又接入了紧急的需求B,那既然是紧急的需求,总不能等需求A开发完再做需求B吧?
这个时候,分支就起了很大的作用
要说清楚分支是什么,要可能需要一些篇幅解释,不过我们可以这么理解,我们有一个项目,要进行一个需求的开发,那么我们可以把项目克隆一份来开发,如果有多个需求,那就克隆多个副本,
当一个需求开发完成上线之后,可以把这个克隆副本的改动点合并到我们的项目中,而这些副本可以称为分支,当然,这只是理解,并不是说git真的克隆了一份项目
现在,可以来创建分支,进入custom/server目录,打开git命令行,输入 git branch branch1 ,branch1是分支名称,分支创建好之后,我们可以通过 git checkout branch1 命令切换到branch1分支下
切换到branch1之后,会发现文件接口和原来的master分支一样,没什么区别,这个是当然的,我们这里相当于把master的东西克隆了一份
现在我们可以做一些修改,我们打开创建的test.txt文件,修改内容保存后,使用 git add test.txt 和 git commit -m 'branch1 test.txt' 将修改提交至本地版本库
然后我们可以使用 git checkout master 切换到master分支,发现test.txt的文件内容还是为空,现在区别就出现了
如果要进行多个需求的开发,我们只需要再创建分支就可以了,比如,按照上面的步骤,我们再创建一个分支branch2,并修改test.txt文件,再执行git add test.txt 和 git commit -m 'branch2 test.txt' 将修改提交至本地版本库
同样的,如果我们切换回到master,会发现test.txt还是空的,这样,我们的branch1和branch2就进行了不同的需求开发
说明一下,我们上面的操作内容都是在本地版本库,并没有推送到远程server库,别人是获取不到的,所以我们可以推送一下branch1和branch2
使用 git checkout branch1 切换到branch1分支,再执行 git push origin branch1,然后远程server就有了branch1的分支,别人就可以使用git pull 命令获取到这个分支,并可以切换到这个分支下工作
而且之后我们在branch1分支下开发,都可以使用 git push origin branch1将内容推送到远程server的branch1分支
另外,提示一下,分支推送后,当我们使用 git pull 时会让我们选择分支去更新,当然我们也可以使用 git pull origin branch1 去获取更新,但是最好是设置一下远程关联分支: git branch --set-upstream-to=origin/branch1 branch1
我们可以输入 git branch 查看本地分支,输入 git branch -r 查看远程server的分支
同样的,对branch2可以这样操作
操作完成之后,加入branch1分支的开发完成上线了,我们可以将它合并到master分支
先使用 git checkout master 切换到master分支,再执行 git merge branch1 将branch1分支的内容合并到master分支
合并完成,它提示我们没有冲突,如果有冲突,可能需要我们使用相关工具或者进入到有冲突的文件里面去处理这些冲突,处理完成之后要使用 git add 和git commit 命令将改动提交到本地库
先前我们看到,master分支里面的test.txt是没有内容的,而branch1分支下的test.txt是有内容的,合并之后,发现master分支下的test.txt的内容和branch1分支下的内容一样的了
合并之后,别忘了使用 git push origin master 将内容推送到远程server,不然别人获取不到合并后的内容
好了,假如branch2分支的开发也完成上线了,我们可以接着也可以合并
先使用 git checkout master 切换到master分支,再执行 git merge branch2 将branch2分支的内容合并到master分支
结果提示我们内容有冲突,是在test.txt中,我们可以使用一些工具去处理,或者直接进入test.txt文件去处理
打开test.txt,内容如下,其中HEAD段的内容是本地工作区的内容,后面那一段是branch2分支的内容,两段内容我们都需要,我们就都保留着,如果只要其中一个,我们就删除另外一个,这里演示都需要,那我们修改如下
保存关闭后,使用git add test.txt 和 git commit -m 'merging test.txt' 将合并内容提交,最后使用 git push origin master 将更新推送到远程server
至此,git的基本使用就结束了
三、通过git获取开源项目
学习开源项目,可以很快的提高我们的技术,而我们一般通过GitHub去获取一些开源项目,另外,码云也是个不错的选择,看个人习惯了
这里以GitHub为例,加入我们找到一个好的项目,比如https://github.com/kardianos/govendor
进到页面去之后,点击Clone or download,然后复制下面的地址,然后在我们想要存放项目的地方打开git的命令行窗口,输入 git clone https://github.com/kardianos/govendor.git
之后,等下载完成就可以了