git1-学习笔记
1,git基础
1-0,浏览器查看命令用法-help
git help --web 命令
1-1,配置用户名和邮箱-config
git config --global user.name 'your_name'
git config --global user.email 'your_email@domain.com'
git config --local 只对某个仓库有效
git config --global 对当前用户所有仓库有效
git config --system 对系统所有登陆的用户有效
缺省等同 --local
显示config的配置,加--list
git config --list --local
git config --list --global
git config --list --system
对应./git/config文件
1-2,创建git仓库-init
- 将已有的项目代码纳入git管理
cd 项目代码所在的路径
git init
- 使用git直接新建一个项目
cd 某个路径
git init project #会在当前路径下创建和project同名的文件夹
cd project
1-3,提交,查看/修改信息-add status commit log
- 正确的工作流程:不断add将文件添加到暂存区,形成一个合适的文件集合后commit到本地仓库
git add * #将工作区文件提交到暂存区
git add -u #将已经跟踪的文件提交到暂存区
git status #查看暂存区的状态
git commit -m'***' #将暂存区文件提交到本地仓库
git commit --amend #对所在分支最近的一次提交的信息做修改
git log #查看提交到本地仓库的历史信息
git log --oneline #显示历史简介信息
git log -n* #显示最近的*个commit信息
git log 分支名 #显示某个分支的信息
git log --all #查看所有分支历史信息
git log --all --graph #图形化显示分支的演进过程
git log --oneline --all -n4 --graph
git log --oneline master -n4 --graph
1-4,恢复-reset-checkout
- 暂存区恢复到和HEAD(当前分支最新的commit)一致、工作区恢复到和暂存区一致、
git reset HEAD #暂存区恢复到和HEAD一致(全部文件)
git diff --cached #查看暂存区和HEAD的区别
git reset HEAD -- filename1 filename2 #将对应的暂存区文件恢复到和HEAD一致
git status
git reset --hard log中某commit对应的哈希值 #丢弃该commit之后的commit,HEAD、暂存区、工作区都变更为此commit对应的内容
git checkout -- filename #将对应的工作区文件恢复到和暂存区一致
git diff filename #查看文件在工作区和暂存区一致
1-5,分支-branch-checkout
git branch -v #查看本地有多少分支
git branch -av #查看所有分支,包括关联的远程仓库的
git branch -d/D 分支名 #删除分支
git checkout -b 新分支名 log中的哈希值 #基于当前分支log哈希值对应的历史数据创建新分支,并且跳转到新分支
git checkout -b 新分支名 旧分支名 #基于旧分支创建新分支
git checkout 分支名 #分支跳转(对应./git/HEAD)
1-6,图形界面工具-gitk
gitk #可以看一看项目树结构
gitk --all
1-7,文件重命名-mv
- 方法一
文件改名
git add 新文件名
git rm 旧文件名
git commit -m''
- 方法二
git mv 旧文件名 新文件名 #该命令将工作区和暂存区文件同时重命名
git commit -m''
1-8,文件删除-rm
git rm filename #该命令将工作区和暂存区文件同时删除
git commit -m''
1-9,查看哈希值对应的内容-cat-file
git cat-file -p 哈希值 #查看哈希值对应对象的内容
git cat-file -t 哈希值 #查看哈希值对应对象的类别
1-10,指定不需要git管理的文件
编写 .gitignore 文件
2,场景使用-单人
2-1,调整commit-rebase
- 先切换到需要rebase的分支
2-1-1,修改任意一次commit的提交
git rebase -i 被改变commit的父节点的id号 #交互模式进行变基操作(注意该命令最好是在自己的分支做变更,如果是已经贡献到集成分支上就不要随意变基)
修改对应操作符为r
2-1-2,将连续的多个commit整理成1个
git rebase -i 合并范围首commit的父节点的id号
修改对应操作符为s
2-1-3,将不连续的多个commit整理成1个
git rebase -i 合并范围首commit的父节点的id号(如果首节点就是分支的起始节点,此时没有父节点;可以使用首节点的id,并自行添加pick 首节点id)
将需要合并的多个commit移动到连续的一块,并修改对应操作符为s
git status
git rebase --continue
2-1-4,基于远程其他分支进行rebase
git rebase 远程仓库名/分支名
2-2,比较差异-diff
2-2-1,比较工作区和暂存区所含文件的差异
git diff
git diff -- 文件名
2-2-2,比较暂存区和HEAD所含文件的差异
git diff --cached
2-2-3,比较两次commit(同一分支)的差异
git diff 哈希值1 哈希值2
git diff HEAD HEAD^
git diff HEAD HEAD^^
2-2-4,比较两个HEAD(不同分支)的差异
git diff HEAD1 HEAD2 #将所有文件的差异都显示出来
git diff HEAD1 HEAD2 --filename #只显示指定文件的差异
2-3,遇到紧急开发任务,需要暂存工作区和暂存区的内容-stash
- 遇到紧急开发任务,需要暂存工作区和暂存区的内容,切换到紧急任务;任务完成后,需要恢复暂存的工作区和暂存区内容
git stash #将当前工作区和暂存区的内容存放到一个类似堆栈的结构中
git stash list #查看暂存
git stash apply #恢复到暂时存放的内容,暂时存放的内容依然保留在堆栈结构中
git stash pop #恢复到暂时存放的内容,堆栈中暂时存放的内容被删除了
2-4,git仓库本地备份
2-4-1,常用的传输协议:
- 本地协议1-哑协议:
/path/to/repo.git
- 本地协议2-智能协议:
file:///path/to/repo.git
- http/https协议-平时接触到的都是智能协议:
http://git-server.com:port/path/to/repo.git
https://git-server.com:port/path/to/repo.git
- ssh协议-工作中最常用的智能协议:
user@git-server.com:path/to/repo.git
- 哑协议和智能协议对比:
- 直观区别:哑协议传输进度不可见,智能协议传输可见
- 传输速度:智能协议比哑协议传输速度快
2-4-2,本地备份方法-clone-push
- 本地备份的方法1-处于备份仓库时-clone
- 在本地创建文件夹(如gitBackup),作为本地备份仓库
- 终端cd入本地备份仓库,执行
git clone --bare 原仓库地址/.git 备份名.git
会发现在本地备份仓库地址下出现了一个备份名.git文件夹- 智能协议:
git clone --bare file://原仓库地址/.git 备份名.git
- 智能协议:
- 本地备份的方法2-处于被备份仓库时-remote-push
git remote -v
查看关联的远端仓库git remote add 远端仓库名 file://原仓库地址/备份名.git
git push 远端仓库名
2-5,git与github同步
2-5-1,建立ssh连接(终端使用git bash)
- 检查现有ssh密钥
ls -al ~/.ssh
- 生成新的ssh密钥(保存路径和密码都直接回车)
ssh-keygen -t ed25519 -C "your_email@example.com"
- 添加新的ssh密钥(添加前可以通过检查现有ssh密钥中的方法获取公钥内容,windows就保存在
C:\Users\用户\.ssh\***.pub
)
clip < ~/.ssh/id_ed25519.pub
- 测试ssh连接
ssh -T git@github.com
- github连接报"ssh: connect to host github.com port 22: Connection timed out"错误
在存放公钥私钥(id_rsa和id_rsa.pub)的文件里,新建config文本,内容如下:
Host github.com
User YourEmail@163.com
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443
重复测试ssh连接
2-5-2,关联远程仓库
git remote add 远程仓库名 GitHub仓库提供的ssh远程连接地址
git remote -v
查看关联的远程仓库有哪些
2-5-3,上传
git push 远程仓库名
将当前分支上传上去git push 远程仓库名 远程分支名
将当前分支上传到远程仓库分支git push 远程仓库名 --all
将所有分支都上传上去
2-5-4,下载
git fetch 远程仓库名 分支名(可选)
只是将文件下载下来git pull 远程仓库名 分支名(可选)
将文件下载下来并merge(=fetch+merge)git clone URL 文件名
将github上的项目整体下载下来(不用配置远程仓库)- clone后需要
git config --add ...
进行用户名和邮箱的设置
- clone后需要
2-5-5,有时候从github仓库下载下来文件后,再push会报错-merge
- 这是因为github仓库中有超前本地版本的文件,此时用
gitk --all
也会看到github远程仓库对应的分支在本地仓库的分支前面,并且会发现github仓库中的文件并没有下载下来。 - 解决方法1-merge:在本地仓库的某分支执行命令
git merge 远程仓库名/分支名
- merge后会发现文件下载下来了,并且
gitk --all
会发现本地仓库的某分支与github远程仓库的分支都处于最前。 - 如果报错 fatal: refusing to merge unrelated histories https://developer.aliyun.com/article/614459:
git merge 远程仓库名/分支名 --allow-unrelated-histories
- merge后会发现文件下载下来了,并且
3,场景使用-多人
3-1,不同人修改了不同文件
- 此时非fast-forward的push会报错,但是git有能力自动merge
- 解决方法:
- 与2-5-4&2-5-5的类似,
fetch & merge
(直接pull是一样的)
- 与2-5-4&2-5-5的类似,
3-2,不同人修改了相同文件的不同区域
- 此时git依旧有能力自动merge,方法同3-1。
3-3,不同人修改了相同文件的相同区域
- 此时git没有能力自动merge了,需要人工介入,此时pull也会提示
CONFLICT (content)
- 解决方法:
- pull以后,修改发生冲突的文件,沟通调整好后将git自动生成的标记语句删除
- git commit
- git push
3-4.不同人将同一个文件改为不同的文件名
- 此时git没有能力自动merge了,需要人工介入,此时pull也会提示
CONFLICT (rename)
- 解决方法:
- pull以后,根据status的提示,rm/add文件(rm掉不要的,add需要保留的,这个需要具体协商)
- git commit
- git push
行动是治愈恐惧的良药,而犹豫拖延将不断滋养恐惧。