git 及其基本操做

git与github

  1. 首先gitgithub不是同一个东西。Git是一款免费、开源的分布式版本控制系统,而github是基于git代码托管平台且同时也具备版本记忆功能。
  2. git是分布式版本管理系统。
  3. git是由linux的创造者linus开发的。
  4. 不一样于CVSSVN的集中式版本控制方式,git使用分布式进行版本控制。将较而言,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在本地进行版本库存储

  1. git在本地指定地点创建仓库(或者是指向克隆下来的仓库):github

    cd e:/github_projects/tisikcci.github.io
  2. 初始化一个git仓库:web

    init

    初始化以后,会在tisikcci.github.io文件夹下生成一个默认隐藏的.git文件夹vim

    添加远程库:在本地的learngit仓库下运行命令:$ git remote add origin 仓库地址安全

  3. 向这个隐藏的文件夹中添加文件:README.md(能够是别的文件,要将这个文件放在.git同级文件夹下):bash

    git add README.md

    也能够一次添加多个文件,相似于:服务器

    git add README1.md README2.md README3.md
  4. 将文件存入本地仓库(当前分支),同时添加改动或者说是更新说明:(-m后这里的‘first commit’应该是与本次提交或者更新有关系有实际意义的说明,方便之后溯源)app

    git commit -m'first commit'
  5. 在上面的3,4步骤过程后可使用如下命令看到内容的变更

    git status

    第一次提交时:git push -u origin master

  6. 可使用如下代码查看git版本库的修改或者说是更新次数(使用q能够退出这个命令)

    git log

    若是以为这样获得的信息太多,可使用下面的命令,使得每次修改信息漂亮的显示在同一行

    git log --pretty=oneline

    也能够选定查看最近2次的版本更新信息:

    git log -n 2
  7. 能够利用reset实现版本回退:

    git reset --hard head^

    注意:HEAD表示当前版本(就是一个指针),在后面加一个^,表示(指向)上一个版本,前第N个版本是HEAD~N,回退之后想恢复以前最新的版本或者是某次特定的版本,能够利用以下代码查找操做代码库的关键步骤 历史记录的ID实现:

    git reflog

    根据ID,好比是441736f,前进到回退前的某个版本

    git reset --hard 441736f
  8. commit以后又对项目中的某个文件内容进行了更新,能够利用如下命令回到离commit最近的状态(就是丢弃掉没有进行add操做的更改内容,回到上次commit操做时的状态

    git checkout -- 文件名 

    这里本质是利用本地版本库中的相同文件替换了本地文件夹中的文件,因此看起来是回到以前commit操做时的状态了(可是若是更改已经add了,除非放弃add操做内容,不然下次commit又会更新本地仓库)。更进一步,撤销已经add到暂存区但没有commit到本地分支的文件

    git reset head 文件名

    以上过程当中可使用如下命令查看具体文件的内容

    cat 文件名
  9. 删除本地版本库中的文件
    首先说一下一种特殊状况:本地的文件夹中的项目相关文件被删除了,但没有更新本地的版本库,若是这时想恢复被删除的项目相关文件,能够利用如下命令:

    git checkout -- 文件名

    第二种状况是真的想删除本地仓库中的相关文件,利用如下代码删除本地文件夹中的文件(也能够手动删除)

    rm 文件名

    而后利用如下代码删除本地仓库中的文件

    git  rm 文件名

    而且利用git commit进行保存

    git commit -m"remove 文件名"
  10. 新建一个分支,能够利用

    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 原分支名 新分支名
  11. 在新分支上提交内容,对以前的主分支master并不会有影响,能够利用以下方式再切换回主分支

    git checkout master

    此时head会从新指向master,将master替换为别的分支,能够实现切换到任意指定分支

  12. 将新创建的分支合并到主分支(首先要切换回主分支)

    git merge 新分支

    合并后,就能够利用上面给出的方法删除新分支

  13. 若是想保留新建的分支,并推送到远程仓库,能够利用

    git push origin 新建的分支
  14. 能够给项目进度添加版本号,经过添加标签的方式实现

    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、本地协议等,前两种比较经常使用。


本地git仓库同步到远程仓库

  1. 要想将本地仓库同步到Github上,首先须要创建本地和Github上使用的SSH私钥和公钥,在git的bash.exe中输入
    ssh-keygen -t rsa -C “tisikcci@foxmail.com
    这样在用户下的.ssh目录里就能够建立id_rsaid_rsa.pub这两个文件,一路回车20170414170253668
  2. 在电脑上生成公钥和私钥,将公钥上传到github
    登陆Github,找到右上角的图标,打开点进里面的Settings,再选中里面的SSH and GPG KEYS,点击右上角的New SSH key,而后Title里面随便填,再把刚才id_rsa.pub里面的内容复制到Title下面的Key内容框里面,最后点击Add SSH key,这样就完成了SSH Key的加密
  3. 测试是否链接成功

    ssh -T git@github.com
  4. Github上创建一个你想和本地仓库进行同名的仓库(名字相同)
  5. 利用上面的cd...指向本地仓库的位置,而后关联到Github的远程仓库:

    git remote add origin git@github.com:tisikcci/tisikcci.github.com.git
  6. 关联好以后,能够把本地仓库中的内容推送到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
  7. 上面提到能够人为指定远程主机的名字,在将远程仓库克隆到本地的时候,能够实现

    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仓库

git pull命令

git pull命令用于从另外一个存储库或本地分支获取并集成(整合)。git pull命令的做用是:取回远程主机某个分支的更新,再与本地的指定分支合并,它的完整格式稍稍有点复杂

使用语法

git pull [options] [<repository> [<refspec>…]]

描述

将远程存储库中的更改合并到当前分支中。在默认模式下,git pullgit 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 fetchgit pull的区别

  1. 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
  1. git pull:至关因而从远程获取最新版本并merge到本地

    git pull origin master

上述命令其实至关于git fetchgit 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) <远程分支名>:<本地分支名>


参考连接:

相关文章
相关标签/搜索