志愿者网站设计源码分享下载(志愿者管理系统源码)

大家好,今天小编来为大家解答以下的问题,关于志愿者网站设计源码分享下载,志愿者管理系统源码这个很多人还不知道,现在让我们一起来看看吧!

最近在网上有个真实发生的案例比较火,说的是一个新入职的员工,不会用Git拉代码,第二天被开除。由此,可见Git对我们工作的重要性,无论是前端后端,都是离不开Git的,下面就让我们一探究竟吧。

上面的案例引申出一个问题,入职一家新公司,你的leader给你分配了仓库的权限后,如何配置本地的Git环境并拉取代码?莫慌,按照下面我讲的四个步骤走,保证你可以顺利使用Git进行拉取代码!

下载Git下载地址,选择自己系统对应的版本下载即可。在你的电脑上生成ssh秘钥,打开终端,执行ssh-keygen-trsa-C&34;,如果执行成功,切换到~/.ssh目录下,此时目录应该如下所示。复制id_rsa.pub的内容。这里以Github为例,如下图所示,进入settings->SSHandGPGkeys通过cat命令查看文件id_rsa.pub的内容,然后复制过来,点击addsshkey,这一步等于说把你的公钥放到了Github上进行托管。全局配置Git的用户名和邮箱

gitconfig–globaluser.name&34;\ngitconfig–globaluser.email&34;\n复制代码

完成以上四步,你就可以愉快pull代码开发了。和https拉取方式不同的是,https方式需要每次提交前都手动输入用户名和密码,ssh的方式配置完毕后Git都会使用你本地的私钥和远程仓库的公钥进行验证是否是一对秘钥,从而简化了操作流程。

Git简介

