Git是当今最先进的分布式版本管理系统,是Linus花了两周时间自己用C写成的。相比集中式管理系统SVN,Git可以离线管理你的代码,不用依赖于网速。而且,Git有相当强大的分支管理,这是其他代码管理系统所不具备的。Git 中所有数据在存储前都计算校验和,保证了数据的完整与唯一性。
windows下的Git
mac下的Git
linux下的Git
说起Git不得不说下Git的仓库结构,Git由本地三级仓库和远程仓库组成,它们分别是:
git init
初始化仓库的地方,在编辑器可直观显示与修改git init
初始化仓库时生成的 .git
文件夹 版本库相当于一个文件的数据库,记录了文件的历史版本
以上结构可以用下面的图来说明
######1.初始化Git仓库 git init
新建一个文件夹并进入,然后进行Git的初始操作,初始化代码仓库 git init
此时会在当前目录生成一个隐藏文件夹.git
说明我们已经创建成功了
######2.添加文件或目录到缓存区 git add
先用markdown创建一个readme文件 echo # readme > README.md
之后用 git add README.md
把文件加入到缓存区,注意此时代码只是在缓存区,而没有到了你的本地仓库中。当然你也可以使用 git add a.txt b.txt
提交几个文件 或者 git add ./*
把所有文件提交到缓存区。
######3.把缓存区中的代码提交到本地仓库 git commit
在我们把代码添加到缓存区中后,应该立刻进行提交操作 git commit -m 'commit message'
-m 参数为提交添加注释,你也可以使用 git commit -am 'commit message'
同时执行 git add ./*
与 git commit -m 'commit message'
操作,当我们完成commit
操作,Git会自动为我们创建一个master
分支,有关分支的概念,我们接下来会说。
######4.查看缓存区和工作目录的区别 git diff
当我们提交了代码后,我们想要查看版本库中的文件和工作目录中的文件有什么区别该怎么办?这时使用 git diff HEAD --
可以查看目标节点的版本库文件与工作目录文件的区别,例:git diff HEAD^ -- a.txt
查看上一个节点的a.txt与工作目录里a.txt的区别。
######5.查看Git当前的状态 git status
使用git status
可以查看当前工作区的状态:和版本库一致,本地已修改但未添加和提交,已经添加但是没有提交。
######6.撤销修改 git checkout
git checkout
是一条危险的命令,它会重写我们的工作区目录,所以使用时一定要慎重。当我们把工作区的一个文件改坏了时,此时千万不要commit,可以使用git checkout -- [filename]
来从版本库还原当前文件。
git checkout
的功能不止于此。它还可以切换分支
和生成分支
还有从目标分支还原文件
(1) 切换分支 当我们有俩个以上分支时,可以使用git checkout branchname
切换分支,有关分支(branch)的概念,接下来会介绍。
(2) 生成分支我们还可以直接从当前分支直接拉出一个新的分支git checkout -b [newbranchname]
,这时会直接生成并跳转到新的分支,而不需要我们费劲的使用两步操作git branch [branchname]
与git checkout [branchname]
。
(3) 从目标分支还原文件 如果你需要从某个分支的某个节点还原一个文件,直接使用git checkout [branchname]~n [filename]
语法中的~n为目标分支要回退的版本数。
######7.删除文件 git rm
当我们发现版本库中有我们错误提交的文件,比如重要的数据库配置文件,这时我们可以使用git rm
实现删除操作。
git rm [filename]
可以把版本库中某个文件删除。
######8.查看Git日志 git log
在实际的开发中,我们难免会犯错,所以放我们希望看到自己或者同事的提交记录时,可以用git log
查看git日志
######9.回退Git版本 git reset
如图,我们在进行了三次 commit
后,主分支的结构如下,头指针指向了修改代码这个版本,关于分支、头指针的概念我们接下来会讲到,这里简单理解为每执行一次 commit
仓库的代码更新一次,头指针指向当前更新的版本。这时,我们突然发现我们的修改的代码把我们之前重要的代码给覆盖了,这时我们需要回滚操作。
Git中有俩种回滚指令 一种是:git reset
另一种是: git revert
,这俩种回滚有什么区别呢?
(1) git reset
当我们执行了git reset
回退了一个版本的时候,我们的master分支结构会如下图所示:
可与看出git reset
操作会让我们的分支节点返回前一个提交的节点上。
git reset (--mixed/--soft/--hard) HEAD (file)
git reset (--mixed)
此方式为默认方式,当选择--mixed
参数时,工作目录里的代码不会回滚,但是缓存区index
和本地仓库里commit
会回滚。
git reset --soft
只回退本地仓库commit
,而缓存区index
与工作目录并不会回滚。
git reset --hard
会同时回滚工作目录,缓存区index
与本地代码仓库commit
,请谨慎使用,所有add
了而未commit
的源码会消失。
git reset HEAD^
把头指针回退一个版本 git reset HEAD^^
回退俩个版本,回退几个就加几个^
。要是一百个版本怎么办?使用git reset HEAD~100
git reset HEAD^ a.txt
只回退a.txt
git reset 1094adb
把Git回退到commit_id
为1094adb的版本
(2) git revert
git revert
与git reset
的区别在于git revert
会把代码回滚到前一个节点的状态,但是HEAD
头指针却向前移动。
使用git revert
后发现master分支的节点反而向前移动了,此时节点b’的状态与b完全一致。
######10.远程仓库操作 git remote
当我们在远程服务器搭建了远程仓库时,这时就需要使用git remote
来管理远程仓库或者建立本地库与远程库之间的联系了。
(1) 查看当前绑定的远程分支 git remote
你也可以带上- v
参数git remote -v
列出远程分支详细信息
(2)
git clone
git push
git config --global credential.helper store
git config user.name
git config user.email
git config --global user.name “xxx”
git config --global user.email “xxx”
step1. 创建ssh
$ ssh-keygen -t rsa -C [email protected]
成功后会在 C://Users/主机名/.ssh 文件夹下面生成俩个文件 id_rsa
(私匙)
id_rsa.pub
(公匙)
step2. 绑定公匙
https://github.com/settings/keys
step3. 测试ssh key
$ ssh -T [email protected]
如果出现 You’ve successfully authenticated, but GitHub does not provide shell access. 则表明绑定成功
step4. 创建本地仓库 建立master分支
$ git init
在目标目录创建仓库
$ echo # read me > README.MD
建立markdown文件
$ git add ./*
全选文件
$ git commit -m 'first commit'
第一次提交 建立本地master分支
step5. 设置远程仓库源 第一次push
$ git remote add origin [email protected]:yourname/profilename.git
添加github远程仓库源
$ git push --set-upstream origin master
给master分支上传到远程仓库,此后可以直接push pull不需要再绑定源
step1. 配置本地的账号邮箱
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
step2. 创建存放代码的文件夹
$ mkdir dir
$ cd dir
step3. 登陆gitlab 并找到项目代码的http拉取地址 在bash上clone
$ git clone http://gitlab.gitlab.net/gitlab.git
第一次连接会要求输入账号和密码
-step4. 查看所有远程分支并切换dev
分支
$ git branch -a
$ git checkout dev
这是因为本地与远程是根本不相干的 俩个 git 库,所以告知无法合并。
可以通过克隆远程库 或者使用
$ git pull origin master --allow-unrelated-histories
强制把两段不相干的分支进行强行合并
这是因为已经绑定了远程仓库 需要先删除
$ git remote rm origin