刚刚接触到git和github,整理一部分相关原理帮助自己理解git命令和本地-远程的操作。
我们将这部分学习分为三部分:(1)本地仓库相关操作(2)远程仓库相关操作(3)本地-远程交互操作
本地仓库相关操作:
1、当我们下载git 后,打开git bash,通过git clone将远端创建的仓库复制到本地,此时一个本地仓库创建完成。此时,在本地将有一个.git的文件夹形成,里面包含多个文件,其中查看几个文件中的内容可以帮助我们理解git的一些命令,如objects中为存储的blob对象,里面包含对应每次操作的一种算法的结果(哈希值),HEAD类似一个指针,指向工作区的分支,总是指向最新的commit,logs包含了commit的日志,config为配置文件。
2、在本地仓库文件夹内的空白处打开git bash,我们进入默认的主分支,如main_branch,自此,我们开始了在本地仓库的一些列操作。本地仓库的文件位置可以分为三个区域,(1)工作区(2)索引区(3)仓库,他们之间的关系为
查看文件的状态git status,不同位置的文件显示的颜色不同。我们在创建或者修改一个文件后,git add file到索引区,git commit -m 到本地仓库中。
3、branch:在将远程文件下拉到本地或者在本地进行新文件创建时,尽量不要在主分支上进行操作,因为一个大的项目,它的主流程将构成一个主分支,而每个功能的实现构成多个分支,不同的分支由不同的设计者完成,对主流程的更改可能会影响到其他的设计者的后续设计,并且更改主分支后合并分支时还需考虑有无冲突的问题。因此可以在其它分支上修改完成后,再合并到主分支上。
4、对于一个新手,和内存占用相关的内容比如文件的压缩,垃圾文件的处理暂时先不考虑。
远程仓库相关操作:
1、仓库的创建:远程操作指的是github中的操作,项目发起后,可创建对应的仓库,并创建一个分支作为主分支,后续其他操作均基于这个主分支进行。
2、从本地push远程时,不能再使用github账号和密码的连接方式,可使用token验证。
3、将文件从本地推到远程仓库后,远程仓库中会出现何人何时推送了分支文件的信息,操作者通过pull requests递交将该分支文件合并到主分支的请求并附带文件内容说明,审批通过后,该分支合并到主分支上,该分支名可删除,也可以保留便于追溯。
本地-远程交互操作:
1、git clone:当远程创建新的仓库后,使用该命令同步到本地,开始本地仓库的后续操作。
2、merge的使用,我们在完成一个项目时,会需要多个分支分别完成不同的功能,再合并到主分支上。分支的合并分为三种情况:(1)fast forward:在主分支的最新一次commit时,创建新分支dev并进行commit,然后merge到主分支,此时可在主分支直接使用git merge dev 。(2)3 way merge:主分支创建新分支dev后,主分支和dev分支分别进行过commit,但是commit中的文件不冲突,可使用git merge。(3)带冲突的3 way merge:当创建的新分支dev和主分支分别commit时,commit的文件发生了冲突,使用git merge进行合并时会提示发生了冲突,此时要先解决冲突,再进行合并,可采用在编辑器中删除不需要内容的方法进行解决,在实际中遇到后再进行这部分内容的补充。还有一个命令可以将3 way merge的形式更改为fast forward形式,那就是git rebase,该命令将创建新分支dev后的主分支上的commit信息合并到dev分支上,这样dev分支就带有主分支最新commit,切换到主分支后,可以merge,但这过程可能会有冲突,遇到实际情况后再补充该内容。但是在主分支上不要使用git rebase命令。
3、git pull:项目进行过程中,从远程仓库拉代码到本地时使用的命令,将远端仓库的分支内容拉到本地仓库,并与本地仓库合并。提到合并,就涉及到合并的3种方式,因此在使用git pull时也要确定是否有冲突。此时还有另外一个拉取的命令git fetch,git pull相当于git fetch和git merge的总和。那么在操作中,如果我们确定肯定下拉的分支与本地分支无冲突,我们就使用git pull,若不确定是否有冲突,我们就使用git fetch+git diff +git merge。
4、git push:本地操作完成后推送到远程仓库的命令。可先通过git branch -vv查看本地和远程分支情况,若首次push新分支,则使用git push origin -u new branch,若同步分支,则可直接git push。
总结最简单的git的使用流程为:git clone/pull→git branch(dev)→git add→git commit→git branch(main)→git push