GIT简单介绍与使用

来源:互联网 发布:js调用windows命令 编辑:程序博客网 时间:2024/06/04 18:58

前段时间由于工作需要去深入了解了一下Git,谈不上精通,但也熟悉了Git的原理以及一些常用命令的使用。更深入的研究还需要慢慢去琢磨啦,在解决问题中成长~~

1.Git简单介绍

想要熟悉使用Git各种命令,首先得了解Git的工作原理。Git是一个分布式版本控制系统(Distributed Version Control System,简称 DVCS)。如何理解分布式版本控制系统呢?简单通俗的讲就是协同合作的每个开发者PC端都会有一个完整的版本库,不需要完全依赖一个中央服务器。每个人都可以在自己的PC端修改并提交改动更新本地版本库,也可以互相推送/获取提交,如下图所示。在实际应用中,通常是设置一台远程服务器(即常说的远程版本库),用于开发者推送自己的提交,方便别人获取,同时也获取最新的代码。

这里写图片描述

由于任何协同工作的PC端都有完整的版本库,所以Git几乎很多操作都是在本地进行,执行速度也快,因为大部分操作访问的文件和资源都已在本地版本库中,不需要访问远程服务器。同时一旦远程服务器发生宕机,都可以使用任何一个本地仓库进行恢复。

Git保存数据的方式并不是对每一次的提交更新保存每个文件与原始文件的差异,而是对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件

2.Git常用命令

在使用Git命令进行操作前,有必要先了解一下Git的几个术语。

Git仓库:这是Git 用来保存项目的元数据和对象数据库的地方,也就是你项目下的.git文件夹。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

工作目录:是对项目的某个版本独立提取出来的内容,也就是你的工作区。

暂存区:保存即将提交的文件列表信息。

一般的Git工作流程如下:

1.在工作目录中修改文件

2.暂存修改,将文件加入暂存区

3.提交更新

4.将更新推送至远程服务器,更新远程仓库,与他人共享。

查看命令具体用法

  git help <command>   git <command> --help  #这两个命令都是显示command的help文档

将文件加入暂存区

  git add <file>  #将修改的工作文件添加到暂存区  git add -u      #将所有修改或删除的文件,添加到暂存区。  git add .       #将当前目录的所有修改、新建的文件,添加到暂存区。  git add -A      #将所有修改、删除、新建的文件,添加到暂存区。 #Example:例如你在本地修改了a文件,新建了b文件,此时使用git add ., 该命令将此次所有的改动文件都加入了暂存区,而不用分别执行git add a和git add b。

提交改动

  git commit -m "message" #提交修改,message是该次提交说明      git commit --amend       #修改最后一次提交信息(该命令详细使用在修改提交历史中)

从版本库删除文件

git rm <file> #从git库中删除文件,该文件不再被git跟踪,同时工作区的文件也被删除git rm <file> --cached #从git库中删除文件,但不删除文件,只是将不再被git跟踪

撤销操作

  git checkout -- <file> # 撤销工作区指定文件的修改  git checkout . # 撤销工作区所有修改  git reset HEAD <file>   #取消文件暂存,即当文件已通过git add操作添加到了暂存区时,可通过此命令撤销  git reset --soft <commit-id>   #回退到指定的commit-id版本,此时工作区自从commit-id之后的所 有提交所做的修改都在,且处于暂存状态(即处于使用了git add操作的状态)。  git reset --hard <commit-id>  #回退到指定的commit-id版本,此时工作区自从commit-id之后的所有提交所做的修改都不在。  git reset <commit-id>   #回退到指定的commit-id版本,此时工作区自从commit-id之后的提交所做的修改都在,此时的这些修改处于修改状态。  git revert <commit-id>  #回退到指定的<commit-id>提交版本,但此次撤销回退动作本身会产生一次提交上述的<commit-id>也可以通过HEAD来指定,HEAD可以看作是一个指针,指向当前分支上最新的提交。HEAD~n(或HEAD^n,其中n是数字)表示当前最新的上n次提交.Example:git reset --hard HEAD~2 表示硬重置工作区到上两次提交时的状态。

