Git——一种分布式版本控制系统
Git来源:由Linux的创始人Linus花费两周时间用C语言写出来的。
Git主要作用:简单理解为可用于记录文件的每次改动,并可以让多位人员协同修改与管理文件。
常用Git命令
git config
在安装好Git之后运行Git Bash都需要输入下面两行内容,目的是设置本台电脑上Git仓库的配置,表明用户名和邮箱,就是一个身份的标识。
--global 表示这台机器上所有Git库都使用这个身份配置。
“”双引号中内容分别改为你自己的名字和邮箱。
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
git init
创建一个版本库,创建之后对应文件夹下回出现一个隐藏的.git文件夹,用来跟踪和管理版本库。
$ git init
git add <file>
将对应目录下的文件或文件夹——file添加到git库中,可以多次使用来添加多个文件
$ git add <file>
git commit -m <message>
将add到git库中的所有文件提交到git库。message表示对应此次提交的所有文件的修改内容,提炼出一个概括性的描述,用来标识此次提交的操作。
$ git commit -m <message>
git status
随时查看当前工作区的状态,可以理解为就是当前目录中的文件的状态。
如果是对文件做了修改但没有add或commit操作,则会提示哪个文件做了修改,但还没有添加和提交。
如果是对文件做了修改,且已经add过了,则会提示那个文件做了修改,并还没有提交。
如果做了修改且已add和commit过了,则提示在当前分支下,没有需要提交的修改,工作目录是干净的。
总结一下,就是对比当前目录和当前版本库中的不同,add或commit都是把当前目录下问哦们对文件的更改添加或提交进版本库的,如果add和commit都进行过了,则此时版本库中的版本和当前目录中是一样的。如果add和commit没进行过,则代表版本库中还没有更新到最新版本,使用git status就会提示你相较于版本库中的版本,你在当前目录下对哪些文件进行了修改,并提醒你使用add和commit来添加和提交。
$ git status
git diff <file>
接上面git status,提示被修改的文件即为file。运行这句可以用来查看详细的修改,第几行删除了什么(-),输入了什么(+)。
其实还是对比版本库中这个文件与当前目录中这个文件的不同。所以只有还没提交到版本库的时候,可以看当前文件的修改。如果已提交到版本库,则版本库中内容与当前目录中内容已经没有差别了,也就看不了这两者之间的difference了。
$ git diff <file>
git log
可以用来查看对于当前目录已经提交(commit)过几次修改,以及这几次修改对应的一些信息:包括版本号、指针指向的当前修改、作者author,时间date,以及对应的描述。
$ git log
git log --pretty=oneline
用来精简git log输出的内容,每一行代表一次提交的修改,包括版本号、指针指向的当前修改、描述信息。
$ git log --pretty=oneline
注意在输出内容中,若在改动modify1的版本号后面出现这样的内容 (HEAD -> master),代表当前指针指向的是master分支中的修改modify1的版本。
git reset --hard 版本号
将版本回退到版本号对应的那个版本。
--hard 撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交会删除在该版本修改之后的所有修改。
版本号也可以用HEAD^、HEAD^^等代替。对于HEAD指向的当前版本,HEAD^就代表前一个版本,HEAD^^就代表前前一个版本。前第一百个版本可以用HEAD~100来表示。
$ git reset --hard 版本号
git reset --soft 版本号
将暂存区回退到版本号对应的版本,工作区没有回退。
--soft 会使暂存区回退到版本号对应的那个修改刚被add的状态。
此时使用git status会提示由修改需要被提交commit,或者使用git restore --staged <file>来撤销。
1.如果选择提示的restore语句,会回到没有add的状态,并有提示让你add或者restore;依旧选择restore则会将当前目录的文件也更新为版本库的状态,即等同于当前目录中的版本也回退。
2.如果选择提交commit,则会将回退时那个版本号对应的版本之后所有修改都记为新的每一个描述,提交到版本库。使用git log可以验证。
$ git reset --soft 版本号
补充工作区与暂存区的概念。
工作区:电脑中可以看到的目录。
版本库:工作区目录中有一个隐藏的.git文件夹。其中包含暂存区stage和Git自动创建的分支master,以及指向master的指针HEAD。
git reflog
用于查看历史操作,可以显示所有提交的版本号和指针等移动的信息。
如果在前面使用git reset回退到之前的某一个版本A之后,在git log查看则会发现A之后的其他所有修改的信息都不见了,这时如果想要重新恢复到A之后B的版本,则可使用reflog来获得B版本对应的版本号,以再使用git reset恢复到B版本。
$ git reflog
git checkout -- <file>
丢弃工作区的修改,使工作区和暂存区/版本库的内容一样。
这里如果修改后还没有add到暂存区,则运行该命令后,工作区的内容会和版本库中一模一样,即撤销了工作区的修改。
这里如果是add到暂存区后,又做了修改,要撤销这个修改,则运行命令后就会回到前一次add到暂存区对应的状态。
$ git checkout -- <file>
rm <file>
删除工作区的文件file。
此时若该文件是之前commit到版本库中过的,则运行上述rm <file>命令会删掉工作区中的该文件,则版本库中和工作区中就有了区别,运行git status则会告诉你“deleted: test.txt”。
$ rm <file>
现在版本库和工作区中不一致。有两种选择:
1、git rm <file>
该文件确实没用,需要删除版本库中的该文件,git rm <file>,然后再commit 这一操作,此时则版本库中该文件也被删除。且版本库和工作区的内容对应一致。
$ git rm <file>
2、git checkout -- <file>
该文件是不小心删除了,需要恢复,则使用git checkout -- <file>从版本库中将该文件恢复到工作区即可。
$ git checkout -- <file>
此时发现这个checkout上面已经出现过了。
总结起来可以认为git checkout -- <file>这个命令是检查工作区和版本库中的file文件的状态,用版本库中的该文件替换工作区中的该文件。
远程库相关命令
git remote add origin git@github.com:yourname/learngit.git
将本地库与远程库关联。
origin:本地仓库名
yourname:你的github账户名
learngit:远程仓库名
$ git remote add origin git@github.com:yourname/learngit.gi
git push -u origin master
把当前分支master推送到远程库。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在开始,只要本地做了提交commit,就可以通过简化命令:
git push origin master
把提交的修改推送到远程。
git remote -v
查看远程库信息
git remote rm origin
解除本地库与远程库之间的联系。对远程库内容若要删除须在github上操作。
git clone <ssh地址/http地址>
从远程库克隆
关于分支
命令
git branch <name>
创建一个新分支,但注意目前HEAD还没有切换到该分支上去。
git checkout <name>或 git switch <name>
切换分支到name对应的分支上。
git checkout -b <name>或 git switch -c <name>
创建一个新分支name并切换到name分支上
git branch
查看所有分支,当前分支前面标一个*号
git merge <name>
合并name分支到当前分支(带*)上。
git branch -d <name>
删除名为name的分支。
分支的操作与示意图
对于当前工作区已有master分支,且已提交过几次修改。
创建名为dev的分支,并使HESD指向该分支
$ git branch dev
$ git checkout dev
在dev分支上提交修改,假设修改的文件名为123.txt
$ git add 123.txt
$ git commit -m "modify 123.txt"
切换回master分支
$ git checkout master
合并分支
$ git merge dev
删除dev分支
$ git branch -d dev