本文总结了我了解的Git使用要点,算是一个笔记,希望达到不管经过多久回头看都能看懂的程度。
第一次写,不太规范,大白话预警。
Git是一个分布式版本控制系统,由Linus用C语言编写而成,可在各系统使用,本文环境为Windows。
分布式系统使得每个人的电脑上都有一个完整的版本库,无需联网即可操作。这里推荐廖雪峰老师的Git教程,就不赘述了。
git config --global user.name "用户名"
git config --global user.email "邮箱"
在哪打开无所谓,之后可以输入git config --list
查看设置。
我直接整的github账号,错了可以重新设置。
–global 参数表示该配置运用于本机所有的Git仓库。
可以把Git的工作流程划分为三个部分,工作区、暂存区、版本库。虽然以区划分,实际上都是在本地目录下进行操作的。一般该目录即可称为版本库,亦即Git仓库repository。
在该目录下右键召唤Git Bash
即可工作。
如果仅要求理解,可以把工作区看作是草稿区。草稿区可以对文件进行任意创建、修改、删除操作,但是在没有提交之前,都属于是单机活动,对版本库没有任何影响。
而工作区的操作要提交至版本库,需要经过暂存区。可以看作是一个存档区,存储文件经过一次或多次的操作之后的版本。
在工作区确定无需再进行任何操作后,可以将暂存区的文件一次性提交至版本库。这个提交过程可以看作是草稿保存的过程,保存后版本库里的文件会更新,并且所有人可见。
Git Bash Here
,创建一个空目录(文件夹),并进入该目录下。这一步理论上也可以直接手动操作,没啥好说的 。.git
文件夹,这是用来跟踪管理版本库的,放着别动。)mkdir 目录名
cd 目录名
git init
也可以用非空目录创建版本库。
即工作区上传文件至版本库的过程,分为两步:
git add 文件名
过程中可以随时使用git status
查看当前所有未提交至版本库的改动信息。
git commit -m '对本次提交的说明'
-m参数表示进行说明,可以不说明,不建议。
说明尽量有意义,比如“创建1.txt”或者“wrote a index file”,便于在历史记录中查看提交记录。
本次提交有反馈,系统会提示具体改动信息。
可以多次add
,再commit
一次性提交。
在这里浅提一下暂存区和版本库的工作机制(从外面学到的,没得图):
Git的暂存区和版本库都各有一棵目录树,同时二者共享同一个对象库,这个对象库可以看成是一个磁盘,存放所有文件信息,而暂存区和版本库的目录树都是用来读取对象的索引。
不同的是在进行add
操作之后,修改内容会被写入对象库,同时更新暂存区的目录树——此时只有暂存区能读取到最新修改的意思!
只有进行commit
操作之后,暂存区的目录树被写到版本库的目录树,此时版本库才能读取到最新修改的对象信息。
这个对象很抽象啦,当成文件就行。
在工作区进行修改后的文件再次上传同样需要经过add
和commit
两步,同时如果不确定修改内容,可以通过git status
和git diff
进行查看。
超低阶只会手动修改,米娜可以用vi==
撤销已经提交至版本库的修改,即回退到某个版本,首先我们需要知道如何查看历史提交记录:
git log
用于显示提交时间由近及远的提交记录。
commit
后面那串是经过SHA1加密后的版本号,可用来唯一确定每次提交。
另外,前面已经提到版本库有一棵目录树,该目录树由HEAD
的指向来确定当前版本(可以看成头指针),则前一个版本为HEAD^
,再前一个为HEAD^^
,再再再再再再前一个为HEAD^^^^^^^
(划掉)HEAD~n
。
假设我要撤销这次删除,那么从提交日志可以看到HEAD
目前指向的就是删除操作这条记录,因此我需要回退到HEAD
前一个版本也就是HEAD^
,回退命令为:git reset --hard HEAD^
,如图:
或者,也可以用版本号来进行回退:git reset --hard 'commit-id'
写前几位就行。
在执行reset
命令时,版本库当前HEAD
的指向改变,同时将改变后的目录树写到暂存区的目录树。
因此,回退之后重新查看历史提交记录,会发现最新的那条已经被自动删除了。
但是改变的只是HEAD
指向,修改的内容一直处于对象库中。所以如果需要重新再回到最新版本b6273
,可以用git reset --hard b6273
。
如果不知道版本号,可以用git reflog
查看所有提交命令,我称为HEAD
的整条链表信息(我谁啊
总结一下:git reset 'commit-id'
可以用于版本回退和还原。
老师说得好,Git比其他分布式版本控制系统更优秀的地方在于其跟踪的是修改而不是文件。
还未添加至暂存区的修改,可以使用git checkout --'filename'
来撤销。
已经添加至暂存区的修改,使用git reset HEAD 'filename'
来撤销,此时修改内容回退至工作区。
详见第五节,不过仅在仓库未推送至远程仓库的情况下。
相当于在服务器上的仓库,相当于GitHub上的仓库就是了。
由于本地Git和GitHub是通过SSH加密传输的,故需要先给计算机创建SSH Key:ssh-keygen -t rsa -C 'email'
,之后一路默认,可以不设密码。
设置成功一般在用户文件夹里会生成一个.ssh
文件夹,内含两个文件,.pub
为公钥,需要复制下来,放GitHub->settings->ssh and gpg key->new ssh key。
这里不太懂,先放个坑==
使用git remote add origin 'address'
进行关联
使用git push -u origin master
进行推送
这里擅自往本地仓库加了一个2.txt^^
然后回头看我们的GitHub就变成这样:[假设这里有张图把,其实文件已经全部上传了.jpg]
-u参数是为了关联远程(origin)和本地的master分支,后面可以不用写。
这里的origin
只是给该远程仓库的一个命名,可以瞎取(不是)
使用 git remote rm 'origin'
,其中origin
为给远程库的命名。
假设因为瞎取所以忘了……可以用git remote -v
或者git remote show origin
查看远程库状态信息。
这里的删除是在本地操作的,实际上仅仅删除了关联,远程端需要从GitHub删除。
这里有两种情况,一是在GitHub创建全新的仓库克隆至本地,二是克隆其他人的项目至本地。
不过没啥区别,都需要获取到网址,就这个:
然后用git clone 'address'
克隆至本地即可。
多人协作,主要用在工作上,使用分支,大家可以互相不受影响地进行修改再合并。
默认分支是master,其实就是版本库的HEAD
指向的那个分支。一般来说master仅用于版本更新,其余操作都应该在其他分支上进行。
git branch //查看分支
git branch 'name' //创建分支
git switch 'name' //切换分支
git switch -c //创建并切换分支
git merge 'name' //合并该分支的修改至当前分支
git branch -d 'name' //删除分支
暂未修改完成的工作内容,可以用git stash
存储,此时工作区就是干净的。
所有存储的工作现场可以用git stash list
查看,后续可以通过git stash apply stash@{n}
或git stash pop
恢复。
apply
恢复后并不自动删除stash
里的内容,需要通过git stash drop
。
很显然这里我还没实操^^
再放个坑。
git config --global user.name 'Name'
git config --global user.email 'email'
//绑定用户git config --list
//查看配置信息git init
//初始化仓库git add 'filename'
//添加文件至暂存区git commit -m 'message'
//提交暂存区所有文件至版本库git status
//查看当前目录树git diff
//查看改动具体信息git rm 'filename'
//删除文件git log
//查看历史提交记录git reset HEAD^
//回退到HEAD
上一个版本git reset 'commit-id'
//回退或还原至commit-id
版本git reflog
//查看所有提交命令,以及HEAD
信息ssh-keygen -t rsa -C 'email'
//设置SSH Keygit remote add origin 'address'
//关联远程和本地仓库git push -u origin master
//第一次推送本地仓库至GitHubgit remote -v
git remote show origin
//查看远程库状态信息git remote rm 'origin'
//删除本地与远程库的关联git clone 'address'
//克隆远程库至本地