在介绍Git的相关操作前,我觉得非常有必要了解Git的由来,以及Git是用来解决什么问题的。Git(读音为/g?t/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。LinusTorvalds,这个人我相信大家都知道吧,开源Linux系统的发明人。如今,你看到的大部分服务器其实都是运行在Linux系统上,令人感到称叹的是,这位大神级别的程序员不仅创造了Linux系统。那Linux的代码是如何管理的呢?2002年之前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!要知道,当时的Linux的代码量已经很大了,通过人工管理的方式,一是容易出错,二是效率低。于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。最后,出于某种原因,BitMover公司收回了Linux社区的免费使用权,于是Linus花了两周时间自己用C语言写了一个分布式版本控制系统,这就是Git的由来了。

Git的工作区域和流程

要想弄懂Git是怎么对我们的代码进行管理的,那首当其冲的是了解Git的工作区域是如何构成的。因为,只有彻底弄懂了Git工作区域的构成,你才可以在适当的区域使用合适的命令。如下图所示,此图包含了Git的4个工作区和一些常见的操作。

Workspace:工作区,就是平时进行开发改动的地方,是当前看到最新的内容,在开发的过程也就是对工作区的操作

Index:暂存区,当执行gitadd的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中那些内容是被Git管理的,当完成某个需求或者功能后需要提交代码,第一步就是通过gitadd先提交到暂存区。

Repository:本地仓库,位于自己的电脑上,通过gitcommit提交暂存区的内容,会进入本地仓库。

Remote:远程仓库,用来托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改,本地仓库修改完代码后通过gitpush命令同步代码到远程仓库。

一般来说,Git的工作流程分为以下几步

1.在工作区开发,添加,修改文件。\n2.将修改后的文件放入暂存区。\n3.将暂存区域的文件提交到本地仓库。\n4.将本地仓库的修改推送到远程仓库。\n复制代码

Git基本操作

gitadd

添加文件到暂存区

添加当前更改的所有文件到暂存区。\ngitadd.\n复制代码

gitcommit

提交暂存的更改,并记录下备注\ngitcommit-m&34;\n对最近一次的提交的信息进行修改,此操作会修改commit的hash值\ngitcommit–amend\n复制代码

gitpull

使用rebase的模式进行合并\ngitpull–rebase<远程主机名><远程分支名>:<本地分支名>\n复制代码

gitfetch

与gitpull不同的是gitfetch操作仅仅只会拉取远程的更改,不会自动进行merge操作。对你当前的代码没有影响

获取远程仓库所有分支的更新\ngitfetch–all\n复制代码

gitbranch

查看本地分支\ngitbranch\n查看本地和远程分支\ngitbranch-a\n重新命名分支\ngitbranch-m<old-branch-name><new-branch-name>\n复制代码

工作中使用Git解决问题的场景

gitrebase让你的提交记录更加清晰可读

gitrebase的使用

rebase翻译为变基,他的作用和merge很相似,用于把一个分支的修改合并到当前分支上。

如下图所示,下图介绍了经过rebase后提交历史的变化情况。

现在我们来用一个例子来解释一下上面的过程。

假设我们现在有2条分支,一个为master,一个为feature/1,他们都基于初始的一个提交addreadme进行检出分支,之后,master分支增加了3.js和4.js的文件,分别进行了2次提交,feature/1也增加了1.js和2.js的文件,分别对应以下2条提交记录。

此时,对应分支的提交记录如下。

master分支如下图:

feature/1分支如下图

结合起来看是这样的

此时,切换到feature/1分支下,执行gitrebasemaster,成功之后,通过gitlog查看记录。

如下图所示:可以看到先是逐个应用了mater分支的更改,然后以master分支最后的提交作为基点,再逐个应用feature/1的每个更改。

所以,我们的提交记录就会非常清晰,没有分叉,上面演示的是比较顺利的情况,但是大部分情况下,rebase的过程中会产生冲突的,此时,就需要手动解决冲突,然后使用依次gitadd、gitrebase–continue的方式来处理冲突,完成rebase的过程,如果不想要某次rebase的结果,那么需要使用gitrebase–skip来跳过这次rebase操作。

gitmerge和gitrebase的区别

不同于gitrebase的是,gitmerge在不是fast-forward(快速合并)的情况下,会产生一条额外的合并记录,类似Mergebranch&39;into&39;的一条提交信息。

另外,在解决冲突的时候,用merge只需要解决一次冲突即可,简单粗暴,而用rebase的时候,需要依次解决每次的冲突,才可以提交。

gitrebase交互模式

在开发中,常会遇到在一个分支上产生了很多的无效的提交,这种情况下使用rebase的交互式模式可以把已经发生的多次提交压缩成一次提交,得到了一个干净的提交历史,例如某个分支的提交历史情况如下:

进入交互式模式的方式是执行:

gitrebase-i<base-commit>\n复制代码

参数base-commit就是指明操作的基点提交对象,基于这个基点进行rebase的操作,对于上述提交历史的例子,我们要把最后的一个提交对象(ac18084)之前的提交压缩成一次提交,我们需要执行的命令格式是:

gitrebase-iac18084\n复制代码

此时会进入一个vim的交互式页面,编辑器列出的信息像下列这样。

想要合并这一堆更改,我们要使用Squash策略进行合并,即把当前的commit和它的上一个commit内容进行合并,大概可以表示为下面这样,在交互模式的rebase下,至少保留一个pick,否则命令会执行失败。

pick……\ns……\ns……\ns……\n复制代码

修改文件后按下:然后wq保存退出,此时又会弹出一个编辑页面,这个页面是用来编辑提交的信息,修改为feat:更正,最后保存一下,接着使用gitbranch查看提交的commit信息,rebase后的提交记录如下图所示,是不是清爽了很多?rebase操作可以让我们的提交历史变得更加清晰。

特别注意,只能在自己使用的feature分支上进行rebase操作,不允许在集成分支上进行rebase,因为这种操作会修改集成分支的历史记录。

使用gitcherry-pick获取指定的commit

gitcherry-pick可以理解为”挑拣”提交,和merge合并一个分支的所有提交不同的是,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用gitcherry-pick了。

如下场景,以下有三条分支,feature/cherry-pick1和feature/cherry-pick2都是基于master检出的两条功能性分支,对应的分支log记录如下

master分支的提交如下

现在master只需要feature/cherry-pick1和feature/cherry-pick2有关change的修改,并不关心有关fix内容的修改。此时就可以用cherry-pick指令了。

语法:gitcherry-pick[commit-hash]

commit-hash表示的是某次commit的hash值。现在,依次执行以下两条指令gitcherry-picke0bb7f3、gitcherry-pickc9a3101,过程中,如果出现冲突,解决冲突后进行gitadd,接着执行gitcherry-pick–continue,最后,master上的提交如下

此时,master分支上应用了需要的提交,就达到了我们想要的效果。如果需要多个cherry-pick需要同步到目标分支,可以简写为gitcherry-pick<first-commit-id>…<last-commit-id>,这是一个左开右闭的区间,也就时说first-commit-id提交带来的代码的改动不会被合并过去,如果需要合并过去,可以使用gitcherry-pick<first-commit-id>^…<last-commit-id>,它表示包含first-commit-id到last-commit-id在内的提交都会被合并过去。

使用gitrevert回滚某次的提交

想象这么一个场景,你的项目最近有2个版本要上线,这两个版本还伴随着之前遗留的bug的修复,一开始的时候,你将bug修复在了第一个版本的release分支上,突然在发版前一天,测试那边反馈,需要把第一个版本修复bug的内容改在第二个版本上,这个时候,第一个版本的集成分支的提交应该包括了第一个版本的功能内容,遗留bug修复的提交和其他同事提交的内容,想要通过reset的方式粗暴摘除之前的关于bug修复的commit肯定是不行的,同时,这种做法比较危险,此时,我们既不想破坏之前的提交记录,又想撤回我们遗留bug的commit记录应该怎么做呢?gitrevert就派上了用场。

gitrevert撤销某次操作,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作。

语法:gitrevert<commit-id>针对普通commit

gitrevert<commit-id>-m针对merge的commit

下面就用一个案例来理解一下这个命令,如下图所示,假设被红框框起来的地方是会引起bug的一次提交,在他的提交之后,又进行了2次提交,其中包含了其它同事的提交。

此时想把引起提交的bug的干掉,执行gitrevert1121932,执行操作后,再打开查看日志,如下图所示,可以看到是新增了一条commit记录,这个commit的产生的msg是自动生成的,Revert开头,后面跟撤回的commit-msg信息之前的commit记录并没有消失,此时也达到了代码回退的效果

此外gitrevert也可以回滚多次的提交

语法:gitrevert[commit-id1][commit-id2]…注意这是一个前开后闭区间,即不包括commit1,但包括commit2。

回滚我们的提交有二种方式,一种是上文提到的gitrevert命令外,还可以使用gitreset命令,那么它们两者有什么区别呢?

gitrevert会新建一条commit信息,来撤回之前的修改。

gitreset会直接将提交记录退回到指定的commit上。

对于个人的feature分支而言,可以使用gitreset来回退历史记录,之后使用gitpush–force进行推送到远程,但是如果是在多人协作的集成分支上,不推荐直接使用gitreset命令,而是使用更加安全的gitrevert命令进行撤回提交。这样,提交的历史记录不会被抹去,可以安全的进行撤回。

使用gitstash来暂存文件

会有这么一个场景,现在你正在用你的feature分支上开发新功能。这时,生产环境上出现了一个bug需要紧急修复,但是你这部分代码还没开发完,不想提交,怎么办?这个时候可以用gitstash命令先把工作区已经修改的文件暂存起来,然后切换到hotfix分支上进行bug的修复,修复完成后,切换回feature分支,从堆栈中恢复刚刚保存的内容。

基本命令如下

gitstash//把本地的改动暂存起来\ngitstashsave&34;执行存储时,添加备注,方便查找。\ngitstashpop//应用最近一次暂存的修改,并删除暂存的记录\ngitstashapply//应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,gitstashapplystash@{$num}。\ngitstashlist//查看stash有哪些存储\ngitstashclear//删除所有缓存的stash\n复制代码

下面通过几幅图对stash的命令做进一步了解。

此时,我正在开发一个新功能,修改了1.js文件里的内容

还没开发完成,这个时候,我想切换到hotfix分支上修复bug,得暂停下开发切换到hotfix分支,但是现在工作区还有内容,此时如果切换分支Git会报出下面的错误

error:Yourlocalchangestothefollowingfileswouldbeoverwrittenbycheckout:\n1.js\nPleasecommityourchangesorstashthembeforeyouswitchbranches.\nAborting\n复制代码

上面那句话的意思就是说工作区有文件修改,不能提交,需要先进行commit或者stash操作,执行gitstash,结果如下

SavedworkingdirectoryandindexstateWIPonstash:22e561cfeat:add1.js\n复制代码

此时,我们的工作区已经干净了,可以切换到hotfix分支进行bug修复的工作,假设我们现在bug修复完成了,继续切回feature分支进行原本功能的开发,此时只需要执行gitstashpop,之前我们暂存的修改就会恢复到工作区,如下图所示。

当我们想要暂存文件,切换分支做某些事的时候,可以用gitstash这种机制帮助开发。

推荐在使用stash的相关命令时,每一次暂存的时候,不要直接使用gitstash命令进行暂存下来,而是使用gitstashsave&34;这种方式,给本次的提交做一个信息的记录。这样,想应用更改的时候,先通过gitstashlist查看一下所有的暂存列表。之后,推荐使用gitstashapplystash@${num}的方式进行应用对应的stash,这样不会清空已有的stash的列表项,并且能应用到当前的工作区,不需要这个暂存的话,再手动清除就可以了。

不同的工作区域撤销更改

开发中,我们经常需要回退代码的操作,在不同的工作区域中,回退代码的方式也是不相同的。如下图所示,假设现在要在feature/revoke分支上进行开发,

首先通过gitstatus查看下现在的状态。

目前我们的工作区是很干净的,没有任何修改的操作,此时,修改一下代码再次查看状态,可以看到,1.js这个文件被修改了。

现在我们想把1.js这个文件恢复到修改前的状态,即撤回工作区的修改,就可以使用gitcheckout–<filename>的命令,如果要撤回多个文件的修改,文件之间使用空格隔开,如下图所示,我们撤回了1.js文件的修改,工作区也恢复干净了。

如果说现在我们对文件进行了修改,并且已经提交到暂存区了,这部分文件我们不想要的话,那么就可以通过gitreset<filename>的命令来对特定的文件进行撤销,gitreset会撤回所有存在暂存区的文件,如下图所示,查看前后的状态可知,文件最后成功撤回到工作区了。

配置gitalias提升工作效率

一般我们在工作中,接到开发任务后,需要新创建一个分支进行开发此时需要用到gitbranch、gitcheckout、gitpull等命令,在我们一顿操作后,开发完成,到了提交代码的阶段,又要诸如此类gitadd、gitcommit、gitpush等命令,虽然简单,但是输入起来也是不够简洁,作为一个程序员,开发程序就是为了提高我们的效率的,懒是人类进步的源泉,所以我们可以通过配置别名的方式,简化这些命令。

它的基本用法是gitconfig–globalalias.<简化的字符>原始命令

如下面的例子:

$gitconfig–globalalias.cocheckout\n$gitconfig–globalalias.cicommit\n$gitconfig–globalalias.brbranch\n复制代码

这里将co表示checkout,ci表示commit,br表示branch,以后提交就可以简写成

–global是全局参数,也就是配置一次后,这些命令可以在这台电脑下的所有仓库都适用。这些命令其实是更新你全局的.gitconfig文件,该文件用来保存全局的git配置,vim~/.gitconfig,执行这段命令后,显示如下,下图展示了刚才通过gitconfig–globalalias添加的alias。

除了上面那种直接通过命令的方式外,也可以通过修改这个文件的alias项来设置别名。

这里分享一个我自己常用的别名设置,把以下配置替换到.gitconfig文件里的[alias]所属的区域,然后就可以愉快的使用了~

[alias]\nst=status-sb\nco=checkout\nbr=branch\nmg=merge\nci=commit\nds=diff–staged\ndt=difftool\nmt=mergetool\nlast=log-1HEAD\nlatest=for-each-ref–sort=-committerdate–format=\\&34;\nls=log–pretty=format:\\&34;–decorate–date=short\nhist=log–pretty=format:\\&34;–topo-order–graph–date=short\ntype=cat-file-t\ndump=cat-file-p\nlg=log–color–graph–pretty=format:&39;–abbrev-commit\n复制代码

这样,我们每次想查看Git的历史记录,就不用输入那么一长串命令直接使用gitlg,下图是axios源码里的提交记录,使用封装后的gitlg查看的效果图

分支之间的关系一眼就很明了,在哪个commit上进行的merge操作也很清晰,可以帮助我们很好的追溯历史的提交和解决问题。

总结

本文由浅入深的的讲解了Git的环境搭建,基本用法,以及工作中使用较为高频的Git命令的用法,无论你是前端后端还是其它端的开发,日常工作中少不了对Git的使用,我们不仅要会用,还要用的漂亮,用的灵活,用的稳健。这样才能在和同事协作项目的时候更加得心应手,学会了本文这些Git的使用技巧后,在日常工作中多多练习,相信会给你带来很大的收获!

转载链接:https://juejin.cn/post/6974184935804534815

好了,文章到这里就结束啦,如果本次分享的志愿者网站设计源码分享下载和志愿者管理系统源码问题对您有所帮助,还望关注下本站哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平