今天跟着简书的blog传送门学习下Git

Git工作流程

Git版本控制
上面包含了一些简单常用的指令,先来了解一下4个专用名词:

  • workspace:工作区
    程序员进行开发改动的地方。
    平时我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作
  • Index/Stage:暂存区
    .git目录下的index文件,暂存区会记录 git add添加文件的相关信息(文件名、大小、timestamp),不保存文件实体,通过id指向每个文件实体。可以使用 git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。
    如果你在开发区完成了某个需求的代码,第一步就是通过 git add命令先提交到暂存区,被git管理。
  • Repository:仓库区(本地仓库)
    保存了提交对象过的各个版本,比起工作区和暂存区的内容,它更旧一些。git commit后同步暂存区的内容到本地仓库中,方便下一步通过 git push同步到远程仓库中。
  • Remote:远程仓库
    远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可以不同步,但是它的内容是最旧的、

综上可以总结几点:
(1)任何对象都是在工作区中诞生和修改。
(2)任何修改都是从进入index区才开始被版本控制。
(3)只有把修改提交到本地仓库,该修改才能在仓库中留下痕迹。
(4)与协作者分享本地修改,可以通过push到远程仓库来共享。

Git常用命令

Git版本控制
Head
Git版本控制
Head它始终指向所有分支的最新提交点。你所处的分支变化,或者产生了新的提交点,Head值就会跟着改变。

add
Git版本控制

git add:添加当前目录的所有文件到暂存区。
git add< dir>:添加指定目录到暂存区,包括子目录
git add< file1>:添加指定文件到缓存区

commit

git commit -m < message>:提交暂存区到本地仓库,message代表说明信息
git commit < file1> -m < message>:提交暂存区的指定文件到本地仓库
git commit --amend -m < message>:使用一次新的commit,替代上一次提交。

branch

Git版本控制
涉及到协作,自然会涉及到分支,关于分支,有展示分支、切换分支、创建分支、删除分支四种。

git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有本地分支和远程分支
git branch < branch-name> 新建一个分支,但仍然停留在当前分支
git branch -b < branch-name> 新建一个分支并且切换到该分支
git branch --tack < branch>< remotebranch> 新建一个分支,与指定的远程分支建立追踪关系
git checkout< branch-name> 切换到指定的分支,并更新工作区
git branch-d < branchname> 删除分支
git push origin --delete < branchname> 删除远程分支

merge
Git版本控制
merge命令把不同的分支整合起来并且合并到master分支中。

git fetch < remote>:merge之前先拉一下远程仓库的最新代码
git merge < branch>:合并指定分支到当前分支

一般在merge后,都会出现conflict,需要针对冲突情况,手动解决冲突。主要是因为两个用户修改了同一文件的同一块区域。如下图所示,需要手动解除。
Git版本控制

rebase
Git版本控制
rebase又称为衍合,是合并的另外一个选择。
在开始阶段,我们处于new分支上,执行git rebase dev,那么new分支上新commit都在master分支上重演一遍,最后checkout切回到new分支。这一点和与merge是一样的,合并前后所处的分支状态并没有发生改变。git rebase dev,通俗的解释就是new分支想站在dev的肩膀上继续下去。rebase也要手动解决冲突。

rebase和merge的区别
现在我们又两个分支,test和master,提交如下:

      D---E test
     /
A---B---C---F master

在master执行 git merge test ,然后会得到如下:

      D--------E
     /          \
A---B---C---F----G   test, master

在master执行 git rebase test,会得到如下:

A---B---D---E---C'---F'   test, master

就是merge后会产生一个新的节点,而rebase不会,是将两个分支融合成一个线性的提交。

如果你想要一个干净的、没有merge commit的线性历史树,那么你应该选择rebase,如果你想保留完整的历史记录,并且避免重写commit history的风险,你应该选用git merge

reset
Git版本控制
reset命令把当前分支指向另一个位置,并且相应的变动工作区和暂存区。

git reset --soft < commit>:只改变提交点,暂存区和工作区的内容都不变。
git reset --mixed < commit>:改变提交点,同时改变暂存区中的内容。
git reset --hard < commit>:暂存区、工作区的内容都会被修改到与提交点完全一致的状态
git reset --hard HEAD:让工作区回到上次提交的状态

revert
Git版本控制
git revert 用一个新的提交来消除一个历史提交所做的任何修改。

revert和reset的区别
Git版本控制

  • revert是用一个新的commit来回滚之前的commit,reset直接删除指定的commit
  • 在回滚的角度上看,效果是差不多,但是日后继续merge以前的老版本有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,减少了冲突。但是reset是直接把某个commit在某个branch上删除,因而和老branch merge的时候这些被回滚的commit还会被再引入,产生很多冲突。
  • reset是把HEAD向后移了一下,revert则是继续向前前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

push
同步本地仓库和远程仓库。
git push < remote>< branch>:上传本地指定分支到远程仓库
git push < remote> --force:强行推送当前分支到远程仓库,即使有冲突
git push < remote> -all:推送所有分支到远程仓库

相关文章: