git作为一个版本控制系统,现在用的地方也非常多,比如GitHub其实就相当于使用git进行版本控制远程仓库,在上面可以找到很多优秀的项目,因为工作中也会经常用到git,所以觉得有必要去学习下,就去看了个教程,了解下git的基础原理。
git中常用的包括5个部分:工作区(即工作目录),贮藏区,暂存区,本地仓库,远程仓库。它们之间的关系如下图:

贮藏
贮藏就是将工作区中已修改但是未暂存的内容放入贮藏区中保存起来,以便工作区是干净的,没有任何修改的,此时就可以进行其他的修改或者进行分支切换了。等事情忙完后又可以将贮藏区中的内容应用到工作中继续进行修改了。
git stash:默认参数是save,即保存修改到贮藏区,执行git stash等同于git stash save。
git stash list:查看贮藏的记录,执行一次git stash就会产生一条记录,注意此命令并不能直接查看贮藏区中文件的具体内容。
git stash apply [stashname]:默认应用贮藏区中最近一次贮藏的内容到工作区,也可以指定应用某次贮藏的内容。
git stash drop [stashname]:默认删除贮藏区中最近一次贮藏的内容,也可以指定删除某次贮藏的内容。
暂存
暂存就是将工作区中修改或添加的内容保存到暂存区,并用于稍后提交到本地仓库中,此时工作区就会变成干净的了,当发现暂存的内容与我们想要提交的内容不一样时,也可以取消暂存的内容重新修改。
git add filename/dirname:将工作区的指定文件或者指定目录下的所有文件添加到暂存区。执行“git add .”表示暂存所有。
git rm --cached filename/dirname:取消暂存,可以指定文件或目录。
提交
提交就是将暂存区中的内容提交到本地仓库中中,需要注意的是不能直接提交工作区中的内容,一些软件的提交操作看似是勾选文件后就可以一步提交,其实也是执行了add和commit两个步骤。提交之后就产生了一个新的版本,如果发现提交的内容有问题,可以使用回滚提交,重新修改后再次提交即可。
git的每一次提交其实就是一次快照,也会产生一个新的版本,这个版本指向的就是此次提交对应的快照,即每个版本保存的是整个文件的所有内容,而不是每次提交修改的那部分内容。如果某个文件此次提交没有修改,则保存的是指向它最近一次修改提交的索引,如果此次提交有修改,则保存的是此文件的全部内容。
git commit [-m "message"]:提交暂存区中的内容,如果不加-m
参数,git将会跳转到一个编辑窗口,这个窗口会显示你将要提交的内容,并要求你填写提交信息。加了-m
这个参数后就会直接进行提交,并不会显示将要提交的内容,message即提交时填写的提交信息。
git commit --amend -m "message":重新填写上次提交的提交信息,如果提交时发现提交信息填写错了,可以使用这个命令重新填写。
git revert commitcode:回滚提交,会将指定提交码提交的内容回滚并应用于工作区和暂存区,并重新产生一个提交。
差异比较
git diff [filename/dirname]:会将工作区和暂存区的内容进行比较。
git diff --cached [filename/dirname]:将暂存区的内容与本地仓库的内容进行比较。
git diff HEAD:直接比较工作区和本地仓库的内容。
检出
git checkout --filename/dirname:将暂存区的内容同步到工作区中,即工作区中即使有内容,并且和暂存区中不一样,也会被暂存区的内容覆盖。
git checkout HEAD:将本地仓库的内容同步到工作区和暂存区中,即工作区和暂存区中即使有内容,并且和本地仓库中不一样,也会被本地仓库的内容覆盖。
重置
git reset -- filename/dirname:将暂存区中的指定文件或者指定目录下的所有文件删除,而工作区中的内容不会变动,即重置文件或目录的当前状态,执行“git reset -- .”表示重置所有。一般来讲,工作区中的内容和暂存区中的内容是一致的,如果不一致,即暂存文件后,又对此文件进行了修改,那么此命令只是删除暂存的记录,不会修改工作区中的内容。
git reset --hard commitcode:强制重置当前分支(工作区,暂存区以及本地仓库)到指定提交码的版本状态,由于重置之后不可逆,此命令需慎用!
分支
分支即使基于另一个分支的某次提交进行自己的开发,不同的分支的更新是互不干扰的。
如果两个分支需要合并,则需要这两个分支拥有共同的基,如下图,master分支和develop分支共同的基为v2,而master分支和bug分支共同的基为v3。

合并分为3种合并方式,快进、解决冲突和先变基再合并,但是合并时其实最终都采用的是快进和解决冲突的方式,只不过不同方式的原理和产生的提交记录会有所不同:
快进Fast-forward:即合并的两个分支,某个文件或者真个项目在一个分支上相较于另一个分支上是没有变过的,还是创建分支时作为基的那个版本,如下图:

