顿搜
Git与GitHub详细介绍
版本控制简介
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
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_profile3、Git的自动补全
下载Git源码:https://github.com/git/git
下载完后,进入到/contrib/completion目录,将git-completion.bash和git-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_profile4、配置用户名
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 = branchGit 本地操作
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.txt7、重命名文件或者移动文件
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和分支名的引用指向了这个commit17、删除未跟踪的文件
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#只推送master3、删除本地分支和远程分支
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)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。
未完待续.......
