1. Git基础概念

概况

团队协作:
img_0179.png

签名

作用:区分每个分支的用户
优先级:

  1. 系统签名相当于全局变量:设置一次,永诀后患
  2. 项目签名相当于局部变量
  • 项目签名 (只在当前项目 可以用)

    1. git config user.name xxx
    2. git config user.email xxx.xxx
  • 系统签名 (在本地电脑 哪里都可以用) ```bash git config —global user.name xxx git config —global user.email xxx.xxx

查看签名

git config —list

  1. - 使用密钥登录(push/pull免密码登录)
  2. 参考:[https://www.cnblogs.com/shoshana-kong/p/10994889.html](https://www.cnblogs.com/shoshana-kong/p/10994889.html)
  3. <a name="pAyp3"></a>
  4. ## 本地3巨头
  5. <a name="IV3zi"></a>
  6. # ![fullsizerender(3).jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/263367/1584365632342-c33444ba-cdcd-491b-a1ab-2306ee4890a7.jpeg#crop=0&crop=0&crop=1&crop=1&height=290&id=UOzCo&name=fullsizerender%283%29.jpg&originHeight=857&originWidth=1045&originalType=binary&ratio=1&rotation=0&showTitle=false&size=75079&status=done&style=none&title=&width=354)
  7. <a name="KEUIN"></a>
  8. # 2. 本地基本命令
  9. <a name="3d7kR"></a>
  10. ## 工作区/库的状态
  11. - 查看“工作区”的状态:`git status`
  12. - **查看“本地库”历史记录**
  13. `git log` :完整显示<br />`git log --pretty=oneline` :一行显示<br />`git log --oneline` :一行简化显示**(只能显示HEAD指针后面的版本)**<br />`git reflog` :一行简化显示,**并显示恢复步数 (能显示所有的历史记录)**
  14. <a name="44Oaz"></a>
  15. ## 修改[add]-提交[commit]
  16. - 将工作区的“**新建/修改**”**添加** 暂存区
  17. - 将暂存区的内容 **提交** 本地库
  18. ```bash
  19. git add file或--all //添加(修改的/新)文件
  20. git commit -m 'commit tag' file //正式 提交 修改 到缓存区,并提交说明Tag;
  21. //补充:
  22. git rm --cached file //删除 添加的文件
  23. git checkout -- file //取消 修改


  • 清除本地修改

(1)在未发生任何add或commit的情况下:
git checkout . 这条命令,只能清除所有修改的文件,但是新建的文件和文件夹无法清除,还必须使用:
git clean -df 清除所有新建的文件及文件夹
(2)对于add的部分,先要撤销add:git reset . ,然后再进行第一步的操作即可

  • 修改commit信息
    1. # 修改最近一次的commit信息
    2. git commit --amend
    3. (之后进入vim模式,直接删除原来的commit信息即可)

    藏匿修改[stash]

    ```bash git stash

    保存当前工作进度,会把暂存区和工作区的改动保存起来。

    执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有任何改动。

    使用git stash save ‘message…’可以添加一些注释

git stash list

显示保存进度的列表。

git stash pop [–index] [stash_id] git stash pop 恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。 git stash pop —index 恢复最新的进度到工作区和暂存区。(尝试将原来暂存区的改动还恢复到暂存区) git stash pop stash@{1}恢复指定的进度到工作区。stash_id是通过git stash list命令得到的

通过git stash pop命令恢复进度后,会删除当前进度。

git stash apply [–index] [stash_id]

除了不删除恢复的进度之外,其余和git stash pop 命令一样。

git stash drop [stash_id]

删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度。

git stash clear

删除所有存储的进度。

  1. <a name="kj8OO"></a>
  2. ## 版本前进后退
  3. - 任意的**恢复到以前的版本**,或者**回到现在的版本**
  4. - **包括“找回删除文件”,恢复某个修改文件**
  5. ![fullsizerender(4).jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/263367/1584365626937-647ed4e2-0ff3-4759-b84c-2d3b91effd4f.jpeg#crop=0&crop=0&crop=1&crop=1&height=632&id=URWK8&name=fullsizerender%284%29.jpg&originHeight=632&originWidth=1302&originalType=binary&ratio=1&rotation=0&showTitle=false&size=224970&status=done&style=none&title=&width=1302)
  6. **reset 三个参数:**
  7. - --soft 仅仅在本地库,**移动HEAD指针 **
  8. - --mixed 移动本地库HEAD指针、**重置暂存区**
  9. - --hard 移动本地库HEAD指针、重置暂存区、**重置工作区**
  10. ```bash
  11. git reflog //查看历史版本
  12. git reset --hard 索引值 //恢复
  13. 补充:
  14. git reset --hard HEAD^ //只能从HEAD后退,一个^退一步
  15. git reset --hard HEAD~3 //表示从HEAD后退3步

