Content:
Git简介
分布式版本控制系统。官网文档
一. 安装git
Linux、Mac、Windows安装方式,安装包地址。
配置用户信息
$ git config --global user.name <"your name"> $ git config --global user.email <your email>
安装完成后只需执行一次
检查配置信息
$git config --list
二. 名词解释:
仓库(版本库)repository:是一个.git
的文件目录。该目录里面的所有文件都被git管理,包括新增、修改、删除等,还能追踪操作历史。
工作区working directory:实际的工作目录。
暂存区staging area:存放在 .git
目录下的index文件里。
指针HEAD:指向本地当前分支的指针,总是指向该分支上的最后一次提交。
快进fast-forward(ff):合并分支的时候会出现的词。由于需合并的两个分支在同一条轴上,合并的操作只是简单的将指针向前移动
远程分支:格式是<remotename>/<branch>
,是在本地仓库显示的远程分支。在克隆项目时origin是远程仓库的默认名字,master是本地创建起始分支的默认名字。egorigin/master
三. 使用策略
创建分支规则:
- 保持
master
分支为主分支,仅用于发布新版本或稳定版 - 创建
dev
分支用于日常开发。各个开发者通过在dev
创建分支进行开发。
合并分支方式:
merge
:在时间轴历史上会保留了分支路径。两个分支C4(master)和C5(iss53)没有直接的ancestor,只能把两者最近的共同祖先的C2和两个分支的快照进行三方合并,合并的结果是提交一个新的节点C6。rebase
:将提交到某一分支上的所有修改都移至另一分支上,。首先找到这两个分支(即当前分支experiment
、变基操作的目标基底分支master
)的最近共同祖先C2
,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底C3
, 最后以此将之前另存为临时文件的修改依序应用。完成后再进行一次正常的
merge
操作
多人协作工作模式:
- 首先试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
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 -- <文件> #撤销在工作区的全部修改
记得撤销
--
后面有带空格以下两种情况均会涉及到撤销:
- 在工作区修改后还没有
add
到暂存区- 已添加到暂存区后又做二次修改但还没提交,则会恢复到提交到暂存区后的状态
暂存工作区的文件状态(适用于暂不提交当前分支而需要去其他分支的情况)
$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 <分支名称>
来表示创建分支并且切换到该分支。该命令其实是执行了两条命令:
$git branch XXX
$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远程仓库。
如果建立的是公开仓库,则任何人都可以看到,所以不要上传敏感信息。
准备工作
安装
Git
,或者安装Github Desktop
在本地创建SSH钥匙。本地Git仓库和GitHub仓库之间的传输是通过SSH加密,当GitHub接受传输时,需要SSH Key确认是本人推送操作。GitHub允许多个Key,所以当有多台电脑时,就需要相应添加多个Key。
创建方法:
$ssh-keygen -t rsa -C "youremail@example.com或用户名"
- 账号是github的账号
创建后,在用户主目录里找到
.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对:id_rsa
是私钥,不能泄露出去;id_rsa.pub
是公钥,可以放心地告诉任何人。在linux中,公钥私钥是存放在
~/.ssh
。查看已存在的SSH keys
$ ls -al ~/.ssh
在Github的个人设置
SSH keys
处添加公钥。测试公钥是否有效
$ 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)请求开源者接受你的修改。
参与步骤:
- 将派生出的副本克隆到本地,创建分支
- 修改代码,提交到分支
- 将这个分支推送到 GitHub 上
- 创建一个合并请求
- 讨论,根据实际情况继续修改
- 项目的拥有者合并或关闭你的合并请求
There are 0 comments