查看文件差异

  git diff <file> #查看指定暂存文件做的修改  git diff <commit-id1> <commit-id2>#比较两次提交之间的差异  git diff <branch1>..<branch2>#两个分支之间比较差异

查看提交记录

  git log <file>    #查看指定文件每次提交记录  git log -p <file> #查看指定文件每次提交修改了哪些内容  git log -p -n     #查看最近n次提交修改了哪些内容   

Git 本地分支管理

查看分支

  git branch -r # 查看远程仓库有哪些分支  git branch -a #查看本地和远程的所有分支  git branch -v # 查看各个分支最后提交信息

创建分支

  git branch <new_branch_name> # 在本地仓库创建新的分支  git checkout <branch_name> # 切换到指定分支  git checkout -b <new_branch>   #创建新的分支,并且切换到该新建分支上,相当于操作:git branch <new_branch>+git checkout <new_branch>  git checkout -b <new_branch> <branch>#基于指定的branch创建新的new_branch  git checkout <commit-id> -b <new_branch>   #把指定的commit-id提交之前所有内容checkout出来,创建成一个分支

删除分支

  git branch -d <branch> #删除某个分支  git branch -D <branch> #强制删除某个分支(未被合并的分支被删除的时候需要强制)

设置本地分支跟踪远程分支

    git branch <local_branch> -u  <upstream_branch>    #设置local_branch指定的本地分支跟踪远程分支upstream_branch    例如:git branch master_feature -u origin/master    表示设置本地的master_feature分支跟踪远程仓库的master分支。

分支合并

 git merge <branch>         #将branch分支合并到当前分支 git rebase <base_branch> <branch_name> #将<branch_name>上的代码更新为<base_branch>指定的分支最新代码,然后再将上<branch_name>指定的分支上的修改应用到最新代码上。 git rebase --onto base from to#将一个分支上的(from,to]区间内的所有提交在base上重建。其中的base,from,to可以是分支名也可以是commit-id。

git rebase –onto base from to该操作的效果如下图例子所示,这里的base from to均是指定的commit-id。

这里写图片描述

rebase与merge的区别

这两种操作都可以合并分支,但是两者所做的操作是不同的。下面假设一个场景来进行说明两者的区别:

假设此时由于新的开发的需求,在master分支上checkout出了新的分支开发feature,在此段期间,master分支上也有了新的提交,此时分支分叉为下图所示的状态:
这里写图片描述

当新的feature开发测试完成之后,要把experiment上自分叉后的提交合入master到上。此时可以有两种操作:merge 和rebase。

1.将experiment分支merge到master分支,此时它会把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交)。

这里写图片描述

2.使用 git rebase master experiment(该命令等于:git checkout experiment+git rebase master,即在experiment分支上rebase master分支)将提交到experiment上的所有修改都移至master分支上。rebase首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支(experiment)相对于该祖先(C2)的历次提交,提取相应的修改并存为临时文件,然后将当前分支(experiment)内容更新为C3, 最后以此将之前另存为临时文件的修改依序应用。

这里写图片描述

所以当你需要将两个分支合并时,根据您的需要来选择使用merge 还是rebase。

打补丁

 git format-patch commit-id  #将某次提交生成补丁,该操作将生成一个.patch文件 git am <patch-file>  #将补丁应用在当前分支,之后会产生一样的提交记录 git apply --check <patch-file> #测试补丁能否成功

暂存管理

git stash #将本地修改暂存到栈中git stash list  #列所有stash内容git stash apply #将暂存的内容应用到工作区,暂存栈中还留有暂存的内容git stash pop   #将暂存的内容应用到工作区,同时删除暂存栈中此次的内容git stash drop  #删除暂存栈的内容

远程仓库相关操作

从远程仓库克隆代码