解决冲突:当某个文件在两个分支上都进行了修改,则会提示冲突,需要手动解决冲突后作为新的提交和版本合入其中一个分支,如下图:

变基rebase:将其中一个分支的基直接变为另一个分支最新的版本,然后再两者的差异进行合并,需要注意的是如下图中此时合并并不是在新的基v4上重新进行develop自身的每次提交,即v2-1和v2-2,而是直接使用两个分支最终的提交(v4和v2-2)进行比较和合并的,只是在提交记录上会显示如下图:

git branch branchname [basebranch]:默认基于当前分支创建新分支,也可以指定基于某个特定的分支。
git branch -v:查看所有分支。
git branch -vv:查看所有分支,及其跟踪的远程分支。
git checkout branchname:检出并切换到指定分支
,如果本地没有对应分支,但是远程有对应分支,则会自动在本地创建该分支。
git checkout -b branchname:创建一个新分支
,并切换到该分支。
git merge branchname:将指定分支
上的内容直接合并到当前分支上,最终的合并结果会产生一个新的提交。
git branch -d branchname:删除指定分支。
git cherry-pick commitcode:将其他分支的某次提交的内容合并到当前分支上。
git rebase [--onto newbase] startbranch [branchname]:rebase方式合并分支,rebase就是变基的意思,--onto newbase 默认和start一致,branchname默认就是HEAD,即当前分支,此命令的作用是将当前分支或指定分支的“基”变为另一个分支的最新提交,原理是:
第一步,切换分支到branchname,第二步,计算branchname与startbranch之间的差集,第三步,将branchname切换到newbase上,成为新的branchname,第四步,将差集应用到branchname上。例如使用rebase方式将dev分支合并到master上,可以执行以下命令:
- 当前分支在dev上,即HEAD为dev分支。
- 执行git rebase master:此时,newbase和start指向的都是master,并且dev的“基”已经变为master的最新的一次提交了,而不是当初新建分支时的提交了。
- 执行git checkout master。
- 执行git merge dev。
手动解决冲突
一个分支合并到另一个分支,如果存在冲突,需要解决冲突后重新执行git add -A
和git commit
命令,解决冲突时,如果是文本,冲突的地方会被======
将两个分支的内容分开,<<<<<<<HEAD
表示当前分支的内容,>>>>>>>[branchname]
表示另一个分支的内容。
推送拉取
平常工作中,我们一般都会使用到远程仓库,便于整个团队的协同工作。这时候就需要我们将本地仓库与远程仓库进行同步,可以让你知道别人改了什么内容,也可以让别人知道你改了什么内容。
git clone xxx.git:从远程仓库克隆一个项目到本地作为本地仓库,即copy下载到本地。
git pull:从远程仓库的内容拉取下来并合入本地仓库。
git push:将本地仓库的内容推送并合入到远程仓库。
其他常用命令
git init [dirname]:版本初始化,在一个文件夹下执行这个命令表示会将这个文件夹下的内容设置为初始的git版本,即本地仓库版本。如果指定了文件夹名称,将会以指定的文件夹为本地仓库,如果指定的文件夹不存在则会自动创建。
git config user.name "名称":配置用户名,也可以通过git config user.name查看用户名。
git config user.email "邮箱地址":配置用户邮箱地址,也可以通过git config user.email查看用户邮箱地址。
git status [-u]:状态查询,查看当前git库中的修改跟踪情况,加了-u
参数后,将会显示详细的跟踪情况。
git log:默认显示所有提交信息,可以使用其他参数显示特定的信息:
- git log -n:只显示最近提交的n条记录。
- git log -n -p:显示最近提交的n条记录的详细信息。
- git log --oneline:每次提交的信息都在一行之内显示(只显示少量信息)。
gitk:会打开一个新的GUI窗口,以图形化的形式展示所有的提交信息。
.gitignore:如果想要忽略某些文件,则可以在git库的根目录下创建一个.gitignore
文件,然后将想要忽略的文件或者文件规则写入这个文件中即可,在git status
时就不会显示忽略的内容了,并且git也不会将这些内容纳入版本管理的范围了。常用的规则如下:
- 文件:直接写入文件的路径即可,如
a.txt
。
- 目录:添加对应目录路径即可,如
test/
。
- 同一后缀名的文件:使用星号匹配即可,如
*.pyo
。
HEAD:这是一个标签,指向当前正在使用的分支。
git使用
原文:https://www.cnblogs.com/guyuyun/p/12081762.html