Content:


Git简介

分布式版本控制系统。官网文档

一. 安装git

  1. Linux、Mac、Windows安装方式,安装包地址

  2. 配置用户信息

    $ git config --global user.name <"your name">
    $ git config --global user.email <your email>
    

    安装完成后只需执行一次

  3. 检查配置信息

    $git config --list
    

二. 名词解释:

仓库(版本库)repository:是一个.git的文件目录。该目录里面的所有文件都被git管理,包括新增、修改、删除等,还能追踪操作历史。

工作区working directory:实际的工作目录。

暂存区staging area:存放在 .git 目录下的index文件里。

指针HEAD:指向本地当前分支的指针,总是指向该分支上的最后一次提交。

快进fast-forward(ff):合并分支的时候会出现的词。由于需合并的两个分支在同一条轴上,合并的操作只是简单的将指针向前移动

远程分支:格式是<remotename>/<branch> ,是在本地仓库显示的远程分支。在克隆项目时origin是远程仓库的默认名字,master是本地创建起始分支的默认名字。egorigin/master

1578421416316

三. 使用策略

创建分支规则:

  1. 保持master分支为主分支,仅用于发布新版本或稳定版
  2. 创建dev分支用于日常开发。各个开发者通过在dev创建分支进行开发。

1578481495756

合并分支方式:

  1. merge:在时间轴历史上会保留了分支路径。两个分支C4(master)和C5(iss53)没有直接的ancestor,只能把两者最近的共同祖先的C2和两个分支的快照进行三方合并,合并的结果是提交一个新的节点C6。

    1578572555495

  2. rebase:将提交到某一分支上的所有修改都移至另一分支上,。首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。

    1578584359109

    完成后再进行一次正常的merge操作

    1578584397560

多人协作工作模式:

  1. 首先试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>进行推送

四. 常用命令

本地:

创建本地仓库

$cd <目标目录>
$git init       #初始化该目录变成git本地仓库。会出现一个隐藏目录.git

目标目录出现.git 的目录代表创建好,git开始可以管理跟踪该目录所有的文件(但git无法跟踪二进制文件内容的具体变化)。默认情况下自动创建master分支。


查看提交日志和查看历史操作命令

$git log            #查看提交日志
$git reflog         #查看操作命令

从近到远显示每次commit的提交说明

每次commit后的版本号是类似a8f0096e3331416f991fd96a744a68c7e112163b的值


工作区:

查看仓库当前状态

$git status


查看文件修改前后

$git diff <文件>


撤销工作区的文件修改

$git checkout -- <文件>           #撤销在工作区的全部修改

记得撤销--后面有带空格

以下两种情况均会涉及到撤销:

  1. 在工作区修改后还没有add到暂存区
  2. 已添加到暂存区后又做二次修改但还没提交,则会恢复到提交到暂存区后的状态


暂存工作区的文件状态(适用于暂不提交当前分支而需要去其他分支的情况)

$git stash

只保存被tracked过的文件,即新建的文件未曾add过的不会被保存(建议操作之前先通过git status查看)

stash过后的工作区是干净的


查看暂存的工作区

$git stash list


恢复文件至工作区

#有两种方法
#1
$git stash apply <stash@{0}>        #具体恢复哪个看list的清单
#2
$git stash pop

==记得要回到原来的分支,不然会在当前分支恢复!==

区别:

apply的方法stash的list内容不会删除,需要通过$git stash drop删除

pop的会在恢复的时候会把该


暂存区:

添加文件到暂存区

$git add <文件>                       #把文件修改添加到暂存区

所有操作均可通过查看git status来获取状态


提交文件到仓库

$git commit -m <"提交的说明">            #把暂存区的所有内容提交到当前分支

所有操作均可通过查看git status来获取状态

如果加-a参数就不需要执行add命令,代表将他们添加到暂存区并提交


撤销暂存区的文件修改

$git reset HEAD <文件>

只是撤销了暂存区的修改,但工作区的修改还存在。


回退版本

$git reset --hard HEAD~<数字>         #回退到上N个版本

可使用^代替,多少个^代表回退几步(不过Windows的cmd^需要转义,可写成$git reset --hard HEAD"^")。

回退后原来最新的版本将会删除。如果想恢复,可通过找到该版本的版本号使其恢复。


恢复版本

$git reset --hard <被删除的版本号前若干位>         #eg:$ git reset --hard 1094a


删除文件

$git rm <文件>

该命令是包含了删除工作区的文件,并已提交至暂存区。

  • 如果是确认删除,commit后就彻底删除。
  • 如果是误删,则需要先撤销暂存区操作,然后再撤销工作区的文件修改。

一般删除工作区的文件直接用rm <文件>


分支

创建分支

$git branch <分支名称>

可以用git checkout -b <分支名称>来表示创建分支并且切换到该分支。该命令其实是执行了两条命令:

  1. $git branch XXX
  2. $git checkout XXX

该分支就是创建当时的工作目录快照


切换分支

$git switch <分支名称>
or
$git checkout <分支名称>

只有新版的git才提供switch命令


查看分支

$git branch

当前的分支前面会标*


删除分支

$git branch -d <分支名称>


分支合并

$git checkout master        #切换到想要进行合并的分支,这里是切换当前分支为master
$git merge <分支名称>       #将分支合并到master

当该两个分支合并前有同一个文件被修改过,则分支合并会报冲突,需要手动解决该文件冲突后再提交。Git会用<<<<<<<=======>>>>>>>标记出不同分支的内容。


查看分支合并图

$git log --graph


部分已提交的内容合并到当前分支

$git checkout <切换到想要被复制的分支>
$git cherry-pick <在已修复的分支上该修复操作的commit id>


远程仓库

查看远程仓库

$git remote

-v会展示url


