Files
notes_estom/Git/git.md
2021-03-08 22:53:37 +08:00

433 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Git的本地操作
> 参考文献
> * [git使用教程](https://github.com/geeeeeeeeek/git-recipes/wiki)
一个非常详细的中文版git使用详解
本地操作主要是指在同一个仓库中实现版本控制,包括版本的提交、回退等基本擦偶作。
**git安装**
- Linux上通过命令行能够很轻松的部署好git
- Windows上需要安装GitBash模拟linux命令行
- 安装完成后需要配置全局信息的命令
\$ git config --global user.name "Your Name"
\$ git config --global user.email "email@example.com"
创建版本库
- git init
生成.git文件将这个目录初始化为一个版本的仓库。
- git add readme.txt
将文件添加到缓冲区,可以连续多次向缓冲区中添加东西
- git commit -m "wrote a message"
将缓冲区的文件提交到历史记录当中当中,可以一次提交对缓冲区的多次修改。
**时光穿梭机**
- it status
用来查看当前仓库的状态。主要有changes not staged for
commit状态工作区有变化没有提交chages to be
committed状态缓存区有变化等待提价
- git diff readme.txt
用来对比工作区和历史记录内容的差别。
**版本回退**
- git log
用来查看版本的历史记录
- git log --pretty=oneline
在一行显示历史记录
- git reset --hard HEAD\^
回退到上一次的历史记录
- git reset --hard id
回退到指定id的版本
- git reflog
用来查看所有操作的历史记录可以使用reset命令去定位到任何版本
**工作区和暂存区概念理解**
- 工作区Wording Directory在电脑中能够看到的目录是工作区
- 版本库Repository工作区有一个隐藏的目录.git是版本库
- 版本库中有Stage暂存区和master等分支以及一个纸箱master的指针HEAD
**管理修改**
- git跟踪管理的是对文件的修改而并非文件本身
**撤销修改**
- git checkout --readme.txt
把readme.txt在工作区的修改全部撤销掉。如果缓存区有readme.txt的中间状态则从缓存区恢复如果缓存区没有readme.txt的中间状态则从版本库中恢复。
- git reset HEAD readme.txt
把readmen.txt在缓存区的修改全部撤销掉。但是依然会保留工作区的修改。
**删除文件**
- git rm test.txt
把某个文件从缓存区删掉然后commit之后会从版本库删掉。如果删错了可以通过checkout从缓存区恢复这个文件。
Git的远程操作
远程操作主要是指在不同的仓库之间进行提交和代码更改。是一个明显的对等的分布式系统。其中本地个仓库与远程仓库不同的远程仓库之间都可以建立这种关系。这种关系之间的操作主要有pull和push。
**远程仓库**
- 创建SSH key远程仓库和本地仓库一般是通过ssh通信的需要ssh通信的加密钥匙。
id_rsa是私钥id_rsa.pub是公钥可以告诉别人。
ssh-keygen -t rsa -C 'yinkanglong@163.com'
- 登录github添加公钥内容。建立本地与远程仓库的通信协议
**添加远程仓库**
- github的界面操作可以很轻松的创建一个远程仓库。但如果想要直接上传自己本地的完整git库必须创建一个没有lisence和readme的空库。
- git remote add origin git@github.com:michaelliao/learngit.git
将本地仓库和远程仓库进行关联。一般都叫远程关联仓库为origin本地的主干分支一般名为master
- git push -u origin master
将本地的主干分支master推送到远程的origin分支上。-u参数实现了两个分支的关联将远程的git仓库的master和本地的master进行了分支管理当再次执行时只需要使用git
push origin master命令。
**从远程仓库克隆**
- git clone git@github.com:michaelliao/gitskills.git
分支管理
这里主要体现的git的功能的分离这才是真正的git吧。每一个分支都是一个单独的可以分离的工作单位。每个用户可以建立不同的分支进行工作最终提交到同一个开发分支上。一个用户可以建立不同的分支实现不同的功能最终提交到同一个用户分支上。分支的灵活性可以让我们很容易的实现不同分工的分割。
**创建分支**
- git checkout -b dev
创建分支并且将工作目录切换到dev的工作目录上。
- git branch dev
使用当前版本分支创建新的分支(即添加一个分支指针)。
- git checkout dev
将工作区切换到某一个分支指针所指的版本上。
- git branch
会列出所有的分支目录。
**分支合并**
- git merge dev
将dev分支合并到当前工作目录下的分支上不一定是产生他的父分支
- git branch -d dev
用来删除一个已经无效的分支指正,但是在这个分支指针上左右的操作都会保留。
**解决冲突**
- 当合并过程中出现冲突,会进入长途解决工作区,手动解决后提交,就会退出。
- 关于一点,提交后的分支有必要继续工作吗,都行。完全可以提交后删掉重新创建一个分支,获取主干分支上集成的最新内容,然后继续工作。也可以直接在分支上合并一次主干分支,然后得到最新的内容,继续在原来的分支上进行工作。
- git log --graph
可以查看分支合并图。
**分支合并方式**
- git merge --no-ff -m "merge messge" dev
\--no-ff
不适用fastfoward方式进行合并会产生一个新的版本节点。加上-m参数是因为这种方式合并过程中会自己提交合并后的版本。
**分支管理**
- 团队合作的分支管理组图就是你们要的方式
![clipboard.png](media/202749bd52950c0c839d73190cd2fd9d.png)
**BUG分支**
- 因为总会在自己工作的过程中出现紧急的需要更改的bug但是现在工作区中的内容还不能提交所以必须生成现在工作区的一个快照等处理完紧急的bug之后再来回复工作区的内容。
- git stash
将当前的工作现场储存起来等到修复完成bug之后可以再次进行更改。工作现场包括工作区和stage缓存区。然后可以清空工作区和缓存区的内容新建bug分支进行工作。
- git stash list
用来查看保存中的工作区。
- git stash apply stash@{0}
恢复stash内容但并不清楚stash列表中的内容。
- get stash drop
用来删除stash列表中的内容。因为已经恢复或者没有必要恢复
- git stash pop
可以用来弹出stash列表中的内容。
**Feature分支**
- 当添加一个新的功能的时候,因为是一些实验性的代码,所以要创建一个单独的分支进行处理。
- git checkout -b feature-vulcan
创建一个新的功能分支
git status
git add vulcan.py
git commit -m "add feature vulcan"
git checkout dev
git merge vulcan.py
git branch -D feature-vulcan 不合并,强制删除
多人协作
通过远程库的push和pull操作实现夺人合作
**推送分支或分支内容**
- 当从远程库进行克隆的时候实际上已经将本地master分支和远程的master分支进行乐关联。
- git remote [-v]
可以显示与远程库关联的信息
- git push origin master
推送分支,吧分支上的所有本地内容提交到远程库中的相同分支当中。
- 哪些分支需要推送
mater分支是主分支需要实时推送
dev是开发分支所有成员都要在上面工作。也需要与远程同步。
bug分支只需要在本地修复bug没有必要推送到远程。
feature分支可以不用推送到远程。单人开发不用夺人开发要推送到远程。
**抓取分支或者分支的内容**
- git checkout -b dev origin/dev
可以用来抓取远程分支dev这样会建立一个本地的本地的dev分支与远程的dev分支进行关联可以直接实现dev分支的控制push
- git pull \<remote\> \<branch\>
如果Git push失败说明当前的版本不是最新的版本。git pull
可以将远程库中的最新版本拉去到本地。
- git branch --set-upstream dev origin/\<branch\>
这样会制定git的本地分支与远程的分支之间的链接。
- 如果git pull有冲突与分支合并中解决冲突的方法一直。
**多人协作的协作模式通常是这样:**
> 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 branch-name origin/branch-name。
标签管理
**创建标签**
- git tag v1.0
对当前版本打标签为v1.0
- git tag
查看所有已经创建的标签
- git tag v0.9 6.225
对指定id的版本打标签
- git show v0.9
查看标签信息
- git tag -a v0.1 -m "version 0.1 released" 3628164
创建带有标签说明的标签
**操作标签**
- git tag -d v0.1
删除制定版本的标签
- git push origin v1.0
推送某个标签到远程
- git push origin --tags
一次性推送所有标签。
- git tag -d v0.9
git push origin :refs/tags/v0.9
从远程删除标签,先在本地删除标签,然后将操作推送到远程。
使用github
https://www.bilibili.com/video/av10475153/index_2.html\#page=5
这是一个比较啰嗦的讲解github页面的东西学号英文真的十分重要。
**git的简介**
Create Repository
创建仓库
Star
收藏
Fork
复制一份远程仓库
Pull Request
拉我呀,快点,我改好了。
Open & Merge Request
拉你了,别墨迹。
Watch
看着你呢,关注一个项目。
Github主页
仓库主页——仓库相关的信息和相关操作
个人主页
这是一些补充的内容
保持同步
**git remote**
- git remote
列出你和远程仓库之间的远程连接
- git remote -v
列出每个连接的名字和url
- git remote add \<name\> \<url\>
创建一个新的远程连接并添加名字
- git remote rm \<name\>
移除远程仓库的链接
git fetch
- git fetch \<remote\>
拉取仓库中的所有分支(包括相关的文件和所有的提交)
- git fetch \<remote\> \<branch\>
拉取制定仓库中的所有分支(包括相关的文件和所欲的提交)
\>
注意,这个步骤知识拉取远程的分支,在本地并没有合并也没有生成本地分支,知识一个可读的远程分支。使用
git branch -r 命令可以查看所有只读的远程分支。使用git
checkout命令可以创建本地分支并与远程分支关联。使用git merge
命令可以将远程分支与本地分支合并。
git pull
- git pull remote
拉取当前分支对应的远程副本并将远程副本的更改写入本地副本。相当于git
fetch之后git merge。
- git pull -rebase \<remote\>
使用git rebase命令合并远程分支与本地分支不使用git merge
git push
- git push \<remote\> \<branch\>
将制定分支推送到远程分支。包括所有的文件和提交。
- git push \<remote\> --force
强制推送
- git push \<remote\> --all
本地所有的分支推送到远程仓库当中
- git push \<remote\> --tags
将本地所有标签推送到远程仓库中