TypechoJoeTheme

顿搜

统计

Git与GitHub详细介绍

2016-08-31
/
2 评论
/
913 阅读
/
正在检测是否收录...
08/31

版本控制简介

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

1、本地版本控制

最流行的一种叫做 rcs,它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。

2、集中式版本控制

为了让在不同系统上的开发者协同工作,于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

缺点:中央服务器的单点故障

3、分布式版本控制

分布式版本控制系统( Distributed Version Control System,简称 DVCS ),像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。

Git 基础介绍

1、记录快照

大多数其他系统只关心文件内容的具体差异。

而Git 只关心文件数据的整体是否发生变化.

2、保持完整性

Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成。保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。

3、三个区域

Git 管理项目时,文件流转有三个工作区域:Git 的工作目录(工作区),暂存区域,以及本地仓库。

①、工作区是日常编辑代码的地方,它维护着一个树形结构;
②、暂存区,相当于介于工作区与本地仓库的一个暂存的空间, 维护的是一个虚拟的树形结构;
③、本地仓库(也称历史仓库),是commit指向的一个树形结构。

4、五种状态

对于任何一个文件,在 Git 内都有五种状态:未跟踪(untracked),未修改(unmodified),已修改(modified),已暂存(staged),已提交(committed)。

①、未跟踪表示文件还没有添加到Git的管理中,比如新创建的文件;
②、未修改表示相对暂存区的内容,没有进行过任何修改;
③、已修改表示相对于暂存区的文件,在工作区做了新的改动,但还没有add到暂存区;
④、已暂存表示把已修改的文件放入了暂存区,也就是放到了下次提交时要保存的清单中;
⑤、已提交表示该文件已经被安全地保存在本地数据库中了。

5、 Git的优势

1、Git是分布式的SCM, SVN是集中式的
2、Git每个历史版本存储完整的文件,SVN存储文件差异
3、Git可离线完成大部分操作,SVN则相反
4、Git有着更优雅的分支和合并实现
5、Git有更强的撤销修改额修改历史的能力
6、Git速度更快,效率更高

Git 安装与配置

1、下载

Git下载地址:https://git-scm.com/

2、版本选择

which -a git
git --version

如果当前版本不是我们安装的版本,可以编辑.bash_profile文件(这是Mac用户的配置文件,对于Linux,可以编辑.basrc文件),将git目录加入到环境变量

export PATH= /usr/bin/git/bin:$PATH

然后退出,执行以下命令使其生效

source .bash_profile

3、Git的自动补全

下载Git源码:https://github.com/git/git

下载完后,进入到/contrib/completion目录,将git-completion.bashgit-prompt.sh拷贝到用户目录下(即~目录)。

编辑.bash_profile文件,Linux用户可编辑.bashrc文件,增加以下内容

. ~/git-completion.bash
. ~/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1
export PS1='\u:\W$(__git_ps1 " (%s)")\$'

然后退出,执行以下命令使其生效

source .bash_profile

4、配置用户名

git config --global user.name dunso #配置用户名,将dunso改为自己的用户名
git config --global user.email admin@dun.so #配置邮箱,将admin@dun.so改为自己的邮箱

每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录。

5、用户的增删改查

git config --global --add user.name dunso_1 #再增加一个用户,user.name一键多值
git config user.name #查看当前的用户
git config --list --global #查看所有用户
git config --global  --unset user.name dunso_1 #删除用户
git config --global user.name dunso_2 #修改当前用户

6、别名配置

方式一、使用命令配置

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.lol "log --oneline"

方法二、直接修改配置文件,在~目录下,编辑.gitconfig,增加以下内容

[color]
    ui = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%an, %cr)%Creset'
    co = checkout
    ci = commit
    di = diff
    st = status
    br = branch

Git 本地操作

1、创建本地仓库

注:以下命令二选一

git init myrepo
git init --bare myrepo  #创建裸仓库,即不带工作区

2、将已有工作环境纳入git管理

git init  #不用带仓库名

3、克隆仓库

git clone myrepo/ myrepo_2 #克隆本地仓库
git clone https://github.com/dunso/algorithm  #克隆远程仓库

