简介
Git是一款免费、开源的分布式版本控制系统,方便相互协作开发。
安装
我主要的环境是windows,所以在介绍在Windows上安装Git,我们只需要百度Git for Windows,然后点击下载,安装后,桌面会有Git BASH和Git GUI。
Git BASH
Git for Windows提供了用于从命令行运行Git的BASH仿真。* NIX用户应该感觉到在家里,
因为BASH仿真的行为就像LINUX和UNIX环境中的“git”命令。
Git GUI
由于Windows用户通常期望图形用户界面,Git for Windows还提供了Git GUI,
它是Git BASH的强大替代品,
提供了几乎所有Git命令行功能的图形化版本,以及全面的视觉差异工具
配置Git用户信息
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。要检查已有的配置信息,可以使用 git config --list 命令
这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录,如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉--global 选项重新配置即可,新的设定保存在当前项目的.git/config 文件里。
创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”
在电脑的任何地方,创建一个空的文件夹,然后cd到文件夹,pwd显示当前目录
*(备注:使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。)*,
通过git init命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in 你的pwd
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见
仓库的提交
image.png根据上面的图片,下面给出了每个部分的简要说明:
Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
.git:存放Git管理信息的目录,初始化仓库的时候自动创建。
Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
First:我们需要先打要提交的文件,放入工作空间--把文件放入建立仓库的文件夹
Second: 用命令git add告诉Git,把文件添加到仓库
Last:用命令git commit告诉Git,把文件提交到仓库
备注:解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,
当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
当然文件的编码最好选择utf-8
查看仓库的更新
- 通过git status可以查看WorkSpace的状态
- 通过git diff用于显示WorkSpace中的文件和暂存区文件的差异
- 通过git log命令显示从最近到最远的提交日志(备注:如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline,这样就只有commit id(版本号)和改动内容
- 通过git reflog命令会显示,记录这个仓库中所有的分支的所有更新记录,包括已经撤销的更新
对仓库进行撤回
根据前面对基本概念的了解,更新可能存在三个地方,WorkSpace中,Stage中和repo中。下面就分别介绍一下怎么撤销这些更新
使用"git checkout --<file>..."来撤销WorkSpace中的更新
(备注:使用这种方法撤销更新的时候一定要慎重,因为通过这种方式撤销后,
更新将没有办法再找回)
通过"git reset HEAD <file>..."把暂存区的更新移出到WorkSpace中
使用命令git reset --hard commit_id或者git reset --hard HEAD^,用来指向repo中想要的版本。
(备注:使用HEAD指针或者使用commit id
HEAD指针指向当前分支中的版本。上一个版本就是HEAD^,
上上一个版本就是HEAD^^如果想回退到更早的提交,可以使用"HEAD~n"。
(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2))
commit id(版本号)是一个SHA1计算出来的一个非常大的数字,用十六进制表示,
版本号没必要写全,前几位就可以了,Git会自动去找。
当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了
--hard和--soft
前面在使用reset来撤销更新的时候,我们都是使用的"--head"选项,其实与之对应的还有一个"--soft"选项,区别如下:
--head:撤销并删除相应的更新
--soft:撤销相应的更新,把这些更新的内容放到Stage中
仓库删除文件
- 对WorkSpace中的文件进行删除了,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了
- 现在你有两个选择:
一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit -m
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本 git checkout -- <file>
远程仓库
- GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密,在Github中绑定id_rsa.pub公钥。
创建SSH Key。在用户主目录下,看看有没有.ssh目录,
如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,
如果已经有了,可直接到 Github里面设置。如果没有,打开GitBash,创建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
- 把自己本地的仓库和Github的开源仓库进行关联
git remote add origin git@github.com:user_name/Github仓库的名字.git - 把本地库的内容推送到远程,用git push命令
$ git push -u origin master (备注:由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令) - 每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
从远程仓库克隆
1.勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件(.md文件是markdown格式的写法)
用命令git clone克隆一个本地库(path取决于pwd)
Cloning into 'mygit'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd gitskills
$ ls
README.md
注意把Git库的地址换成你自己的,然后进入mygit目录看看,已经有README.md文件了
Github的分支管理
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
强制删除:git branch -D <name>
有时候分支合并会有冲突git status也可以查看冲突的文件,
我们也可以自己cat查看文件内容
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
我们找出不同点,进行修改,然后add和commit
用git log --graph命令可以看到分支合并图
通常,合并分支时,如果可能,Git会用Fast forward模式,
但这种模式下,删除分支后,会丢掉分支信息
强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,
这样,从分支历史上就可以看出分支信息
git merge --no-ff -m "merge with no-ff" dev
备注:因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
bug分支
$ git checkout -b issue-101
$ git merge --no-ff -m "merged bug fix 101" issue-101
(备注:修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,最后进行合并)
Git提供了一个stash功能,可以把当前工作现场“储藏”起来
用git stash list命令查看stash内容
一是用git stash apply恢复,但是恢复后,stash内容并不删除,
你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
多人协作
查看远程库的信息用git remote或者用git remote -v显示更详细的信息
推送分支git push origin master/git push origin dev
远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支
要在dev分支上开发,就必须创建远程origin的dev分支到本地
git checkout -b dev origin/dev
从本地推送分支,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,
本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,
使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突
Git的标签
- 命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;命令git tag <name> commit_id
- 创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a <name> -m "blablabla..." commit_id - 用git show <tagname>查看标签信息
- 推送某个标签到远程,使用命令 git push origin <tagname>
- 次性推送全部尚未推送到远程的本地标签 git push origin --tags
- 命令git tag -d <tagname>可以删除一个本地标签;
- 命令git push origin :refs/tags/<tagname>可以删除一个远程标签
总结
整体来说,git的功能都是很强大的,我自己写这样一篇git的操作,也是相当于,自己给自己做笔记,方便,自己以后找资料用,同时也可以给予初学者一定的帮助。
网友评论