比价文件差异(修改)

  • 和 暂存区 比较
  • 和 本地库中某版本 比较 ```bash git diff file //工作区 和 暂存区(上次commit)比较

git diff [本地库中某个版本(HEAD/ HEAD^/ HEAD~3/ 索引)] file

//注意: //红色表删除,绿色表增加 //不带文件名,则比较多个文件

![fullsizerender(6).jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/263367/1584365508866-6bd90a08-f5f8-4ca5-b264-6b9ff1c46b71.jpeg#crop=0&crop=0&crop=1&crop=1&height=262&id=RHpSF&name=fullsizerender%286%29.jpg&originHeight=450&originWidth=932&originalType=binary&ratio=1&rotation=0&showTitle=false&size=151989&status=done&style=none&title=&width=542)


<a name="BTSzk"></a>
# 3. 分支

- 同时推进多个功能开发
- 某一分支出错,不影响其他分支

![fullsizerender(5).jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/263367/1584365549815-a61c2b23-ad72-4265-8713-5fac42c0e913.jpeg#crop=0&crop=0&crop=1&crop=1&height=244&id=EIKG3&name=fullsizerender%285%29.jpg&originHeight=470&originWidth=1158&originalType=binary&ratio=1&rotation=0&showTitle=false&size=172083&status=done&style=none&title=&width=600)

<a name="0lG7y"></a>
## 创建分支
git branch [分支名]

2、根据已有分支创建新的分支<br />例子:git checkout -b yourbranchname origin/oldbranchname
<a name="wCsZq"></a>
## 查看分支
git branch -v<br />补充:<br />**git branch -a(查看所有分支包括本地分支和远程分支).**<br />**git branch -r(查看远程分支).**
<a name="tAeTx"></a>
## 切换分支
git checkout [分支名]<br />![fullsizerender(7).jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/263367/1584365445272-28bf76ab-df8e-4c48-9a53-1fd75abe9d2f.jpeg#crop=0&crop=0&crop=1&crop=1&height=406&id=eDCnA&name=fullsizerender%287%29.jpg&originHeight=885&originWidth=1332&originalType=binary&ratio=1&rotation=0&showTitle=false&size=610312&status=done&style=none&title=&width=611)
<a name="ZgPpe"></a>
## 合并分支

1. git checkout [分支名] : 切换到接受合并的分支(一般是master)上
1. git merge [另一个分支名]

<a name="hap9e"></a>
### 合并两个独立仓库的历史
> 情况:fatal: refusing to merge unrelated histories

```bash
git merge origin/master --allow-unrelated-histories

解决冲突

若两个分支同一个地方都修改了,那么合并时要人工修改 ( 即自动合并失败 )

  1. 合并分支,可能冲突。
  2. 人工修改:直接删除不需要的东西(包括特殊符号)
  3. 修改后: ```bash git add git commit -m “merge tag” // 注意这里不能带文件名,还要带上修改信息

// 至此完成合并


总结:合并分支时,git 做的是,把两个分支 **不同的文件内容** 用 **特殊符号标记** 显示,若能自动合并则自动合并了,否则需要人工修改这些文件。



<a name="tBjlT"></a>
## [修改分支名]

- 修改本地分支名

`git branch -m oldName newName `

- 修改远程分支名
```bash
# a. 重命名远程分支对应的本地分支
git branch -m oldName newName

# b. 删除远程分支
git push --delete origin oldName

# c. 上传新命名的本地分支
git push origin newName

# d.把修改后的本地分支与远程分支关联
git branch --set-upstream-to origin/newName

删除分支

// delete branch locally
git branch -d localBranchName

// delete branch remotely
git push origin --delete remoteBranchName

4. 远程库管理

img_0178.png

远程库

// 查看远程库
git remote -v
// 添加远程库
git remote add [远程库的别名(一般是origin)] https://github.xxxx.xxx.git

// 重置远程库
git remote set-url origin “新的仓库链接”  //可更新远程仓库的 url。
// 删除远程库
git remote rm 远程库的别名

Push

将 本地库 推送到 远程库
git push -u [远程库别名] [本地库分支名(一般是master)]

Clone

git clone https://github.xxxx.xxx.git
作用:

  1. 完整的下载了远程库 到本地
  2. 创建origin(远程库别名)
  3. 初始化 本地库(master)

注意:

  • 团队成需要 远程库所有者 __邀请后,才能 Push
  • 如何邀请?Repositories->Setting->Collaborators

补充:

// 克隆指定的分支
git clone -b 分支名仓库地址

Fetch

  1. git fetch origin master

注意:此时本地文件没有更改!!

  1. git checkout origin/master

切换分支可查看

  1. git checkout master

切换到本地库master分支
git merge origin/master
把远程库master分支,和本地库的自己的master分支合并

Pull

Pull同时完成fetch和merge?
git pull origin master

  • 协同开发的冲突

若一人push了远程库,另外一人也push时,若不是在远程库最新版的基础上做的修改再push,那么push会失败
所以:

  1. 先拉取fetch/pull远程库的最新状态
  2. 本地合并修改:
    • 解决冲突(人工修改文件内容)
    • add
    • commit
  3. 推送push