1. Git基础概念
概况
团队协作:
签名
作用:区分每个分支的用户
优先级:
- 系统签名相当于全局变量:设置一次,永诀后患
- 项目签名相当于局部变量
项目签名 (只在当前项目 可以用)
git config user.name xxxgit config user.email xxx.xxx
系统签名 (在本地电脑 哪里都可以用) ```bash git config —global user.name xxx git config —global user.email xxx.xxx
查看签名
git config —list
- 使用密钥登录(push/pull免密码登录)参考:[https://www.cnblogs.com/shoshana-kong/p/10994889.html](https://www.cnblogs.com/shoshana-kong/p/10994889.html)<a name="pAyp3"></a>## 本地3巨头<a name="IV3zi"></a># <a name="KEUIN"></a># 2. 本地基本命令<a name="3d7kR"></a>## 工作区/库的状态- 查看“工作区”的状态:`git status`- **查看“本地库”历史记录**`git log` :完整显示<br />`git log --pretty=oneline` :一行显示<br />`git log --oneline` :一行简化显示**(只能显示HEAD指针后面的版本)**<br />`git reflog` :一行简化显示,**并显示恢复步数 (能显示所有的历史记录)**<a name="44Oaz"></a>## 修改[add]-提交[commit]- 将工作区的“**新建/修改**”**添加** 到 暂存区- 将暂存区的内容 **提交** 到 本地库```bashgit add file或--all //添加(修改的/新)文件git commit -m 'commit tag' file //正式 提交 修改 到缓存区,并提交说明Tag;//补充:git rm --cached file //删除 添加的文件git checkout -- file //取消 修改
- 清除本地修改
(1)在未发生任何add或commit的情况下:git checkout . 这条命令,只能清除所有修改的文件,但是新建的文件和文件夹无法清除,还必须使用:git clean -df 清除所有新建的文件及文件夹
(2)对于add的部分,先要撤销add:git reset . ,然后再进行第一步的操作即可
- 修改commit信息
# 修改最近一次的commit信息git commit --amend(之后进入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
删除所有存储的进度。
<a name="kj8OO"></a>## 版本前进后退- 任意的**恢复到以前的版本**,或者**回到现在的版本**- **包括“找回删除文件”,恢复某个修改文件****reset 三个参数:**- --soft 仅仅在本地库,**移动HEAD指针 **- --mixed 移动本地库HEAD指针、**重置暂存区**- --hard 移动本地库HEAD指针、重置暂存区、**重置工作区**```bashgit reflog //查看历史版本git reset --hard 索引值 //恢复补充:git reset --hard HEAD^ //只能从HEAD后退,一个^退一步git reset --hard HEAD~3 //表示从HEAD后退3步
比价文件差异(修改)
- 和 暂存区 比较
- 和 本地库中某版本 比较 ```bash git diff file //工作区 和 暂存区(上次commit)比较
git diff [本地库中某个版本(HEAD/ HEAD^/ HEAD~3/ 索引)] file
//注意: //红色表删除,绿色表增加 //不带文件名,则比较多个文件

<a name="BTSzk"></a>
# 3. 分支
- 同时推进多个功能开发
- 某一分支出错,不影响其他分支

<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 />
<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
解决冲突
若两个分支同一个地方都修改了,那么合并时要人工修改 ( 即自动合并失败 )
- 合并分支,可能冲突。
- 人工修改:直接删除不需要的东西(包括特殊符号)
- 修改后:
```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. 远程库管理

远程库
// 查看远程库
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
作用:
- 完整的下载了远程库 到本地
- 创建origin(远程库别名)
- 初始化 本地库(master)
注意:
- 团队成员 需要 远程库所有者 __邀请后,才能 Push
- 如何邀请?Repositories->Setting->Collaborators
补充:
// 克隆指定的分支
git clone -b 分支名仓库地址
Fetch
git fetch origin master
注意:此时本地文件没有更改!!
git checkout origin/master
切换分支可查看
git checkout master
切换到本地库master分支git merge origin/master
把远程库master分支,和本地库的自己的master分支合并
Pull
Pull同时完成fetch和merge?git pull origin master
- 协同开发的冲突
若一人push了远程库,另外一人也push时,若不是在远程库最新版的基础上做的修改再push,那么push会失败
所以:
- 先拉取fetch/pull远程库的最新状态
- 本地合并修改:
- 解决冲突(人工修改文件内容)
- add
- commit
- 推送push