git clone --bare <remote_git_url>#克隆远程仓库,得到的是一个裸仓库,就是没有工作目录的代码仓库。git clone <remote_git_url>#克隆远程仓库的代码,得到的是一个完整的版本库,工作区的内容默认切换到master分支git clone -b <branch_name> <remote_git_url>#克隆远程仓库的代码,得到的是一个完整的版本库,并且工作区的内容切换到指定分支

与远程仓库交互

git pull # 抓取远程仓库所有分支更新并合并到本地git pull --rebase #抓取远程仓库所有分支更新并rebase到本地git fetch origin <branch_name># 抓取远程仓库更新(只是获取远程更新,并没有合并到本地)git push origin <branch_name> # 将本地主分支推到远程分支git push origin <local_branch>:<remote_branch> #将本地的local_branch分支推到远程remote_branch分支git push origin :<remote_branch> #删除远程分支

远程仓库管理

 git remote -v #查看远程服务器地址和仓库名称 git remote add origin <remote_git_url>#设置<remote_git_url>为远程仓库地址

修改提交历史

修改最后一次提交

git commit --amend#该命令可用于修改最后一次提交(还没有推送到远程),可用于以下场景:1.修改最后一次提交信息,该命令会进入Git默认文本编辑器,里面有之前的提交信息,你可以修改你的提交信息。2.当你已经提交修改后,发现少提交了其他文件或者又修改了刚才提交的文件。此时需要执行git add <file>将新修改的文件加入暂存,然后执行该命令,可以将之前的提交内容更新为最新的修改。

删除某次提交/修改提交顺序

想要删除提交历史中的某一次提交,或者改变某几次提交的顺序怎么办呢?
此时使用git rebase -i 进入交互模式可以做到。看下面的一个例子:在我的demo项目里面,我本地产生了三次提交如下图:

这里写图片描述

现在我想删掉中间的一次提交”modify you file”,然后交换”modify reademe file”和”modify demo02 file”这两次提交顺序。方法如下:

1.git rebase -i [commit-id]
#这里的commit-id是这三次提交中最早一次提交的父提交0dbe33b
这里写图片描述
2.此时会进入Git默认的文本编辑器,里面信息如下:

这里写图片描述

请注意其中红线圈出的部分的历史跟git log查看的顺序是反的,时间最早的提交在最上面,然后根据提交顺序依次往下。前面的pick就是可以操作该次提交的命令,其他更多的命令说明在下面的注释说明文字中。可以看到drop就是删除该次提交,因此修改”modify you file”这次提交前的pick 为drop,然后交换交换”modify reademe file”和”modify demo02 file”这两次提交顺序,最终结果如下图所示:
这里写图片描述

然后保存并推出文本编辑器,该次rebase操作完成,这时候查看log,Done!!

这里写图片描述

合并提交

当你在本地已经有了好几次提交,这时你突然觉得这几次提交都可以合为一次提交,想合并的时候又该怎么做呢?这时候仍然使用git rebase -i进入交互模式来完成,请看下面的例子:
在我的Demo项目里,我有两次提交:”modify demo02 file”和”modify reademe file”。

这里写图片描述

现在我要将两次提交合并为一次提交,方法如下:

1.1.git rebase -i [commit-id]
#这里的commit-id是这两次提交中最早一次提交的父提交0dbe33b

这里写图片描述

2.此时会进入Git默认的文本编辑器,提交记录的顺序是升序的,最上面的是最早的一次提交,最下面的是最后的一次提交。将”modify demo02 file”提交前的pick改为squash,表示将此次提交合并到前一次提交。修改结果如下图所示:然后保存并推出编辑器。
这里写图片描述

3.此时Git会完成rebase,合并这两次提交的修改,会再次进入文本编辑器,你可以修改合并后提交的信息。然后保存并退出,这时候两次提交合并完成。git log查看结果:

写在最后的话

本文中部分内容参考了GIT官网文档:https://git-scm.com/book/zh/v2/,之后在使用中解锁了更多的用法再来更新~~