# Git
**Repository Path**: ColaHome/Git
## Basic Information
- **Project Name**: Git
- **Description**: git学习
- **Primary Language**: PHP
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2018-07-26
- **Last Updated**: 2020-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# LearnGit
#### 文档介绍
git教程
#### 基础概念
>
**Remote:**远程主仓库
>
**Repository:**本地仓库
>
**Index:**Git追踪树,暂存区
>
**workspace:**本地工作区(即你编辑器的代码)

#### 安装教程
1.**git install**
> https://git-scm.com/downloads
2.**git config**
> $ git config --global user.name "Your Name"
> $ git config --global user.email "email@example.com"
3.详细git教程
> https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d599b3aed534aaab22a0db6c4e07fd0000
#### 基础操作
1.**git init**
mkdir learngit//创建learngit文件夹(repository,仓库)
cd learngit
pwd // ../learngit
git init//创建版本库并初始化
2.**git add **
> 将文件加到仓库中
3.**git commit -m \**
> 将文件提交到仓库中,并添加修改记录
4.**git status**
> 实时掌握工作区状态,
5.**git diff**
> 使用前可用git diff 查看版本差异(查看修改内容)
6.**git log**
> 查看由最近到最远的提交日志;(查看历史)
>
> 加上--pretty=oneline可缩减输出信息。
####版本回退
在git中,用**HEAD表示当前版本即最新提交的版本**,上个版本为HEAD^,上上个版本为HEAD^^,当然往上100个版本为HEAD~100.
1.**git reset --hard HEAD^**
> 将当前版本A回退到上一个版本B
2.**git reset --hard \<当前版本号A 的commit id 前几位>**
> 若在1中退回上个版本B后想追回当前版本A,指定A版本的commit id 的前几位就可以追回。
>
> PS:当前git未关闭情况下可使用此方法追回
3.**若电脑关闭,重新打开时**无法查看git log
> 可采用**git reflog** 记录每一次命令(可返回未来版本),即可查看命令历史,以便要回到未来的版本

####工作区和暂存区
lgit文件夹就是一个工作区(Working Directory)
.git(隐藏目录即版本库:Repository)
> git的版本库存了很多东西,其中最重要的就是stage(或者index)的暂存区,还要git为我们自动创建的第一个分支**master**,以及指向**master**的一个指针**HEAD**;

>**前文讲到的git add指的是将文件添加到暂存区(index/stage)中,
然后通过git commit提交更改,实际上是将暂存区中的所有内容提交到当前分支(此处为master).**
> 由于第一次创建git版本库时,git自动为我们创建了唯一一个分支master,所以现在git commit就是往master分支上提交更改。
#### 管理修改
git的优点:
> git跟踪并管理的是修改,而非文件。
>
即每次修改后,需要先git add(添加到暂存区),再git commit才能提交到分支中,且可以多次 add 一次性提交多个修改。(可用git diff查看版本之间的不同(未git commit前使用))

####撤回修改
当文件修改后,需要撤回修改时,可用```git checkout -- ```
> git checkout 可将文件恢复至上一个版本的状态:
> 1、自修改后未add到暂存区,则撤销修改至和版本库一模一样的状态。
> 2、修改后add 到暂存区后,又做修改,则撤销至和暂存区一模一样的状态。
> 总之git checkout -- \可以让文件回到最近一次git commit 或git add的状态。(**注:-- 必须有,否则将变为切换至另一分支的命令**)

当修改后的文件并**add到暂存区时,**可用git reset HEAD \将暂存区的修改撤销掉(unstage),重新放回工作区。
>**1.git reset HEAD \**
将在暂存区的修改撤销至工作区
>2**.git checkout -- \**
再通过git checkout 将工作区的修改撤销至前一个版本。
> git reset
>
> 既可以退回版本,又可以将暂存区的修改退回到工作区。当使用HEAD时,表示最新版本。
####删除文件
在git中,删除也是一个修改操作。
删除了文件test.txt:
**删除**
> 从版本库中删除,即git rm -- \ ,若提交到分支中,需要git commit一下,则文件就从版本库中删除了。
**恢复**
> 该情形是误删除了某文件,但在版本库中仍存在,所以可以使用上节git checkout -- \ 将误删除文件恢复到最新版本。
----------
**注:命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。**
----------
####远程仓库
**1、在本地也可以创建多个仓库(在不同目录下即可)**
**2、在GitHub上创建自己的仓库**
>
(1)创建自己的GitHub账号
>
(2)创建SSH key
> 在命令行下执行:
ssh-keygen -t rsa -C "youremail@example.com"
会产生“id_rsa(私钥)和id_rsa.pub(公钥)”两个文件密钥对。
>
(3)登陆GitHub,打开“AccountSetting”->“Add SSH Key”
> 填写任意title,并在key文本框中粘贴id_rsa.pub文件的内容。
>
PS:GitHub中的仓库是public的,所以注意操作。
**3、添加远程库**
> (1)首先在GitHub上Create a new repo,如起名为learngit,完成这步则在GitHub上创建了一个名为learngit的空仓库。
>
> (2)在本地仓库下运行命令:(关联远程库)
>
> git remote add origin git@github.com:***/learngit.git
> 注:***为你GitHub的账户名。(远程库的名字为origin)
> (3)将本地库内容推送(push)到远程库中
>
> git push -u origin master //第一次推送加上-u
>
推送成功 :
>

