git笔记

Git和SVN的对比:git

1)Git是分布式的,SVN是集中式;程序员

2)Git每一个历史版本存储完整的文件,SVN存储文件的差别;github

3)Git可离线完成大部分操做,SVN则必须与中央服务器进行网络交互;服务器

4)Git有着优雅的分支和合并功能;网络

5)Git有着更强的撤销修改和修改版本历史的能力;ssh

6)Git速度更快,效率更好;分布式

 

Git安装:工具

    CentOS6.5环境:yum install git学习

    下载源码进行编译再安装:本身查阅网络资料网站

 

which -a git 查看git的安装位置

git version 查看git的版本

 

 

建议你们先在GitHub上面注册一个帐号

 

如何学习Git的命令:git help

 

添加user.name和user.email

git config --global user.name fyuan925

git config --global user.email fyuan925@gmail.com

 

获得user.name/user.email

git config user.name

git config user.email

 

添加一个新的user.name

git config --global --add user.name kgc

 

获得属性的值

git config user.name

git config --get user.name

 

获得全局全部属性的值

git config --list --global

 

删除一个属性,而且是指定属性名进行删除

git config --global --unset user.name kgc

 

git config --list --global

 

当只有一个属性值的时候,咱们能够在删除时不指定值

git config --global --unset user.name

 

git config --list --global

 

git config --global user.name fyuan925

git config --list --global

 

 

Git命令的基本使用(版本控制工具只能跟踪文本文件的改变):

git init  建立仓库

添加一个readme.txt

git status  查看当前版本库的状态(查看暂存区的工做状态)

git add filename    使用git add命令告诉git,把该文件添加到仓库

git commit -m 'comment'  使用git commit命令告诉git,把文件提交到仓库

 

将文件提交到仓库,须要两步:

    1) add

    2) commit

 

git add 能够反复添加多个

git diff 查看修改的内容

git log  能够查看全部的提交历史记录

git log filename 仅查看指定文件名的提交历史记录

git log --pretty=oneline filename

d085ee8434392d2cf88b48592f29fbeefb0818f7  commit id(版本号) SHA-1 Hash计算出来一个16进制的值

 

版本回退:

    前提:知道当前版本是哪一个, HEAD表示当前版本(HEAD是指最后一次提交的commitid)

    回退到上一个版本: HEAD^   一个^就表是前一个版本, 若是N个前版本能够用HEAD~N

 

    回退:git reset --hard HEAD^

    回退以后你后悔了又想回到后退以前的那个版本: git reset --hard xxxxxxxxx

    xxxxxxxxx  前面能够经过 git log filename

 

    3commit   <== HEAD

    2commit

    1commit

 

    执行了git reset --hard HEAD^以后

    3commit  

    2commit  <== HEAD

    1commit

 

    git reset:版本穿梭, 可使用git log查看提交历史,以便肯定回退/穿梭到哪一个版本

 

HEAD这个指针执行当前版本(也是git版本回退快速的缘由)

 

git reflog:查看命令历史,以便肯定要回到将来/过去的哪一个版本(若是不知到到回退commitid可经过此命令查询)

 

 

什么是修改:新增一行、修改几个字符、删除一行、新增文件、删除文件

Git管理的是修改,而不是文件

 

git status :是工做区和暂存区的对比,若是检测出改变,会建议咱们add提交到暂存区或者撤销修改。

git commit:只是将暂存区提交到历史区,与工做区无关。

 

撤销修改:

    没有提交到暂存区时,其实就在工做区: git checkout -- file

    已经提交到暂存区了: 分两步:

1)git reset HEAD file  清空暂存区中的修改

2)git checkout -- file 清空工做区的修改

 

删除文件

    手误删除,如何恢复: git checkout -- file

    真删除版本库的文件:

        1) git rm file

        2) git commit -m 'xxx'

 

Git远程操做之添加远程库

生成ssh:ssh-keygen -t rsa -C 'kgc@gmail.com'

