# Git学习笔记
**Repository Path**: HaiXiuDeDXianSheng/git-learning-notes
## Basic Information
- **Project Name**: Git学习笔记
- **Description**: 记录了git与github学习过程中的笔记
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2021-12-10
- **Last Updated**: 2022-07-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Git, GitHub
## README
# git的本地结构
- 本地结构
- 工作区(开发库)
- 暂存区(受控库)
- 本地库(产品库)
- 命令
>```git
> git add:从工作区提交到暂存区
> git commit:从暂存区提交到本地库
>```
# 代码托管中心
代码托管中心的任务是帮我们维护远程库
本地库和远程库的交互方式
- 团队内部协作
- push 命令:将本地库内容推送到远程库
- clone 命令:从远程库克隆到本地库
- pull 命令:从远程库拉取资源到本地库(可能由于信息不同步,一部分资料本地没有)
- 跨团队协作
- pull request命令:A团队远程库拉取B团队远程库时,pull请求需要经过B团队的审核,审核同意后才能拉取
- merge 命令:审核通过,则将B远程库中更新的东西合并到A库中
- fork 命令: A团队将B团队的远程库,复制一份形成新的远程库
# 初始化本地仓库
- 创建一个文件夹 GitRepository
- 打开Git Bash
>```bash
> // 查看git 安装的版本
> git --version
> //清屏操作
> clear
> // 设置签名。
> // 设置用户名和邮箱
> git config --global user.name "ZhongHD" //设置全局变量:用户名
> git config --global user.email "chinass@126.com"
> // 本地仓库的初始化
> cd /d/program/Git/GitRepository //先cd到目标路径
> git init // 初始化git仓库
>```
>```shell
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/program/Git/GitRepository (master)
>$ ll -la
>--------------------------------------------------------
>total 8
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 ./
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 16:40 ../
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 .git/
>```
其中.git目录是隐藏目录
查看.git下的文件内容,.git里面的内容不要所以手动修改
>```shell
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/program/Git/GitRepository (master)
>$ cd .git
>-------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/program/Git/GitRepository/.git (GIT_DIR!)
>$ ll -la
>--------------------------------------------------------
>total 11
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 ./
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 ../
>-rw-r--r-- 1 ZHD 197121 23 Nov 15 17:04 HEAD
>-rw-r--r-- 1 ZHD 197121 130 Nov 15 17:04 config
>-rw-r--r-- 1 ZHD 197121 73 Nov 15 17:04 description
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 hooks/
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 info/
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 objects/
>drwxr-xr-x 1 ZHD 197121 0 Nov 15 17:04 refs/
>```
其中config是配置文件,查看config里面的内容
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository/.git (GIT_DIR!)
>$ head config
>-----------------------------------------------
>[core]
> repositoryformatversion = 0
> filemode = false
> bare = false
> logallrefupdates = true
> symlinks = false
> ignorecase = true
>```
# git常用命令
## add和commit命令
展示:
- 先在任意位置创建一个文件,这边以桌面为例
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository/.git (GIT_DIR!)
>$ git add ~/Desktop/GitDemo.txt
>----------------------------------------------
>fatal: this operation must be run in a work tree
>```
- 因此 **必须要在git运行的目录创建文件**。
- 在/GitRespository目录下创建一个GitDemo.txt文件
- 将文件提交到git的**暂存区**
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add GitDemo.txt
>```
- 将暂存区的内容提交到本地库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>// -m 表示message
>$ git commit -m "这是我提交的第一个文件GitDemo.txt" GitDemo.txt
>-----------------------------------------------------
>[master (root-commit) 5ac02b0] 这是我提交的第一个文件GitDemo.txt
> 1 file changed, 0 insertions(+), 0 deletions(-)
> create mode 100644 GitDemo.txt
>```
【注意事项】
- 不放在本地仓库的文件Git不进行管理
- 即使放在本地仓库的文件,git也不进行管理,必须通过add,commit命令操作才可以将内容提交到本地库
## status命令
- 查看暂存区和工作区的状态
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>---------------------------------------------------
>On branch master //显示在主分支
>nothing to commit, working tree clean // 显示暂存区为空
>```
接下来我们在GitRespository目录下新建一个Demo02.txt文件
- 再重新查看一下状态
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>------------------------------------------------
>On branch master
>Untracked files: // 未被追踪的文件
> (use "git add ..." to include in what will be committed)
> Demo02.txt
>
>nothing added to commit but untracked files present (use "git add" to track)
>```
- 对Demo.txt文件提交到暂存区
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add Demo02.txt
>------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>-------------------------------------------------------
>On branch master
>Changes to be committed:
> (use "git restore --staged ..." to unstage)
> new file: Demo02.txt
>```
- 再利用commit命令,将文件提交至本地库
>```shell
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "这是我提交的第二个命令" Demo02.txt
>------------------------------------------------------
>[master 756b2d2] 这是我提交的第二个命令
> 1 file changed, 0 insertions(+), 0 deletions(-)
> create mode 100644 Demo02.txt
>```
- 修改GitRepository目录下的Demo02.txt文件,例如增加内容
>```
>000
>111
>222
>333
>aaa
>bbb
>```
- 然后再查看状态
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>--------------------------------------------------------
>On branch master
>Changes not staged for commit:
> (use "git add ..." to update what will be committed) // 可以对暂存区的文件进行更新
> (use "git restore ..." to discard changes in working directory)
> modified: Demo02.txt
>
>no changes added to commit (use "git add" and/or "git commit -a")
>```
- 对暂存区的文件进行更新(重新提交)
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add Demo02.txt
>-------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>------------------------------------------------------
>On branch master
>Changes to be committed:
> (use "git restore --staged ..." to unstage)
> modified: Demo02.txt // 经修改的文件
>```
- 将暂存区的文件再次提交到本地库中
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "修改了文件Demo02.txt中的内容" Demo02.txt
>---------------------------------------------------------
>[master ab87f9c] 修改了文件Demo02.txt中的内容
> 1 file changed, 6 insertions(+) // 显示Demo02.txt中增加了6行内容,与实际情况一致
>```
- 提交完再查看状态
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>----------------------------------------------------------
>On branch master
>nothing to commit, working tree clean
>```
## log命令
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git log // git会从近到远展示日志信息
>-------------------------------------------------------
>commit ab87f9c5f8eae46e8383bdf2a713eaa7f1e18474 (HEAD -> master)
>Author: ZhongHD <16***90@qq.com>
>Date: Tue Nov 16 16:51:11 2021 +0800
>
> 修改了文件Demo02.txt中的内容
>
>commit 756b2d2bacdbff0ee08068038de0e13550c82a1e // 表示当前历史记录对应的索引(key)
>Author: ZhongHD <16***90@qq.com>
>Date: Tue Nov 16 16:34:22 2021 +0800 // 当前历史记录对应的内容(value)
>
> 这是我提交的第二个命令
>
>commit 5ac02b04b9d378992296284b85af246ef83b4faf
>Author: ZhongHD <16***90@qq.com>
>Date: Tue Nov 16 10:55:14 2021 +0800
>
> 这是我提交的第一个文件GitDemo.txt
>```
## reset命令
reset命令:前进或后退历史版本
### 具体命令
>```
> git reset --hard [索引数]
>```
- 新建test.txt,提交到暂存区,再提交到本地库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test.txt
>--------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "我创建了一个test.txt文件" test.txt
>--------------------------------------------------
>[master fb01918] 我创建了一个test.txt文件
> 1 file changed, 0 insertions(+), 0 deletions(-)
> create mode 100644 test.txt
>```
- 修改test.txt内容,插入“aaa”,重新提交
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test.txt
>---------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "insert aaa" test.txt
>---------------------------------------------------
>[master 1623315] insert aaa
> 1 file changed, 1 insertion(+), 3 deletions(-)
>```
- 再修改内容,插入“bbb”,重新提交
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test.txt
>----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "insert bbb" test.txt
>----------------------------------------------------
>[master 5c64d2c] insert bbb
> 1 file changed, 2 insertions(+), 1 deletion(-)
>```
- 再修改内容,插入“ccc”,重新提交
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test.txt
>----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "insert ccc" test.txt
>----------------------------------------------------
>[master 9c5c623] insert ccc
> 1 file changed, 2 insertions(+), 1 deletion(-)
>```
- 查看日志情况
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reflog
>----------------------------------------------------
>9c5c623 (HEAD -> master) HEAD@{0}: commit: insert ccc
>5c64d2c HEAD@{1}: commit: insert bbb
>1623315 HEAD@{2}: commit: insert aaa
>4b51dcb HEAD@{3}: commit: insert something
>fb01918 HEAD@{4}: commit: 我创建了一个test.txt文件
>ab87f9c HEAD@{5}: commit: 修改了文件Demo02.txt中的内容
>756b2d2 HEAD@{6}: commit: 这是我提交的第二个命令
>5ac02b0 HEAD@{7}: commit (initial): 这是我提交的第一个文件GitDemo.txt
>```
目前的指针指在“insert ccc”这个版本,其中HEAD@(i)中的 i 表示的是指针回退到这个版本所需要的步数,HEAD表示这个指针的名称
例如要从“insert ccc”版本回退到“insert aaa”版本
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reset --hard 1623315 // 后面加的是所需要跳转的索引数
>HEAD is now at 1623315 insert aaa
>```
- 此时指针已经跳转到aaa这个索引
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reflog
>1623315 (HEAD -> master) HEAD@{0}: reset: moving to 1623315
>9c5c623 HEAD@{1}: commit: insert ccc
>5c64d2c HEAD@{2}: commit: insert bbb
>1623315 (HEAD -> master) HEAD@{3}: commit: insert aaa
>4b51dcb HEAD@{4}: commit: insert something
>fb01918 HEAD@{5}: commit: 我创建了一个test.txt文件
>ab87f9c HEAD@{6}: commit: 修改了文件Demo02.txt中的内容
>756b2d2 HEAD@{7}: commit: 这是我提交的第二个命令
>5ac02b0 HEAD@{8}: commit (initial): 这是我提交的第一个文件GitDemo.txt
>```
- 查看文件test.txt的内容,发现内容已经发生回退
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ tail test.txt
>aaa
>```
- 如果回退后悔了,还是想要ccc的版本,则继续使用reset命令
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reset --hard 9c5c623
>HEAD is now at 9c5c623 insert ccc
>```
### reset的hard、mixed、soft参数
- **hard参数**
- 本地库的版本进行回退时,暂存区和工作区的代码同时跟着回退
- **本地库指针移动的同时,暂存区、工作区的指针同步移动**
- **mixed参数** (不常用)
- 本地库指针移动时
- **暂存区指针跟着本地库移动**
- 工作区的指针 **不移动**
- **soft参数** (也不太常用)
- 本地库指针移动
- 暂存区和工作区指针**都不移动**
## 删除文件&找回文件
### 找回本地库删除的文件
>```
>1.新建一个文件test2.txt
>2.将它add到暂存区中
>3.commit到本地库中
>```
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test2.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "添加test2.txt文件" test2.txt
>-----------------------------------------------------
>[master 3471fae] 添加test2.txt文件
> 1 file changed, 0 insertions(+), 0 deletions(-)
> create mode 100644 test2.txt
>```
- 删除工作区中的test2.txt
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ rm test2.txt
>```
- 将删除操作同步到暂存区
- 将删除操作同步到本地库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>----------------------------------------------------------
>On branch master
>Changes not staged for commit:
> (use "git add/rm ..." to update what will be committed)
> (use "git restore ..." to discard changes in working directory)
> deleted: test2.txt
>
>no changes added to commit (use "git add" and/or "git commit -a")
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "删除test2.txt" test2.txt
>----------------------------------------------------
>[master a611dcb] 删除test2.txt
> 1 file changed, 0 insertions(+), 0 deletions(-)
> delete mode 100644 test2.txt
>```
- 查看日志
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reflog
>-------------------------------------------------
>a611dcb (HEAD -> master) HEAD@{0}: commit: 删除test2.txt
>3471fae HEAD@{1}: commit: 添加test2.txt文件
>9c5c623 HEAD@{2}: reset: moving to 9c5c623
>1623315 HEAD@{3}: reset: moving to 1623315
>9c5c623 HEAD@{4}: commit: insert ccc
>5c64d2c HEAD@{5}: commit: insert bbb
>1623315 HEAD@{6}: commit: insert aaa
>4b51dcb HEAD@{7}: commit: insert something
>fb01918 HEAD@{8}: commit: 我创建了一个test.txt文件
>ab87f9c HEAD@{9}: commit: 修改了文件Demo02.txt中的内容
>756b2d2 HEAD@{10}: commit: 这是我提交的第二个命令
>5ac02b0 HEAD@{11}: commit (initial): 这是我提交的第一个文件GitDemo.txt
>```
**这里git并不是真把文件给删除了**,而是通过指针回到了HEAD@(0)这个索引
- 找回本地库中删除的文件,实际上就是将历史版本切换到感概添加文件的那个索引
>```bash
>$ git reset --hard HEAD@{1}
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reflog
>---------------------------------------------
>3471fae (HEAD -> master) HEAD@{0}: reset: moving to 3471fae
>9c5c623 HEAD@{1}: reset: moving to 9c5c623
>a611dcb HEAD@{2}: commit: 删除test2.txt
>3471fae (HEAD -> master) HEAD@{3}: commit: 添加test2.txt文件
>9c5c623 HEAD@{4}: reset: moving to 9c5c623
>1623315 HEAD@{5}: reset: moving to 1623315
>9c5c623 HEAD@{6}: commit: insert ccc
>5c64d2c HEAD@{7}: commit: insert bbb
>1623315 HEAD@{8}: commit: insert aaa
>4b51dcb HEAD@{9}: commit: insert something
>fb01918 HEAD@{10}: commit: 我创建了一个test.txt文件
>ab87f9c HEAD@{11}: commit: 修改了文件Demo02.txt中的内容
>756b2d2 HEAD@{12}: commit: 这是我提交的第二个命令
>5ac02b0 HEAD@{13}: commit (initial): 这是我提交的第一个文件GitDemo.txt
>-------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ ls
>-------------------------------------------------
>Demo02.txt GitDemo.txt test.txt test2.txt
>```
### 找回暂存区删除的文件
- 删除工作区的数据,test2.txt
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ rm test2.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ ls
>Demo02.txt GitDemo.txt test.txt
>```
- 同步到暂存区
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test2.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>-----------------------------------------------------
>On branch master
>Changes to be committed:
> (use "git restore --staged ..." to unstage)
> deleted: test2.txt
>```
- 后悔了,想恢复暂存区的数据
查看日志信息
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reflog
>--------------------------------------------------------
>3471fae (HEAD -> master) HEAD@{0}: reset: moving to 3471fae
>9c5c623 HEAD@{1}: reset: moving to 9c5c623
>a611dcb HEAD@{2}: commit: 删除test2.txt
>3471fae (HEAD -> master) HEAD@{3}: commit: 添加test2.txt文件
>9c5c623 HEAD@{4}: reset: moving to 9c5c623
>1623315 HEAD@{5}: reset: moving to 1623315
>9c5c623 HEAD@{6}: commit: insert ccc
>5c64d2c HEAD@{7}: commit: insert bbb
>1623315 HEAD@{8}: commit: insert aaa
>4b51dcb HEAD@{9}: commit: insert something
>fb01918 HEAD@{10}: commit: 我创建了一个test.txt文件
>ab87f9c HEAD@{11}: commit: 修改了文件Demo02.txt中的内容
>756b2d2 HEAD@{12}: commit: 这是我提交的第二个命令
>5ac02b0 HEAD@{13}: commit (initial): 这是我提交的第一个文件GitDemo.txt
>```
发现只要移动指针到HEAD@{3},就能恢复文件。(**删除操作实际上是指针往回滚了一次**)
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reset --hard 3471fae
>------------------------------------------------
>HEAD is now at 3471fae 添加test2.txt文件
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ ls
>-------------------------------------------------
>Demo02.txt GitDemo.txt test.txt test2.txt
>```
- **实际上还有还有更简单的操作**,只需要 **git reset --hard HEAD** (看当前这个HEAD指针指向哪儿了,重复这个操作)
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git reset --hard HEAD
>HEAD is now at 3471fae 添加test2.txt文件
>```
## diff命令:比较文件的差异
### 比较工作区和暂存区文件差异
- 新建文本test3.txt,随意录入内容,例如“aaaa”
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ touch test3.txt
>----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ ls
>Demo02.txt GitDemo.txt test.txt test2.txt test3.txt
>----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ vi test3.txt
>------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ tail test3.txt
>aaaa
>```
- 将文件同步到暂存区和本地库中
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test3.txt
>-------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "提交了test3.txt" test3.txt
>[master c98da77] 提交了test3.txt
> 1 file changed, 1 insertion(+)
> create mode 100644 test3.txt
>------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git status
>On branch master
>nothing to commit, working tree clean
>```
- 更改工作区中test3.txt中的内容,增加内容“bbb”
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ vi test3.txt
>-------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ tail test3.txt
>aaaabbbbb
>```
- 经过以上操作,导致工作区中和暂存区中文件内容不一致
- 通过git diff命令比对工作区和暂存区中文件在哪里不一致
>```bash
> git diff [文件名] // 将工作区文件和暂存区中文件进行比较
>```
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git diff test3.txt
>--------------------------------------------------
>diff --git a/test3.txt b/test3.txt
>index 7284ab4..6100b7b 100644
>--- a/test3.txt
>+++ b/test3.txt
>@@ -1 +1 @@
>-aaaa // git是按行为单位管理数据的,它先把原先文件中的aaaa给删除了,然后又增加了一行aaaabbbbb
>\ No newline at end of file
>+aaaabbbbb
>```
- 针对之前空的test2.txt文件,往里面增加内容“qqq”
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ head test2.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ vi test2.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ head test2.txt
>qqq
>```
#### 比较多个文件的差异
>```
> git diff //比较的是工作区中和暂存区中的所有文件差异
>```
- 执行git diff命令,后面不加参数,即可查看**工作区与暂存区**不同的**所有文件**
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git diff
>------------------------------------------------
>diff --git a/test2.txt b/test2.txt
>index e69de29..1b7ae83 100644
>--- a/test2.txt
>+++ b/test2.txt
>@@ -0,0 +1 @@
>+qqq
>
>diff --git a/test3.txt b/test3.txt
>index 7284ab4..6100b7b 100644
>--- a/test3.txt
>+++ b/test3.txt
>@@ -1 +1 @@
>-aaaa
>\ No newline at end of file
>+aaaabbbbb
>```
### 比较工作和本地库文件差异
>```
> git diff 历史版本索引 文件名
>```
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git diff HEAD test3.txt // 工作区文件和本地库当前版本文件相比较
>----------------------------------------------------------
>diff --git a/test3.txt b/test3.txt
>index 7284ab4..6100b7b 100644
>--- a/test3.txt
>+++ b/test3.txt
>@@ -1 +1 @@
>-aaaa
>\ No newline at end of file
>+aaaabbbbb
>```
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "insert bbbbb" test3.txt
>--------------------------------------------------------
>[master ff88f98] insert bbbbb
> 1 file changed, 1 insertion(+), 1 deletion(-)
>```
- 改变test3.txt文件中的内容为“a”,然后git add到暂存区
- 改变test3.txt文件中的内容为“ad”
- 经过以上步骤,工作区、暂存区、本地库三者的test3.txt文件均不相同
- 本地库内容为 "aaaabbbbb"
- 暂存区内容为"a"
- 工作区内容为"ad"
此时再来审视git diff的两个命令
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git diff HEAD test3.txt
>------------------------------------------------------
>diff --git a/test3.txt b/test3.txt
>index 6100b7b..bf1e18f 100644
>--- a/test3.txt
>+++ b/test3.txt
>@@ -1 +1 @@
>-aaaabbbbb
>+ad // 此处可以发现,它是在和工作区的文件相比较
>```
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git diff test3.txt
>---------------------------------------------------
>diff --git a/test3.txt b/test3.txt
>index 7898192..bf1e18f 100644
>--- a/test3.txt
>+++ b/test3.txt
>@@ -1 +1 @@
>-a
>+ad // 暂存区,也是在和工作区的文件相比较
>```
因此可以得出结论,**git diff的比较本质上是工作区和暂存区或者本地库的比较**
- **git diff [文件名]**
- 工作区文件和暂存区文件的比较
- **git diff 历史版本索引数 文件名**
- 工作区文件和本地库文件的比较
# 分支
## 什么是分支
- 何为分支
- 在版本控制中,使用多条线同时推进多个任务。这里说的多条线,就是多个分支。
- 分支的好处
- 同时多个分支可以并行开发,互相不耽误、互不影响,提高开发效率
- 如果有一个分支功能开发失败,直接删除这个分支即可,不会对其他分支产生任何影响
## 操作分支
- 在工作区新建一个test4.txt文件,随便输入内容abc
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ touch test4.txt
>-------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ vi test4.txt
>--------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ head test4.txt
>abc
>```
- 将该文件添加到暂存区和本地库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test4.txt
>-------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "添加了test4.txt文件" test4.txt
>--------------------------------------------------------
>[master b68a2b0] 添加了test4.txt文件
> 1 file changed, 1 insertion(+)
> create mode 100644 test4.txt
>```
- **查看分支**
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git branch -v // -v可以查看当前git中的所有分支
>--------------------------------------------------
>* master b68a2b0 添加了test4.txt文件
>```
- **创建分支**
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git branch mybranch // 创建新分支mybranch
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git branch -v
>--------------------------------------------
>* master b68a2b0 添加了test4.txt文件 // 这里的*表示当前在哪个分支
> mybranch b68a2b0 添加了test4.txt文件
>```
- **切换分支**
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git checkout mybranch
>Switched to branch 'mybranch'
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ git branch -v
>--------------------------------------------------
> master b68a2b0 添加了test4.txt文件
>* mybranch b68a2b0 添加了test4.txt文件 //并且可以看到这里master和mybranch分支对应的版本号都是一样的
>```
## 分支冲突
- 查看当前分支
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ git status
>On branch mybranch
>nothing to commit, working tree clean
>```
- 在当前分支mybranch下,修改test4文件,随意增加内容。
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ vi test4.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ head test4.txt
>--------------------------------------------------
>abc
>啊啊啊啊,我是新增加的内容啊啊啊--by mybranch
>```
- 将修改后的文件提交暂存区和本地库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ git add test4.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ git commit -m "在分支mybranch中为test4.txt文件增加内容" test4.txt
>-----------------------------------------------------------------
>[mybranch dd8bd30] 在分支mybranch中为test4.txt文件增加内容
> 1 file changed, 1 insertion(+)
>```
- 将分支切换到master
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ git checkout master
>---------------------------------------------------
>Switched to branch 'master'
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git branch -v // 此时发现master和mybranch版本号不一样了
>-----------------------------------------------------
>* master b68a2b0 添加了test4.txt文件
> mybranch dd8bd30 在分支mybranch中为test4.txt文件增加内容
>```
- 在master分支中查看test4.txt文件
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ head test4.txt
>abc
>```
发现master中的内容并没有变
- 然后我们在主分支中增加test4.txt的内容,随意加,家的和mybranch不同。
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ vi test4.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ head test4.txt
>------------------------------------------------------
>abc
>啊啊啊啊啊,这是在master分支中增加的内容啊--by master
>```
- 提交暂存区和本地库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test4.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "在主分支中增加了内容" test4.txt
>--------------------------------------------------------
>[master d40dd49] 在主分支中增加了内容
> 1 file changed, 1 insertion(+)
>```
- 再次切换到mybranch分支查看
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git checkout mybranch
>-----------------------------------------------------
>Switched to branch 'mybranch'
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ git branch -v
>------------------------------------------------------
> master d40dd49 在主分支中增加了内容 // 发现主分支的版本号也改变了
>* mybranch dd8bd30 在分支mybranch中为test4.txt文件增加内容
>```
上述操作说明,**各自分支进行的开发,对其他分支都是不影响的。**
### 合并分支
**目的**:将mybranch分支合并到master主分支
**步骤**:
- **进入主分支master**
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (mybranch)
>$ git checkout master
>Switched to branch 'master'
>```
- 将mybranch中的内容与master分支中的内容进行合并
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git merge mybranch
>---------------------------------------------------------------
>Auto-merging test4.txt
>CONFLICT (content): Merge conflict in test4.txt // 发现合并时有冲突
>Automatic merge failed; fix conflicts and then commit the result.
>```
- 查看test4.txt文件
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master|MERGING) //这个标识就表示当前处于合并的状态中
>$ cat test4.txt
>------------------------------------------------------
>abc
><<<<<<< HEAD // 当前分支修改的内容
>啊啊啊啊啊,这是在master分支中增加的内容啊--by master
>=======
>啊啊啊啊,我是新增加的内容啊啊啊--by mybranch
>>>>>>>> mybranch // 被合并的分支中修改的内容
>```
**思考**:什么时候会出现冲突问题?
在同一个文件的同一个位置出现修改
**冲突解决**
公司团队内部之间讨论,留下哪一部分内容(需要人为决定),删除其他内容,最终在test4.txt文件中留下如下内容。(**特殊符号什么的都要删掉**)
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master|MERGING) //这个标识就表示当前处于合并的状态中
>$ cat test4.txt
>------------------------------------------------------
>abc
>啊啊啊啊,我是新增加的内容啊啊啊--by mybranch
>```
- 解决冲突后,查看git状态
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master|MERGING)
>$ git status
>-------------------------------------------------------
>On branch master
>All conflicts fixed but you are still merging. // 仍处于合并状态中
> (use "git commit" to conclude merge) // commit之后才能去除合并状态
>
>Changes to be committed:
> modified: test4.txt
>```
- 进行commit操作 (**不能带文件名**),消除merge状态
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master|MERGING)
>$ git commit -m "合并后的test4.txt" test4.txt // 此处不能带有文件名
>----------------------------------------------------------------
>fatal: cannot do a partial commit during a merge.
>```
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master|MERGING)
>$ git commit -m "解决了冲突问题" // commit之后就取消了合并状态
>-----------------------------------------------------------
>[master 25fcfb3] 解决了冲突问题
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>```
# 与远程库进行交互
## 注册GitHub或Gitee
省略
## 创建远程仓库
在github中手动创建,一般与本地仓库名称一样即可。一般由项目经理进行创建。
## 将本地库的资源推送远程库
- 获取远程库地址
- HTTP地址
- https://github.com/ZhongAlexMrD/GitRepository.git
- SSH地址
- git@github.com:ZhongAlexMrD/GitRepository.git
远程库地址比较长,每次复制比较麻烦。Git支持本地将github地址通过别名进行保存。
- 保存远程地址为别名
- 查看别名
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git remote -v // 查看别名。发现目前没有任何别名
>```
- 设置别名
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git remote add GitRpositoryAddress https://github.com/ZhongAlexMrD/GitRepository.git
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git remote -v
>---------------------------------------------------
>GitRpositoryAddress https://github.com/ZhongAlexMrD/GitRepository.git (fetch) // 表示可以从这个地址取回东西
>GitRpositoryAddress https://github.com/ZhongAlexMrD/GitRepository.git (push) // 表示可以推送东西到这个地址
>```
- **设置的别名仅限于本当前仓库**
其中设置别名的语法是
>```bash
>git remote add [HTTP_alias] [HTTP_address] // 别名+地址
>```
## 推送操作(Push)
语法
>```bash
> git push [远程仓库地址/别名] [要推送的本地仓库的分支]
>```
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git push GitRpositoryAddress master // 会弹出窗口要求登录github。国内登录有时候会遇到connect error的问题(被墙了)
>----------------------------------------------------------
>Enumerating objects: 48, done.
>Counting objects: 100% (48/48), done.
>Delta compression using up to 12 threads
>Compressing objects: 100% (38/38), done.
>Writing objects: 100% (48/48), 12.57 KiB | 1.57 MiB/s, done.
>Total 48 (delta 15), reused 0 (delta 0), pack-reused 0
>remote: Resolving deltas: 100% (15/15), done.
>To https://github.com/ZhongAlexMrD/GitRepository.git
> * [new branch] //表示在远程库创建了新的分支 master -> master // 表示将本地库的master分支推送到远程库的master分支
>```
## 克隆操作(clone)
远程库中已经有部分代码了,如果是团队开发的话,另一个人在进行本地开发之前,应该先将远程库中的代码克隆下来。
- 首先要选择克隆下来的文件要放在本地的哪个盘中(C盘还是D盘?)
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d // 选择在d盘中进行克隆操作
>$ git clone GitRpositoryAddress
>-------------------------------------------------------------
>fatal: repository 'GitRpositoryAddress' does not exist // 因为之前的GitRpositoryAddress别名是在GitRepository仓库下设置的,并不是全局设置,因此在GitRepository仓库之外应该是无法生效的。
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d
>$ git remote -v // 只能在本地仓库中才能查看远程仓库地址。
>-----------------------------------------------------------------
>fatal: not a git repository (or any of the parent directories): .git
>```
因此只能采用把远程库的http地址复制下来的方式。(另,国内访问github日常断网...)
- 进行克隆
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d
>$ git clone https://github.com/ZhongAlexMrD/GitRepository.git // 因此只能把http地址复制到这边
>--------------------------------------------------------------------------
>Cloning into 'GitRepository'...
>remote: Enumerating objects: 48, done.
>remote: Counting objects: 100% (48/48), done.
>remote: Compressing objects: 100% (23/23), done.
>remote: Total 48 (delta 15), reused 48 (delta 15), pack-reused 0
>Receiving objects: 100% (48/48), 12.57 KiB | 2.51 MiB/s, done.
>Resolving deltas: 100% (15/15), done.
>```
- 进入克隆仓库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d
>$ cd GitRepository
>------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ ls
>------------------------------------------------------
>Demo02.txt git与github.md test2.txt test4.txt
>GitDemo.txt test.txt test3.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git remote -v // 此时可以发现,这边的地址别名只是本仓库的别名。之前的GitRepositoryAddress并不会在这里面
>---------------------------------------------------------
>origin https://github.com/ZhongAlexMrD/GitRepository.git (fetch)
>origin https://github.com/ZhongAlexMrD/GitRepository.git (push)
>```
克隆操作可以帮我们完成三件事
1. 初始化本地库
2. 将远程库内容完整德克隆到本地库
3. 自动创建远程库地址的别名
## 要求加入团队(push)
团队B将从远程库拉取下来的代码,在本地开发后,再次推送到远程库(该远程库由团队A创建),加入团队
- 我们新建一个Demo2.txt文件,表示更新了团队B本地库的信息
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ touch Demo2.txt
>-------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ vi Demo2.txt
>-------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ head Demo2.txt
>-------------------------------------------------------
>我创建了Demo2.txt文件,是普通开发人员创建
>```
- 文件提交到暂存区和本地库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git add Demo2.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git commit -m "创建了Demo2.txt" Demo2.txt
>[master 39aa3c0] 创建了Demo2.txt
> 1 file changed, 1 insertion(+)
> create mode 100644 Demo2.txt
>```
- 文件push推送到远程库
>```bash
>$ git push origin master
>------------------------------------------------------
>Enumerating objects: 4, done.
>Counting objects: 100% (4/4), done.
>Delta compression using up to 12 threads
>Compressing objects: 100% (3/3), done.
>Writing objects: 100% (3/3), 336 bytes | 336.00 KiB/s, done.
>Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
>remote: Resolving deltas: 100% (1/1), completed with 1 >local object.
>To https://github.com/ZhongAlexMrD/GitRepository.git
> 5adf5cb..39aa3c0 master -> master
>```
发现直接就提交到团队A创建的远程库中了,没有任何验证,这是不对的。
这是因为这里用的一台机器提交结果,git在本地添加了缓存,直接取了缓存中的结果
- 下面删除git缓存
在windows搜索栏中搜索“管理你的凭据”,删除github凭据。然后再新建文件,再提交则需要验证.此时登录另一个账号B密码(远程库由账号A创建)。
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ touch Demo03.txt
>------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git add .
>----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git commit -m "新建Demo03.txt" Demo03.txt
>------------------------------------------------------
>[master 4e9c501] 新建Demo03.txt
> 1 file changed, 0 insertions(+), 0 deletions(-)
> create mode 100644 Demo03.txt
>```
- **此时就发现账号B没有访问这个远程库的权限**
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git push origin master
>remote: Permission to ZhongAlexMrD/GitRepository.git denied to DioxinMrD.
>fatal: unable to access 'https://github.com/ZhongAlexMrD/GitRepository.git/': The requested URL returned error: 403
>```
- **邀请加入团队**
- 登录账号A让账号A邀请账号B加入团队
- 在Github中手动操作
- settings-->manage access-->add people
- pending invite
- 获得邀请链接 https://github.com/ZhongAlexMrD/GitRepository/invitations
- **接受邀请**
- 推出账号A,登录账号B(被邀请者账号),访问邀请链接(在地址栏访问邀请链接),接受邀请
- 然后再重新push,,登录账号B,发现可以成功提交了
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git push origin master
>-----------------------------------------------------------------
>Enumerating objects: 3, done.
>Counting objects: 100% (3/3), done.
>Delta compression using up to 12 threads
>Compressing objects: 100% (2/2), done.
>Writing objects: 100% (2/2), 242 bytes | 242.00 KiB/s, done.
>Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
>remote: Resolving deltas: 100% (1/1), completed with 1 local object.
>To https://github.com/ZhongAlexMrD/GitRepository.git
> 79cf8a8..26e6999 master -> master
>```
## 远程库修改的拉取pull
经过上述账号B的开发并提交远程库,对于账号A来说,远程库中的内容和账号A本地库中的内容是不一致的,因此账号A需要从远程库拉取内容到本地
- pull相当于以下两个操作的合并
- fetch操作
- merge操作
### 使用fetch + merge 操作代替pull操作
- 用账号A(一般项目经理)登录远程库的github,确认远程库中的内容是否进行了更新
- 账号A进行拉取操作
- 先是抓取操作 git fetch [远程库地址] [远程库分支]
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git fetch origin master // 该操作对于远程库来说是一个读取操作,因此不需要账号密码验证
>--------------------------------------------------------------------------
>From https://github.com/ZhongAlexMrD/GitRepository
> * branch master -> FETCH_HEAD
>```
**在抓取操作执行之后,只是将远程库的内容下载到本地,但是工作区中的内容并没有更新**
- 查看远程库的分支中具体是什么内容
- 切换到下载下来的远程库分支
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git checkout origin/master // 切换到origin/master分支
>------------------------------------------------------
>Note: switching to 'origin/master'.
>
>You are in 'detached HEAD' state. You can look around, make experimental
>changes and commit them, and you can discard any commits you make in this
>state without impacting any branches by switching back to a branch.
>
>If you want to create a new branch to retain commits you create, you may
>do so (now or later) by using -c with the switch command. Example:
>
>git switch -c
>
>Or undo this operation with:
>
>git switch -
>
>Turn off this advice by setting config variable advice.detachedHead to false
>
>HEAD is now at 26e6999 创建Demo03.txt
>```
- 查看文件
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository ((26e6999...))
>$ ll
>-----------------------------------------------------
>total 37
>-rw-r--r-- 1 ZHD 197121 23 Nov 30 11:27 Demo02.txt
>-rw-r--r-- 1 ZHD 197121 0 Dec 7 17:34 Demo03.txt
>-rw-r--r-- 1 ZHD 197121 56 Dec 7 15:01 Demo2.txt
>-rw-r--r-- 1 ZHD 197121 0 Nov 30 11:27 GitDemo.txt
>-rw-r--r-- 1 ZHD 197121 32261 Nov 30 11:27 git与github.md
>-rw-r--r-- 1 ZHD 197121 11 Nov 30 11:27 test.txt
>-rw-r--r-- 1 ZHD 197121 0 Nov 30 11:27 test2.txt
>-rw-r--r-- 1 ZHD 197121 10 Nov 30 11:27 test3.txt
>-rw-r--r-- 1 ZHD 197121 89 Nov 30 11:27 test4.txt
>```
- 验证远程库分支中的文件内容都正确,则可进行合并操作
- merge
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository ((26e6999...))
>$ git checkout master
>-------------------------------------------------------
>Switched to branch 'master'
>Your branch is up to date with 'origin/master'.
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git merge origin/master
>-----------------------------------------------------
>Already up to date. // 因为我这边是拉取了和本地一模一样的内容到本地库
>```
### 使用pull命令拉取
>```bash
>git pull origin master
>```
- 何时使用pull?何时使用fetch+merge?
- fetch+merge操作比较保险,用于代码比较重要的场合
- pull 用于代码比较简单,也不是很重要的场合,省事
>```
>git pull = git fetch + git merge FETCH_HEAD
>
>git merge = git fetch + git rebase FETCH_HEAD
>```
## 删除github远程库
https://blog.csdn.net/xuchaoxin1375/article/details/110987951
## 协作开发合作时冲突的解决办法
- 首先来人为制造下冲突,在账号B的本地库创建文件并提交
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ touch test20211209.txt
>--------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ vi test20211209.txt
>---------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ head test20211209.txt
>----------------------------------------------------
>aaaaaabc
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git add test20211209.txt
>---------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git commit -m "创建test20211209.txt文件" test20211209.txt
>-------------------------------------------------------
>[master 2f7f42d] 创建test20211209.txt文件
> 1 file changed, 1 insertion(+)
> create mode 100644 test20211209.txt
>
>```
- 将结果推送至远程库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git push origin master
>Enumerating objects: 4, done.
>Counting objects: 100% (4/4), done.
>Delta compression using up to 12 threads
>Compressing objects: 100% (2/2), done.
>Writing objects: 100% (3/3), 300 bytes | 300.00 KiB/s, done.
>Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
>remote: Resolving deltas: 100% (1/1), completed with 1 local object.
>To https://github.com/ZhongAlexMrD/GitRepository.git
> 26e6999..2f7f42d master -> master
>```
- 使用账号A进行拉取操作(因为拉取是读取操作,因此不需要登录)
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git pull origin master
>-----------------------------------------------------------
>remote: Enumerating objects: 8, done.
>remote: Counting objects: 100% (8/8), done.
>remote: Compressing objects: 100% (5/5), done.
>remote: Total 7 (delta 3), reused 5 (delta 1), pack-reused 0
>Unpacking objects: 100% (7/7), 734 bytes | 40.00 KiB/s, done.
>From https://github.com/ZhongAlexMrD/GitRepository
> * branch master -> FETCH_HEAD
> 39aa3c0..2f7f42d master -> origin/master
>Updating 39aa3c0..2f7f42d
>Fast-forward
> Demo03.txt | 0
> test20211209.txt | 1 +
> 2 files changed, 1 insertion(+)
> create mode 100644 Demo03.txt
> create mode 100644 test20211209.txt
>```
- 至此为止,远程合作没有问题
- 现在操作同一个文件的同一个位置的时候就会引起冲突
- 在**账号A**的本地库对其进行修改,并提交远程库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ vi test20211209.txt
>------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ head test20211209.txt
>------------------------------------------------------
>aaaaaabc
>aaa - by 账号A
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add test20211209.txt
>-----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "更新了test20211209.txt by 账号A" test20211209.txt
>-------------------------------------------------------
>[master 5e782fd] 更新了test20211209.txt by 账号A
> 1 file changed, 1 insertion(+)
>
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git push origin master
>---------------------------------------------------------
>Enumerating objects: 5, done.
>Counting objects: 100% (5/5), done.
>Delta compression using up to 12 threads
>Compressing objects: 100% (2/2), done.
>Writing objects: 100% (3/3), 319 bytes | 319.00 KiB/s, done.
>Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
>error: RPC failed; curl 28 OpenSSL SSL_read: Connection was reset, errno 10054
>send-pack: unexpected disconnect while reading sideband packet
>fatal: the remote end hung up unexpectedly
>Everything up-to-date
>```
- **账号A**是先修改的一方,所以提交没有问题
- 切换到**账号B**的本地库(删除电脑本地的凭据)
- 改动test20211209.txt的相同位置,然后进行推送
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ vi test20211209.txt
>----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ head test20211209.txt
>-----------------------------------------------------
>aaaaaabc
>bbbb - by 账号B
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git add test20211209.txt
>-----------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git commit -m "更新了test20211209.txt by 账号B" test20211209.txt
>-----------------------------------------------------
>[master a0710cf] 更新了test20211209.txt by 账号B
> 1 file changed, 1 insertion(+)
>
>```
- 账号B推送至远程库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ git push origin master
>---------------------------------------------------
>To https://github.com/ZhongAlexMrD/GitRepository.git
> ! [rejected] master -> master (fetch first)
>error: failed to push some refs to 'https://github.com/ZhongAlexMrD/GitRepository.git'
>hint: Updates were rejected because the remote contains >work that you do
>hint: not have locally. This is usually caused by another >repository pushing
>hint: to the same ref. You may want to first integrate the remote changes
>hint: (e.g., 'git pull ...') before pushing again.
>hint: See the 'Note about fast-forwards' in 'git push --help' for details.
>```
- 在冲突的情况下,应该先拉取下来,然后修改冲突,然后再推送到远程库
- **账号B**进行远程库的拉取操作
>```bash
>git pull origin master
>```
- 人为解决这个冲突(同本地库解决冲突的方式)
- 解决完冲突后,账号B重新向远程库进行推送
>```bash
>git add .
>git commit -m "解决了冲突" //解决冲突问题时,不可以带文件名,否则提交失败
> git push origin master
>```
## 跨团队合作
两个不同团队进行合作。(前面一个案例是在同一个团队中,不同开发人员的合作)
- **团队A**的**项目经理Aa**创建远程库A
- **团队B**的人员取得远程库的地址,**项目经理Bb**登录github访问该地址,进行fork操作,得到远程库B
- 团队B将fork得到的远程库B,克隆到本地(clone的地址应该是远程库B的地址),得到本地库B
- 团队B成员对本地库B进行更改
>```bash
>touch test2.txt // 团队B对本地库B进行操作
>head test2.txt
>--------------------------
>nnnn
>
>git add .
>git commit -m "团队B创建test2.txt" test2.txt
>
>git push [远程库B的地址] master
>```
- 团队B登录github,在github中手动进行pull request操作
- 团队B提交pull request操作后,等待团队A的审核
- 团队A登录github,项目经理Aa在github中点击“pull resquest”查看请求,进行审核操作。(可以互相留言)
- 在files changed里面可以查看具体更改的文件内容
- 没有问题,则进行merge pull request操作
- 合并完之后则会在团队A的远程库A中出现团队B修改的内容
## SSH免密登录
对于同一个团队的远程库,每次向远程库提交内容都要输入账号密码。不过windows10系统自带有"管理凭据"功能,可以避免重复输入。如果不是windows10系统,则比较麻烦
**解决方法**:不使用HTTP地址提交,使用**SSH地址**提交。例如
>```
>git@github.com:ZhongAlexMrD/GitRepository.git
>```
- 进到用户主目录中
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /d/GitRepository (master)
>$ cd ~
>```
- 执行命令,生成一个.ssh目录
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 ~
>$ ssh-keygen -t rsa -C chinass@126.com // 这个邮箱必须是注册github的邮箱
>----------------------------------------------------
>Generating public/private rsa key pair.
>Enter file in which to save the key (/c/Users/ZHD/.ssh/id_rsa): // 默认按三个回车
>Enter passphrase (empty for no passphrase):
>Enter same passphrase again:
>Your identification has been saved in /c/Users/ZHD/.ssh/id_rsa
>Your public key has been saved in /c/Users/ZHD/.ssh/id_rsa.pub
>The key fingerprint is:
>SHA256:QJMay9znrHjHPfkMCY6lqtzSO8CxGiaS5FtVufaIJ9A 1603527940@qq.com
>The key's randomart image is:
>+---[RSA 3072]----+
>| o.. |
>| ...+ |
>| o.=o . |
>| ...=E.+. |
>|oo oo o+S |
>|=o+. o Boo . |
>|+ooo .=o..o. |
>|.o..+.o o +o |
>| oo++ . oo |
>+----[SHA256]-----+
>```
- 打开id_rsa.pub文件,对立面的内容进行复制操作
- 打开github账号,找到settings->ssh and GPG keys
- 生成密钥之后就可以正常进行push操作了
- 在本地库中为ssh地址取别名
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git remote add origin_ssh git@github.com:ZhongAlexMrD/GitRepository.git
>--------------------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git remote -v
>--------------------------------------------------------------------
>origin https://github.com/ZhongAlexMrD/GitRepository.git (fetch)
>origin https://github.com/ZhongAlexMrD/GitRepository.git (push)
>origin_ssh git@github.com:ZhongAlexMrD/GitRepository.git (fetch)
>origin_ssh git@github.com:ZhongAlexMrD/GitRepository.git (push)
>```
- 下面测试一下
- 创建文件test100.txt
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ touch test100.txt
>```
- 提交远程库
>```bash
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git add .
>------------------------------------------------------
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git commit -m "创建文件test100.txt"
>------------------------------------------------------
>[master 767bd85] 创建文件test100.txt
> 1 file changed, 0 insertions(+), 0 deletions(-)
> create mode 100644 test100.txt
>
>ZHD@LAPTOP-PQIEGIQ8 MINGW64 /GitRepository (master)
>$ git push origin_ssh master
>------------------------------------------------------
>The authenticity of host 'github.com (20.205.243.166)' can't be established.
>ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
>This host key is known by the following other names/addresses:
> ~/.ssh/known_hosts:1: git.zhlh6.cn
>Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
>Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
>Enumerating objects: 3, done.
>Counting objects: 100% (3/3), done.
>Delta compression using up to 12 threads
>Compressing objects: 100% (2/2), done.
>Writing objects: 100% (2/2), 252 bytes | 252.00 KiB/s, done.
>Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
>remote: Resolving deltas: 100% (1/1), completed with 1 local object.
>To github.com:ZhongAlexMrD/GitRepository.git
> 425cd90..767bd85 master -> master
>```
**ssh的优点**: 不用每次提交都输入密码
**ssh的缺点**:只能针对一个账户
# IDEA、Eclipse或者VS Code集成Git
这个比较简单,详情自行百度
可参考 https://blog.csdn.net/kuailexiaomeng/article/details/99604799
视频链接:https://www.bilibili.com/video/BV1go4y1D7Gd?p=29&spm_id_from=pageDriver