4、将修改的文件添加到暂存区

git add dunso.txt duso_1.txt #将dunso.txt和dunso_1.txt添加到暂存区
git add . #将所有修改的文件添加到暂存区
git add -A #同上,将所有修改的文件添加到暂存区

5、删除本地和暂存区的文件

git rm dunso_1.txt #将dunso_1.txt删除(包括使用git add添加到暂存区的也一并删除了)
git rm --cached dunso_1.txt #只删除暂存区的文件,不删除本地文件

6、恢复删除的文件

git reset HEAD dunso_1.txt
git checkout dunso_1.txt

7、重命名文件或者移动文件

git mv dunso_1.txt dunso_2.txt  #将本地dunso_1.txt重命名为dunso_2.txt,并且将暂存区的dunso_1.txt删除,同时将新的dunso_2.txt添加到暂存区

8、配置忽略文件

编辑.gitignore

*.txt #忽略所有txt文件
!*.java #所有的java文件都不能忽略
**/res #忽略res目录及res目录下的所有文件
res/ #忽略res目录下的文件,但是不忽略res文件夹

9、创建新分支

git branch dunso #创建一个dunso分支

10、切换分支

git checkout dunso #切换到dunso分支

11、给提交打上标签

git log --oneline --decorate --graph --all #查看所有提交
git tag "v1.0.1" 6a5ebb8 #最后参数是提交的7位hash值,如果不加这个参数,默认是当前HEAD指向的提交
git tag -a "V1_VERSION" 6a5ebb8 #
git tag -a v0 -m "tag for v0" #创建带注解的tag
git tag #查看当前的tag
git push --tags #将tags推送到远程仓库
git show v1.0.1 #查看tag的内容
git checkout  v1.0.1 #回到某一个tag对应的版本
git checkout -b fix_v1.0.1 #给还原的版本重新创建分支进行工作,这样不影响当前分支

12、将修改暂存起来

git stash save -a "stash_1" #此时将本地修改的文件放到stash中,并且恢复本地和暂存区的文件,使之和修改前一样(相当于没做任何修改)
git stash list #查看stash中的引用
git stash pop stash{0} #将stash中的内容还原到本地,同时还原暂存区之前的内容,并删除stash历史,不带最后的参数则默认还原栈顶记录
git stash pop --index stash{0} #将stash中的内容还原到本地,同时还原暂存区之前的内容,并将还原的stash内容添加到暂存区,同时删除stash历史
git stash save -a "stash_1" #如果不想删除stash历史,可以先将之前的stash保存回去
git stash apply  --index stash{0} #此时就保留了stash历史
git stash drop stash{0}  #删除stash历史,如果不加最后的参数,则默认删除stash栈顶的历史
git stash clear # 一次删除所有的stash历史

13、将其他分支文件合并到当前分支

合并过程分两种情况

①、fast-farword merge:要合并的分支是当前分支所衍生出来的,并且衍生后当前分支没有任何提交,此时直接将当前分支引用指向要合并的分支 。
②、none-fast-farword merge:要合并的分支是当前分支所衍生出来的,并且衍生后当前分支有提交,因为他们有共同的父节点,此时会重新生成一个新的commit来承载两个分支的内容

git merge dunso #如果当前分支是master的话,就是将dunso分支的文件合并到master分支上
git merge  --abort #放弃本次合并

14、查看提交信息

git show 显示的是git对象,可以接受commit、tag、tree、blob对象

git show de82fa8 # 最后一个参数是提交的7位hash值
git show master #查看master上最新的一次提交
git show HEAD #查看当前分支上最新的一次提交
git show master^ #查看master当前指向的commit的第一父提交
git show master~ #查看master当前指向的commit的第一父提交
git show master^2 #查看master当前指向的commit的第二父提交

15、查看历史信息

