git
和github
不是同一个东西。Git
是一款免费、开源的分布式版本控制系统,而github
是基于git
的代码托管平台
且同时也具备版本记忆功能。git
是分布式版本管理系统。git
是由linux
的创造者linus
开发的。CVS
和SVN
的集中式版本控制方式,git
使用分布式进行版本控制。将较而言,git
分布式版本控制能够实现本地化的版本库,工做时没必要联网;git
具备强大的分支管理能力,稳定性更高。(便捷)首先打开hash.exe
输入用户名和邮箱html
//配置全局用户信息 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" //修改当前用户信息 $ git config user.name 你的目标用户名; $ git config user.email 你的目标邮箱名;
利用git
本地仓库进行版本控制能够简单的理解为:a 持有实际文件的物理工做目录,b 暂存区,c 本地仓库(git在本地默认创建的一个master分支)linux
其中a-->b
是由add
实现,而b-->c
是由commit
实现。git
git
在本地进行版本库存储git
在本地指定地点创建仓库(或者是指向克隆下来的仓库):github
cd e:/github_projects/tisikcci.github.io
初始化一个git
仓库:web
init
初始化以后,会在tisikcci.github.io
文件夹下生成一个默认隐藏的.git
文件夹vim
添加远程库:在本地的learngit仓库下运行命令:$ git remote add origin 仓库地址
安全
向这个隐藏的文件夹中添加文件:README.md
(能够是别的文件,要将这个文件放在.git同级文件夹下):bash
git add README.md
也能够一次添加多个文件
,相似于:服务器
git add README1.md README2.md README3.md
将文件存入本地仓库(当前分支),同时添加改动或者说是更新说明:(-m
后这里的‘first commit’应该是与本次提交或者更新有关系有实际意义的说明,方便之后溯源)app
git commit -m'first commit'
在上面的3,4步骤过程后可使用如下命令看到内容的变更
git status
第一次提交时:git push -u origin master
可使用如下代码查看git版本库的修改或者说是更新次数(使用q能够退出这个命令)
git log
若是以为这样获得的信息太多,可使用下面的命令,使得每次修改信息漂亮的显示在同一行
git log --pretty=oneline
也能够选定查看最近2次的版本更新信息:
git log -n 2
能够利用reset
实现版本回退:
git reset --hard head^
注意:HEAD
表示当前版本(就是一个指针),在后面加一个^
,表示(指向)上一个版本,前第N
个版本是HEAD~N
,回退之后想恢复以前最新的版本或者是某次特定的版本,能够利用以下代码查找操做代码库的关键步骤 历史记录的ID
实现:
git reflog
根据ID,好比是441736f,前进到回退前的某个版本
git reset --hard 441736f
commit
以后又对项目中的某个文件内容进行了更新,能够利用如下命令回到离commit最近的状态(就是丢弃掉没有进行add操做的更改内容,回到上次commit操做时的状态)
git checkout -- 文件名
这里本质是利用本地版本库中的相同文件替换了本地文件夹中的文件,因此看起来是回到以前commit操做时的状态了(可是若是更改已经add了,除非放弃add
操做内容,不然下次commit
又会更新本地仓库)。更进一步,撤销已经add到暂存区但没有commit到本地分支的文件
git reset head 文件名
以上过程当中可使用如下命令查看具体文件的内容
cat 文件名
删除本地版本库中的文件
首先说一下一种特殊状况:本地的文件夹中的项目相关文件被删除了,但没有更新本地的版本库,若是这时想恢复被删除的项目相关文件,能够利用如下命令:
git checkout -- 文件名
第二种状况是真的想删除本地仓库中的相关文件,利用如下代码删除本地文件夹中的文件(也能够手动删除)
rm 文件名
而后利用如下代码删除本地仓库中的文件
git rm 文件名
而且利用git commit进行保存
git commit -m"remove 文件名"
新建一个分支,能够利用
git branch 分支名 git checkout 分支名
上面的代码分别表示新建一个分支,并将head(指针)指向新建的指针,也可使用下面的方式直接
实现新建一个分支并使head指向它
git checkout -b 分支名
能够利用下面的命令分别查看本地分支,远程分支和全部分支,当前指向分支前会加*号
git branch<br>git branch -r<br>git branch -a
删除已经存在的指定本地分支,远程分支(注意要先将指针指向其余分支才能删除此分支)
git branch -d 分支名 git push origin :分支名
重命名分支
git branch -m 原分支名 新分支名
在新分支上提交内容,对以前的主分支master
并不会有影响,能够利用以下方式再切换回主分支
git checkout master
此时head
会从新指向master
,将master
替换为别的分支,能够实现切换到任意指定分支
将新创建的分支合并到主分支(首先要切换回主分支)
git merge 新分支
合并后,就能够利用上面给出的方法删除新分支
若是想保留新建的分支,并推送到远程仓库,能够利用
git push origin 新建的分支
能够给项目进度添加版本号,经过添加标签的方式实现
git tag 版本号
经过省略版本号能够直接查看已经添加的版本号
git tag
能够给之前的某次提交补加版本号,只要查找到以前commit操做对应的ID,好比:441736f
git tag 版本号 441736f
能够利用以下的方式实如今添加标签时添加说明
git tag -a 版本号 -m "版本说明"
能够经过如下命令查看指定版本内容
git show 版本号
删除不想要的标签
git tag -d 已经存在的标签(版本号)
能够将本地标签推送到远程仓库
git push 远程主机名(好比origin) 版本号
好比:
git push origin v1.0
将本地全部的版本号都推送到远程仓库
git push origin --tags
若是想删除远程仓库的版本号,须要进行两步
a. 首先要删除本地版本号(标签)
b. 再删除远程版本号
git push origin :refs/tags/版本号
利用以上步骤,基本能够实现利用git本地进行操做
,如下要实现将本地git仓库同步到远程仓库(例如github,固然也能够本身在一台PC上搭建一个服务器,做为远程仓库)
利用github充当远程仓库是一种很不错的方式,git本地仓库和github能够经过SSH加密,利用多种方式进行数据传输:HTTP(s)、SSH、Git、本地协议等,前两种比较经常使用。
bash.exe
中输入.ssh
目录里就能够建立id_rsa
和id_rsa.pub
这两个文件,一路回车github
上Github
,找到右上角的图标,打开点进里面的Settings
,再选中里面的SSH and GPG KEYS
,点击右上角的New SSH key
,而后Title
里面随便填,再把刚才id_rsa.pub
里面的内容复制到Title
下面的Key
内容框里面,最后点击Add SSH key
,这样就完成了SSH Key
的加密测试是否链接成功
ssh -T git@github.com
Github
上创建一个你想和本地仓库进行同名的仓库(名字相同)利用上面的cd...
指向本地仓库的位置,而后关联到Github
的远程仓库:
git remote add origin git@github.com:tisikcci/tisikcci.github.com.git
关联好以后,能够把本地仓库中的内容推送到Github上
的远程仓库了
在首次进行推送的时候,须要:
git pull --rebase origin master(若是初始化的仓库有文件好比README要先和本地合并) git push -u origin master
此处加 -u
是用来将本地master
和远程master
进行关联的,之后再次推送就不须要再加了,origin
是远程主机的名字,能够经过如下代码来查看
git remote
或者是
git remote -v
这个主机名字是能够人为指定的。首次推送以后,下次再向远程仓库master
分支推送项目时,只须要
git push origin master
上面提到能够人为指定远程主机的名字,在将远程仓库克隆到本地的时候,能够实现
git clone -o 新主机名 https://github.com/tisikcci/first-static-web-page.git/
若是使用默认的主机名而且克隆到本地指定的位置,能够利用
git clone https://github.com/tisikcci/first-static-web-page.git/
本地地址
最好是直接利用SSH
协议进行clone
,以下
git clone 仓库的SSH地址 本地创建的空文件夹地址 git clone git@github.com:tisikcci/test.git e:/github_projects/zz
就将远程仓库的test
克隆到了本地的zz
文件夹中。
git pull
命令git pull
命令用于从另外一个存储库或本地分支获取并集成(整合)。git pull命令的做用是:取回远程主机某个分支的更新,再与本地的指定分支合并,它的完整格式稍稍有点复杂。
使用语法
git pull [options] [<repository> [<refspec>…]]
描述
将远程存储库中的更改合并到当前分支中。在默认模式下,git pull
是git fetch
后跟git merge FETCH_HEAD
的缩写。
更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。 使用--rebase,它运行git rebase而不是git merge。
示例
$ git pull <远程主机名> <远程分支名>:<本地分支名>
好比,要取回origin主机的next分支,与本地的master分支合并,须要写成下面这样 -
$ git pull origin next:master
若是远程分支(next)要与当前分支合并,则冒号后面的部分能够省略。上面命令能够简写为:
$ git pull origin next
上面命令表示,取回origin/next
分支,再与当前分支合并。实质上,这等同于先作git fetch
,再执行git merge
。
$ git fetch origin $ git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,创建一种追踪关系(tracking)
。好比,在git clone
的时候,全部本地分支默认与远程主机的同名分支,创建追踪关系,也就是说,本地的master分支自动”追踪”origin/master
分支。
Git也容许手动创建追踪关系。
$ git branch --set-upstream master origin/next
上面命令指定master
分支追踪origin/next
分支。
若是当前分支与远程分支存在追踪关系,git pull
就能够省略远程分支名。
$ git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)
进行合并。
若是当前分支只有一个追踪分支,连远程主机名均可以省略。
$ git pull
上面命令表示,当前分支自动与惟一一个追踪分支进行合并。
若是合并须要采用rebase
模式,可使用–rebase
选项(rebase
可查看下文)。
$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
git fetch
和git pull
的区别git fetch
:至关因而从远程获取最新版本到本地,不会自动合并。
$ git fetch origin master $ git log -p master..origin/master $ git merge origin/master
以上命令的含义:
- 首先从远程的`origin`的`master`主分支下载最新的版本到`origin/master`分支上 - 而后比较本地的`master`分支和`origin/master`分支的差异 - 最后进行合并
上述过程其实能够用如下更清晰的方式来进行:
$ git fetch origin master:tmp $ git diff tmp $ git merge tmp
git pull
:至关因而从远程获取最新版本并merge
到本地
git pull origin master
上述命令其实至关于git fetch
和 git merge
在实际使用中,git fetch更安全一些,由于在merge前,咱们能够查看更新状况,而后再决定是否合并。
rebase
模式假设你如今基于远程分支"origin"
,建立一个叫"mywork"
的分支。
$ git checkout -b mywork origin
如今咱们在这个分支作一些修改,而后生成两个提交(commit)
.
$ vi file.txt $ git commit $ vi otherfile.txt $ git commit //vi命令是UNIX操做系统和类UNIX操做系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的加强版(vi Improved),与vi编辑器彻底兼容,并且实现了不少加强功能
可是与此同时,有些人也在"origin"
分支上作了一些修改而且作了提交了. 这就意味着"origin"
和"mywork"
这两个分支各自"前进"了,它们之间"分叉"了。
在这里,你能够用"pull"
命令把"origin"
分支上的修改拉下来而且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit)
:
可是,若是你想让"mywork"
分支历史看起来像没有通过任何合并同样,你也许能够用 git rebase
:
$ git checkout mywork $ git rebase origin
这些命令会把你的"mywork"
分支里的每一个提交(commit)
取消掉,而且把它们临时保存为补丁(patch)
(这些补丁放到".git/rebase"目录中),而后把"mywork"
分支更新到最新的"origin"
分支,最后把保存的这些补丁应用到"mywork"
分支上。
当'mywork'
分支更新以后,它会指向这些新建立的提交(commit)
,而那些老的提交会被丢弃。 若是运行垃圾收集命令(pruning garbage collection)
, 这些被丢弃的提交就会删除. (请查看 git gc
)
如今咱们能够看一下用合并(merge)
和rebase
所产生的历史的区别:
在rebase
的过程当中,也许会出现冲突(conflict)
. 在这种状况,Git会中止rebase
并会让你去解决 冲突;在解决完冲突后,用"git-add"
命令去更新这些内容的索引(index)
, 而后,你无需执行 git-commit
,只要执行:
$ git rebase --continue
这样git会继续应用(apply)
余下的补丁。
在任什么时候候,你能够用--abort
参数来终止rebase
的行动,而且"mywork"
分支会回到rebase
开始前的状态。
$ git rebase --abort
多人协做开发,就不能使用master
分支了,而是要每一个开发者单独拉一个分支,使用git checkout -b <branchname>
,运行git branch
能够看到本地全部的分支名称。
本身的分支,若是想同步master
分支的内容,可运行git merge master
。切换分支可以使用git checkout <branchname>
。
在本身的分支上修改了内容,能够将本身的分支提交到远程服务器
git checkout -b <branchname> //建立并切换分支 git add . git commit -m "xxx" git push origin <branchname>
最后,待代码测试没问题,再将本身分支的内容合并到master
分支,而后提交到远程服务器。
git checkout master //切换分支 git merge <branchname> //合并分支 git push origin master...
详细版
首先,咱们建立dev
分支,而后切换到dev
分支:
$ git checkout -b dev Switched to a new branch 'dev'
git checkout命令加上-b参数表示建立并切换,至关于如下两条命令:
$ git branch dev $ git checkout dev Switched to branch 'dev'
而后,用git branch命令查看当前分支:
$ git branch * dev master
git branch
命令会列出全部分支,当前分支前面会标一个*号。
而后,咱们就能够在dev
分支上正常提交,好比对readme.txt
作个修改,加上一行:
Creating a new branch is quick.
而后提交:
$ git add readme.txt $ git commit -m "branch test" [dev b17d20e] branch test 1 file changed, 1 insertion(+)
如今,dev分支的工做完成,咱们就能够切换回master分支:
$ git checkout master Switched to branch 'master'
切换回master
分支后,再查看一个readme.txt
文件,刚才添加的内容不见了!由于那个提交是在dev分支上,而master
分支此刻的提交点并无变.
如今,咱们把dev
分支的工做成果合并到master
分支上:
$ git merge dev Updating d46f35e..b17d20e Fast-forward readme.txt | 1 + 1 file changed, 1 insertion(+)
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就能够看到,和dev分支的最新提交是彻底同样的。
注意到上面的Fast-forward
信息,Git
告诉咱们,此次合并是“ 快进模式”,也就是直接把master
指向dev
的当前提交,因此合并速度很是快。
固然,也不是每次合并都能Fast-forward
,咱们后面会讲其余方式的合并。
合并完成后,就能够放心地删除dev分支了:
$ git branch -d dev Deleted branch dev (was b17d20e).
删除后,查看branch,就只剩下master分支了:
$ git branch * master
由于建立、合并和删除分支很是快,因此Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工做效果是同样的,但过程更安全。
Git鼓励大量使用分支:
查看分支:git branch
建立分支:git branch <name>
切换分支:git checkout <name>
建立+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
绑定本地分支到远程服务器分支: git branch --set-upstream-to origin/[远程分支名] [本地分支名]
推送本地更新到远程分支: git push <远程库名>(origin) [本地分支名]:[远程分支名]
克隆远程分支:git clone -b [远程分支名] [远程仓库地址]
获取远程服务器的指定分支: git pull <远程库名>(origin) <远程分支名>:<本地分支名>