(4)之后再提交只需
>
git push origin master//即可
PS:
>
现在你已经拥有自己的分布式版本库。
第一次和github进行ssh连接时会有一个warning,yes回车即可。
PS:
> 若出现refusing to merge unrelated histories
>
Solve:
`git pull --allow-unrelated-histories`
PS:
> 重命名远程仓库
> `git remote rename pb paul //修改远程仓库pb 为paul`
>
> 删除远程仓库
> `git remote rm paul`
4、克隆(clone)
> (1)在GitHub上创建一个测试库,并获取地址(或者已经有了远程库地址),
> 如git@github.com:Abel-Maker/gitskills.git
> (2)克隆:
>
> git clone git@github.com:Abel-Maker/gitskills.git
**success:**

>
####分支管理
**1、创建并合并分支**
创建分支dev并切换到dev
> git branch dev //创建dev
> git checkout dev//切换到dev
>
> git checkout -b dev//二合一命令:创建并切换到分支dev
查看当前所有分支,且当前分支前面会标一个*号
> git branch
**在dev分支上修改master分支下的文件并add和commit(即在master分支下的文件基础上修改)**
切换到master分支
> git checkout master
合并dev分支到master 即覆盖master分支上的文件。
> git merge dev //合并前请确认dev 是在**master的基础上**修改的
删除分支dev:
> git branch -d dev
**2、解决冲突**
分支dev与master分支上的同一文件,存在不同的修改,且都已经提交,故存在冲突。
所以我们需要解决冲突。
(1)找到冲突
> git status
>

>
>发现test.php文件在两个分支中均存在修改。故进行第二步:
(2)查看文件
> cat test.php
>
> 
>
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存,并再次git add 和git commit
(3)查看合并情况:
> git log --graph //查看所有合并情况
>
>
>
> git log --graph --pretty=oneline --abbrev-commit//查看当前合并情况
> 
>
All in ALL:当git无法自动合并时,就必须解决冲突,解决冲突就是手动编辑有冲突的文件,并再提交,则合并成功。
**3、分支管理策略**
分支适合团队分工合作时进行使用,每个人都以master为基础如1.0,每次新的功能开发再进行迭代,进行分支合并,
PS:分支合并的基础是在master的基础(如文件的增加、文件内容的增加)之上合并,
只能是master没有的地方修改,否则存在冲突。故这里要求master的稳定性!否则将产生冲突。
合并时不推荐采用fast forword,推荐如下:
```git merge --no-ff -m ```
**4、Bug分支**
在开发的过程中,经常会出现bug,故可以创建一个bug分支,进行修复bug,修复后可以合并分支,然后删除bug分支。
(1)新建bug分支bug-101:
> git checkout -b bug-101
(2)修复bug后提交:
> git add
>
> git commit -m "fix bug-101"
(3)切换到master分支:
> git checkout master
(4)合并分支bug分支
> git merge --no-ff -m "merge bug fix bug-101" bug-101
(5)删除bug分支
> git branch rm bug-101
当项目还未完成时,需要修复当前bug,而且项目尚未提交(add),则可以将工作现场**储藏**起来。
> git stash
查看工作现场:
> git stash list
恢复工作现场:
> (1)git stash apply:
恢复后但stash的内容不删除,需要手动删除(git stash drop)
> (2)git stash pop:
恢复工作区的同时删除stash内容
PS:多次使用stash,恢复时先```git stash list ```,然后恢复指定的stash,使用```git stash apply stash@{num}```
**5、Feature分支**
开发新功能,则建立一个新的分支feature,但是由于需求变更,该功能不需要了,需要强制删除这个分支:
> git branch -D feature//强制删除没用合并过的分支
**6、多人协作**
查看远程仓库:
> git remote
查看详细信息
> git remote -v
推送分支:
> git push origin master/<指定分支>
哪些分支需要推送呢?
> (1)`master`分支是主分支,要与远程同步;
>
> (2)`dev`分支是开发分支,团队开发人员都在上面工作,所以需要远程同步
>
> (3)bug分支只需要在本地修复即可
>
> (4)feature分支是否推送到远程,取决于你是否和你的小伙伴合作在上面开发
抓取分支:
> 获取远程的dev分支:
> git checkout -b dev origin/dev
若远程端的分支与本地有冲突,则先pull下来,然后解决冲突:
> git branch --set-upstream-to=origin/dev dev //此处需要指定本地与远程分支的链接
> git pull
#so#
多人协作的工作模式通常是这样的:
1、首先,可以试图用git push origin < branch-name>推送自己的修改;
2、如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3、如果合并有冲突,则解决冲突,并在本地提交;
4、没有冲突或者解决掉冲突后,再用git push origin < branch-name>推送就能成功!
5、如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to < branch-name> origin< branch-name>。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
**7、Rebase**
-rebase操作可以将本地未push的分叉提交历史整理成直线。
-rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
####标签管理
发布一个版本时先打一个标签,指向某个commit
标签就是为了让开发者更好的记着commit的版本
**1、创建标签**
> git tag \ //默认标签是打在最新提交的commit上。
查找历史版本:
> git log --pretty=oneline --abbrev-commit
对历史版本打标签
> git tag \ \<对应commit的版本号前六位>
查看所有标签
> git tag //标签是按照字母顺序排序
查看标签信息:
> git show
创建带说明的标签:(-a(指定标签名) -m(指定说明文字))
> git tag -a v1.1 -m "REMARK" \
**2、操作标签**
删除标签
> git tag -d \
推送标签到remote
> git push origin \
一次性推送所有标签
> git push origin --tags
远程删除标签
> (1)从本地删除:git tag -d \
> (2)从远程删除:git push origin :refs/tags/\
####小结:
> 看完教程,相信你已对git有了一定的认知,学习后,会使你工作效率大增,谢谢观看。