git log #查看完整的历史信息
git log -p #查看每个commit之间的差异信息
git log stat # 查看每一个commit之间差异的统计信息
git diff # 输出工作区与暂存区之间的差异
git diff --cached #查看暂存区与当前历史的差异
git diff HEAD~2  #比较当前工作区与其它历史提交的的差异
git diff HEAD~2  --dunso.txt #指定当前工作区与其它历史提交中指定文件(dunso.txt)的差异
git diff --cached HEAD~2 #比较暂存区与其他历史之间的差异
git diff HEAD HEAD~2 #比较当前历史与前面两个历史版本
git diff HEAD HEAD~2 -- dunso.txt #查看指定文件在两个版本之间的差异
git diff --color-words #只输入单词差异,而不是输出整行的差异
git diff --words-diff #标注最新修改的单词

16、撤销修改

git checkout -- dunso.txt #撤销工作区中dunso.txt的修改,实际是用暂存区的内容来覆盖工作区对的内容
git checkout v2 --dunso.txt #从某次提交历史(v2是提交记录的引用)还原工作区和暂存区(此时工作区和暂存区都被还原,内容一样)
git reset  -- dunso.txt #撤销暂存区的修改(使用git add后可以撤销本次add)
git reset v2 -- dunso.txt #从某次提交历史(v2是提交记录的引用)还原暂存区,不还原工作区
git reset -- hard HEAD{5} #使用指定的某一个提交还原暂存区和工作区
git reset -- mixed #只还原暂存区,把HEAD和分支名的引用指向了这个commit
git reset -- soft #什么都不还原,吧HEAD和分支名的引用指向了这个commit

17、删除未跟踪的文件

git clean -n #查看将要移除的文件
git clean -f #强制删除上面显示的文件

18、其他命令

git revert HEAD #删除历史提交的内容,产生一个新的提交覆盖历史提交
git commit --amend #用来产生新的提交,来替换当前所指向的提交
git reflog #维护了HEAD引用的历史信息,配合git reset来使用
git reflog #输出近10条的HEAD引用

Git 远程协作

1、获取远程文件

git fetch #从远程仓库获取更新(不与本地文件合并)
git merge origin/master #将本地文件与远程master合并
git pull #从远程仓库获取更新,并合并本地文件(是fetch和merge的合并)
git pull origin master #只获取某一个分支

2、将本地修改推送到远程

git push #将提交记录推送到远程仓库
git push origin master#只推送master

3、删除本地分支和远程分支

git branch -d dunso #删除本地的dunso分支
git push -- delete origin dunso #删除远程分支
git push origin :dunso #用空的分支替换远程分支(相当于删除远程分支)

4、远程仓库别名

git remote #查看远程仓库的别名
git remote add upstream https://github.com/dunso/algorithm.git #给远程仓库的路径取个别名(upstream)
git remote -v #查看所有的别名与远程仓库路径的对应关系
git fetch upstream #获取upstream对应路劲master上的最新代码
git merge upstream/master 合并upstream的master分支代码(本地合并)
git remote rename upstream dunso #将upstream别名改为dunso
git remote rm dunso #删除dunso别名

5、远程操作中的配置

远程跟踪分支 : origin/master(用户只可读)
跟踪分支:master

git config --list --local #查看本地仓库的配置
git push origin +master # 强制把当前的master分支推送到远程仓库中
git remote set-branches --add origin dunso/* #增加一个dunso的命名空间
git push origin master :dunso/master #这样远程仓库中多了一个dunso/master
git branch --set-upstream-to=origin/v0 v0 #设置远程跟踪分支与本地分支的对应关系
git branch --track v1 origin/v1 #设置远程跟踪分支与本地分支的对应关系
git push -u origin v2 # 推送时设置远程跟踪分支与本地分支的对应关系,只需要第一次设置
git config branch.v4.remote v4 , git config branch.v4.merge refs/heads/master #设置远程跟踪分支与本地分支的对应关系

Git 分支介绍

有人把 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来。理解分支的概念并熟练运用后,你才会意识到为什么 Git 是一个如此强大而独特的工具,并从此真正改变你的开发方式。

1、什么是分支

在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。

未完待续.......

朗读
赞 · 0
版权属于:

顿搜

本文链接:

https://dun.so/archives/2304/(转载时请注明本文出处及文章链接)