添加一个远程仓库

$git remote add <remotename> <url>

在本地仓库路径执行,建立本地库和远程库的连接。

remotename可以自定义,一般远程库就叫origin


推送分支至远程库

$git push <-u> <remotename> <本地分支名称>                #远程库该分支会以本地分支名称命名

第一次推送要加-u参数,是把本地的master分支和远程的master分支合起来。

如果推送失败,有可能就是远程库的比本地库的更新,要先pull到本地合并后再推送

推送上GitHub是免费的,但是公开所有人可见(可收费改为私人可见)。


拉取远程库分支至本地

$git pull           #拉取远程库的文件至本地,并与本地分支进行合并。
or
$git fetch <remotename>         #只拉取到本地仓库,但在本地仓库还不可见
$git merge <remotename>/<branch>        #合并本地的远程分支至本地分支

如提示no tracking information,则说明本地分支和远程分支的链接关系没有指定,则需git branch --set-upstream-to <branch-name> origin/<branch-name>进行关联。

如提示fatal: refusing to merge unrelated histories,则说明本地分支和远程分支的文件补一次而且不相关,则需git pull --allow-unrelated-histories

从远程库fetch拉取数据时,并不会修改本地工作目录的内容,需要自行合并。


从远程库克隆项目到本地库

$cd 目的路径
$git clone <项目地址>

要获取需克隆的项目地址(eg:https://github.com/miguelgrinberg/flasky.git)

支持多协议。默认的git://使用SSH,也可以使用https协议。

假如该项目在远程库有多个分支,==拉取到本地默认只能看到本地的master分支==,如果要在其他分支进行操作,需要创建远程库的该分支到本地git checkout -b <本地分支名称> <remotename>/<远程库分支名称>,eggit checkout -b dev origin/dev


删除远程库分支

$git push <remotename> --delete <branch>

Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了还是可以恢复的。


标签

创建标签

$git tag <标签名> (commit id)          #当需要绑定特定commit时需加上commit id

默认标签是打在当前分支的最新提交的commit上。

git tag -a <tagname> -m "blablabla..."可以指定标签信息


查看标签

$git tag
or
$git show <tagname>


推送标签

$git push origin <tagname>          #推送一个
or
$git push origin --tags             #推送所有不在远程库的标签

默认情况下,git push 推送分支时并不会传送标签到远程仓库


删除标签

$git tag -d <tagname>           #删除本地标签
$git push <remote> -d <tagname>     #删除远程库标签

删除本地标签并不会修改远程库的标签,所以如删除标签需执行两次。

==从远程库拉取项目会把标签也拉下来==

五. 忽略文件

在当前工作目录中添加一个叫.gitignore的文件,告诉Git它和它的子目录不要追踪哪些文件,要忽略掉。

定义规则:

# 以'#' 开始的行,被视为注释.
# 忽略掉所有文件名是 foo.txt 的文件.
foo.txt
# 忽略所有生成的 html 文件,
*.html
# foo.html是手工维护的,所以例外.
!foo.html
#  忽略所有.o 和 .a文件.
*.[oa]
  • 当更新了.gitignore,想重置该文件可执行git rm --cached .gitignore

六.维护Git

git靠压缩历史信息来节约磁盘和内存空间,所以Git 会不定时地自动运行一个叫做 “auto gc” 的命令。但这个命令通常不会产生效果,一般需要 7000 个以上的松散对象或超过 50 个的包文件才能让 Git 启动一次真正的 gc 命令,所以有需要的时候建议手动执行。“gc” 代表垃圾回收,这个命令会做以下事情:收集所有松散对象并将它们放置到包文件中,将多个包文件合并为一个大的包文件,移除与任何提交都不相关的陈旧对象。

  • 压缩操作比较耗时,建议选择空闲时候。


GitHub

是一个免费托管开源代码的Git远程仓库

如果建立的是公开仓库,则任何人都可以看到,所以不要上传敏感信息。

准备工作

  1. 安装Git,或者安装Github Desktop

  2. 在本地创建SSH钥匙。本地Git仓库和GitHub仓库之间的传输是通过SSH加密,当GitHub接受传输时,需要SSH Key确认是本人推送操作。GitHub允许多个Key,所以当有多台电脑时,就需要相应添加多个Key。

    创建方法:

    $ssh-keygen -t rsa -C "youremail@example.com或用户名"
    
    • 账号是github的账号

    创建后,在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对:id_rsa是私钥,不能泄露出去id_rsa.pub是公钥,可以放心地告诉任何人。

    • 在linux中,公钥私钥是存放在~/.ssh

      查看已存在的SSH keys

      $ ls -al ~/.ssh
      
  3. 在Github的个人设置SSH keys处添加公钥。

  4. 测试公钥是否有效

    $ ssh -T git@github.com
    
    > The authenticity of host 'github.com (IP ADDRESS)' can't be established.
    > RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
    > Are you sure you want to continue connecting (yes/no)?
    

    当点击yes后如果出现以下信息时则为匹配成功

    > Hi username! You've successfully authenticated, but GitHub does not
    > provide shell access.
    

参与开源项目

Github有很多开源项目,如果想参与,就需要对这个项目进行“派生”。 派生的意思是指,GitHub 将在你的空间中创建一个完全属于你的项目副本,且你对其具有推送权限。所以:

  • 一定要从自己的账号下克隆项目
  • 可以在GitHub上发起一个pull request(PR)请求开源者接受你的修改。

参与步骤:

  1. 将派生出的副本克隆到本地,创建分支
  2. 修改代码,提交到分支
  3. 将这个分支推送到 GitHub 上
  4. 创建一个合并请求
  5. 讨论,根据实际情况继续修改
  6. 项目的拥有者合并或关闭你的合并请求

There are 0 comments