Git是一个分布式的版本控制系统,可以用于管理项目。使用Git的操作主要有从资源库中克隆资源,对克隆的项目作添加或修改,并且可以查看改动了哪些内容,最后可以将这些修改通过推送操作提交到资源库中。此外,提交的修改可以撤消并重新提交。
在官网下载安装包即可进行安装,安装完成后在需要使用git的文件夹中点击右键即可看到“启动git bash”,这就可以通过命令行来进行git操作了。
工作区:即电脑中能看到的目录。
版本库:工作区的隐藏目录.git,是Git的版本库,且不属于工作区,包含了index和HEAD等重要文件。
暂存区:存放于.git目录下的index文件中,包含有一棵目录树。用于保存修改过但未正式提交的文件。
对象库:位于.git/objects目录中,里面包含了创建的各种对象及内容。
分支:项目的每一次提交串起来可以形成一条时间线,这条线可能会在某个节点出现分岔,而这些每一个分岔都是一个分支,一个项目可能存在多个分支。其中最早创建的时间线叫主分支(master分支)。master指向该时间线上的最新一次提交,每次提交时master都会向前移动。每一条分支都可以由该分支上最新的那次提交来确定。
HEAD:HEAD相当于一个指针,指向项目当前的版本,也即指向当前分支。
$ git init
或
$ git init [target]
这个命令用来创建并初始化一个Git仓库。进入所选的文件夹,执行git init
命令即可创建。或者在执行git init 时加上目标目录的路径来在该目录进行创建。创建之后该文件夹中会生成一个.git子目录,这个目录用于跟踪版本管理库,包含了资源的所有源数据,之后的许多操作都依赖此目录中的内容。
$ git clone [url]
这个命令用于将一个已有的Git仓库拷贝到本地,即用于复制一个项目。
比如对于GitHub上的项目,使用其clone的url来执行git clone即可将该项目的所有内容拷贝到本地目录中。
另外克隆时可以自己重新定义项目的名称,在指令中url后面加上该名称即可。
可以用于查看项目的当前状态,也可以查看自上次提交后项目是否有修改。
可以查看git status的结果的详细信息
$ git diff (查看工作区中的改动)
$ git diff --cached (查看暂存区中已缓存的改动)
$ git diff HEAD (查看工作区与版本库中最新版本的区别)
$ git diff --stat (显示摘要)
$ git add (添加指定文件)
$ git add . (添加所有文件)
可以用于向项目中添加指定的文件,或添加当前项目的所有文件。执行git add
后,暂存区的目录树被更新,同时对象库也会更新。其中对象库中会产生一个新的对象,其内容即为git add
命令的目标文件的内容,且这个对象的ID会被记录到暂存区的文件索引中。因此暂存区中会包含有工作区中项目的改动的信息。
用于提交更改,执行后暂存区的目录树会写到版本库(对象库)中,master分支会相应地更新。
在进行提交之前,需要先配置用户名和邮箱,因为每次提交都要记录名字和邮箱地址。
$ git config --global user.name 'Drawspirit'
$ git config --global user.email [email protected]
提交时加上-m可以直接在命令行中进行注释,否则会进入vim编辑器界面编写提交信息。
$ git commit -m "Add a new ......"
使用commit进行提交是从暂存区写到版本库中,因此只有修改并且add过的内容才会被提交。
$ git push
可以将本地的提交推送到相应的远程库上(比如GitHub项目)。
$ git reset HEAD
执行此命令时暂存区的目录树会被master分支指向的目录树替换。也就是将暂存区中的修改全部撤销。
可以用于删除文件。
$ git rm
直接使用rm删除或在文件管理器中手动删除文件时,文件将从工作区中删除,git status
指令会告知哪些文件被删除。如果此时执行git commit
,则版本库中的相应文件也会被删除。
如果想要将文件从暂存区删除而工作区仍保留,则在指令后加上–cached。
$ git rm --cached
$ git mv [file_name] [target_name]
可以用于移动或重命名一个文件或目录。
$ git checkout .
$ git checkout --
此命令可以用暂存区中全部或指定的文件替换工作区中对应的文件。也就是将该文件在工作区中的修改全部撤销,即使其回到最近一次add或commit后的状态。此外checkout还能用于切换当前分支,加上参数-b还能用于创建分支。
此命令可以显示提交日志,即提交的各个历史版本。列出来的信息包括commit_id,即版本号,可以用于版本回退,使用git reset --head
就能回退到这些版本中的某一个。
git reset --hard commit_id
进行该操作时,实际上是改变HEAD的指向。
$ git checkout -b branch_name
该命令会创建一个名为branch_name的新分支,然后显示Switch to a new branch 'branch_name'
表示当前以切换到该分支上。(实际上加上参数-b相当于git branch branch_name
加上git checkout branch_name
$ git branch
此命令列出所有分支,并且当前所在分支的前面会有*
号。如果你的git bash有高亮的话当前分支还会显示不同的颜色。
$ git merge branch_name
此命令可以将指定的分支合并到当前分支上。
使用git log
时加上–graph参数可以查看分支合并图。
$ git branch -d branch_name
这条命令会删除指定的分支。要注意的是不能用这条命令删除当前分支,否则会报错,因此想要删除某个分支时先要切换到别的分支上。
当在两个分支上对同一内容做了不同的修改时,若要将二者合并,就会产生冲突。此时Git无法自动合并分支,需要手动解决冲突。
当在工作区中对项目进行了修改并确认后,先使用git add
保存修改到暂存区,然后用git commit
提交到版本库以更新版本,最后用git push
将本地提交推送到远程库中。
当想要放弃当前在工作区中的修改时,使用git checkout --
可以撤销该修改,使工作区回到之前的状态。
当已经git add
之后想放弃修改时,可以先git reset HEAD
然后再git checkout --
当已经git commit
之后想放弃修改时,则使用git log
列出历史版本,找到想要回到的版本的commit_id,然后git reset --hard commit_id
即可回退到该版本。
当想要工作的过程更加安全时,可以选择新建分支,在新的分支上进行操作,这样就不会对主分支造成影响,当确认了新分支的内容之后,就可以将其合并到主分支,再将该新分支删除。
当两个分支出现冲突时,将无法自动合并,这时需要将合并失败的文件手动修改为新的内容后再提交,才能合并。