在GitHub上设置ssh的公钥

 

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuDoeVYFqwhspG7SrOMugb32+q8jwu0fRptuQuEREjeqsCVkGPVBuFJo3hEPwXhk87VAgEHGd6JQUEtL6CFkrld3GWcMuz+dlNTIQ1/tNnwDABvYo5/dXlR6WZ6sdn/3eT/KO1KnyQI0VDFg/smAtAVVr5guXAzg36hOAgzihh3ZVM0Gcg4cOzd0/rO5+hO7nK1q0W1Wk2aem5xX+FOWF+r+g+nQpIERL4I45JgL9rXYCPEfFnP+17FjLBAUSNNaoj4I49Z4EboyN/as58PXVPbEv7Xdhh7ARn7qFRdPKxkIhVTI/4ljIp4OAyfENYtD6qanhBu3P3WX/hYCiHN0Lww== 947186883@qq.com

 

与远程库创建链接

git remote add origin git@github.com:iamxuas/git_demo.git

git push -u origin master

    git push 就是把当前分支(master)推送到远程

    -u:第一次推送到master分支时,要设置了,后续就不须要再使用-u了

 

git push  origin master

 

执行get push时出现错误及解决办法:

当执行命令git push -u origin master时报以下错误

 

解决办法:git remote set-url origin https://fdd8@github.com/fdd8/kgc_git.git,即在网址中添加GitHub的用户名便可。

再执行命令git push -u origin master时,就不会报错

 

 

远程库的两种方式

1)先有本地仓库,后有远程仓库

    git remote add origin git@github.com:fangyuan925/kgc_git.git

    git push -u origin master

    第一次使用-u,后面再也不使用

 

2)先有远程仓库,再clone到本地(最多见的,通常都是先在GitHub上建立仓库,而后开发人员再clone到本地)

    git clone xxxxxx

    git push -u origin master

    第一次使用-u,后面再也不使用

 

 

 

 

Git会串成一条时间线,这条时间线就是分支, 默认就是master

HEAD并非指向提交,而是指向master

 

v1  ==>  v2  ==> v3

                 |

                 master

                  |

                  HEAD

 

 

v1  ==>  v2  ==> v3  ==> v4

                         |

                        master

                          |

                        HEAD

 

 

 

                              master

                                |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       dev

                                       |

                                       HEAD(建立分支以后,HEAD就不指向master了,而是指向分支)

 

 

                                      Master(将dev分支合并到master上)

                                       |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       dev

                                       |

                                       HEAD

 

查看分支:

git branch

* master

*表示你当前所处的branch是哪一个

 

 

 

git checkout -b dev (建立分支)

-b表示建立而且切换分支(HEAD指向dev分支)

 

切换分支: git checkout xxxx

 

 

git merge dev  把dev分支合并到当前分支,由于咱们当前分支是master,因此就是将dev合并到master(使用的是Fast-forward模式:直接将master指向v6,存在冲突是Fast-forward模式就不行了)

                              master =>master

                                        |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       dev

                                       |

                                       HEAD(建立分支以后,HEAD就不指向master了,而是指向分支)

 

 

删除分支: git branch -d dev

 

 

 

解决冲突:

feature1 :  a.txt  AND simple

master   :  a.txt  &   simple

 

                                      master

                                       |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       feature1 

                                       |

                                      HEAD

在master和分支上分别对a.txt作了不一样修改以后,合并分支出现如下错误:

git merge feature1

Auto-merging a.txt

CONFLICT (content): Merge conflict in a.txt

Automatic merge failed; fix conflicts and then commit the result.

 

cat a.txt

a.txt

 

 

在master和分支上分别对a.txt作了不一样修改以后,a.txt的内容以下:

<<<<<<< HEAD

Creating a new branch is quick & simple.

=======

Creating a new branch is quick AND simple.

>>>>>>> feature1

 

 

<<<<<<<   =======  >>>>>>>标记出不一样分支的内容

 

 

git log --graph  --pretty=oneline --abbrev-commit

 

当Git没法自动合并分支时,就必须首先解决冲突,再提交,最后再merge

可使用git log --graph命令能够看到分支合并图。

 

分支管理策略:

1)master分支: 代码是稳定的,平时不能在上面干活的,仅仅是用来发布新版本用

2)dev分支:是不稳定的,bug、feature能够建立新的分支进行开发,最后再合并到master便可

    bug-id 10000    bug-10000

 

 

 

标签操做总结:

git tag <name> 新建一个标签,默认是HEAD,也能够指定一个commit id

git tag -a <name> -m 'xxxxxx'指定标签信息

git tag 查看全部标签

 

git tag -d v0.1  删除标签

 

提交标签到GitHub:git push origin v1.0

将本地全部标签提交到远程github:git push origin --tags

 

若是tag已经推送到远程,要删除远程标签就须要麻烦一点,分2步:

1)删除本地tag:  git tag -d v0.9

2)git push origin :refs/tags/v0.9

 

 

Git控制台颜色设置

git config --global color.diff auto

git config --global color.status auto

git config --global color.branch auto

 

颜色设置关闭

git config --global color.status false

 

 

忽略某些特殊文件不提交

1)只须要在git项目的根目录下建立一个.gitignore

2) 把须要提交的文件或者目录写到.gitignore

3)若是你真正想提交的文件已经被包含在.gitignore里面了,那么就须要使用-f进行强制提交

 

 

Git配置别名:

git config --global alias.st status

git config --global alias.ci commit

git config --global alias.br branch

git config --global alias.co checkout

 

配置别名完成以后在什么地方能看到呢?

默认在当前用户的根目录下有一个.gitconfig

cat .gitconfig

[user]

    email = fyuan925@gmail.com

    name = fyuan925

[color]

    diff = auto

    status = false

    branch = auto

[alias]

    st = status

    ci = commit

    br = branch

    co = checkout

 

 

知识点总结:

分支管理

场景描述:开发一个新功能,预计一周完成,你三天开发好了70%的代码,可是还没连调,若是此时马上提交,因为代码还没写完,不完整的代码库会致使别人不能干活。若是等代码所有写完再一次提交,又存在丢失天天进度的巨大风险。

分支的诞生:本身在本身的分支上开发,和别人互不影响,开发完成后再合并到master上去便可。

 

查看分支:git branch

建立分支:git branch <name>

切换分支:git checkout <name>

建立&切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

 

解决冲突时查看分支合并图:git log --graph

Bug分支

Feature分支

 

标签管理

什么是标签(tag):是版本库的一个快照

发布一个新版本时,一般先在版本库中打一个标签,不管在未来的时候,取出某个标签的版本便可

 

建立标签:git tag <tagname>

查看全部标签:git tag

建立带有说明的标签:git tag -a <tagname> -m <desc>

查看标签的说明:git show <tagname>

删除标签:git tag -d <tagname>

 

推送一个本地标签:git push origin <tagname>

推送所有未推送的本地标签:git push origin --tags

删除一个本地标签:git tag -d <tagname>

删除一个远程标签:git push origin:refs/tags/<tagname>

 

 

多人协做

开源项目确定都是不少人参与到社区中,经过协做完成

多人协做经常使用操做

克隆远程仓库:git clone

查看远程信息:git remove (-v)

解决冲突问题

推送分支:git push origin <branch-name>

建立Pull Request

(https://www.zhihu.com/question/21682976)

 

GitHub经常使用操做介绍

能够将我的的开源项目放在GitHub中,既可让别人参与你的项目,你也能够参与到别人的开源项目中去

但愿你们能真正参与带本身感兴趣的开源项目中去,作到从开源中来,而后回馈到开源中去

GitHub经常使用操做:clone、fork、watch、star

 

GitHub经常使用操做之博客

相信不少人都有写博客的习惯,免费和收费的都有

近些年,一些程序员开始在github网站上搭建blog。他们既拥有绝对管理权,又享受github带来的便利----无论什么时候何地,只要向主机提交commit,就能发布新文章

更妙的是,这一切仍是免费的,github提供无限流量,世界各地都能访问

使用GitHub搭建博客

 

GitHub经常使用操做之组织

除了我的帐户外,GitHub还提供被称为组织(Organizations)的帐户

组织帐户和我的帐户同样都有一个用于存放所拥有项目的命名空间,可是许多其余的东西都是不一样的

组织帐户表明了一组共同拥有多个项目的人,同时也提供一些人具用于对成员进行分组管理

一般,这种帐户被用于开源群组(例如:“perl”或者“rails”),或者公司(例如:“google”或者“twitter”)

经过GitHub建立组织

 

 

Git其余功能介绍

Git颜色设置

    设置颜色:git config --global color.diff auto

              git config --global color.status auto

              git config --global color.branch auto

    颜色设置关闭:git config --global color.status false

忽略特殊文件

    1)只须要在git项目的根目录下建立一个.gitignore

    2) 把须要提交的文件或者目录写到.gitignore

    3)若是你真正想提交的文件已经被包含在.gitignore里面了,那么就须要使用-f进行强制提交

设置经常使用命名别名

    git config --global alias.st status

相关文章
相关标签/搜索